using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using FlexGrid = AxMSHierarchicalFlexGridLib.AxMSHFlexGrid;
using ljs;

using System.IO;
using System.Reflection;

namespace ljs.MyClass.Menu
{
	/// <summary>
	/// RightMenu 网格菜单方法及过程。
	/// </summary>
	public class RightMenu
	{
		private FlexGrid m_CaptionSource;
		private FlexGrid m_GridSource;



		public FlexGrid SetGridSource 
		{
			set { m_GridSource=value;}
		}
		public FlexGrid SetCaptionSource
		{
			set { m_CaptionSource=value;}
		}
		
		public RightMenu()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		//删除网格行
		public void RowDel()
		{
	
			try
			{
				int lngRows;//     '选定行数
				int lngStarRow;//;   '起始行
			   if (m_GridSource.Rows < 2) { return;}
				lngStarRow = m_GridSource.Row;
				if (m_GridSource.RowSel < lngStarRow)
				{
					lngStarRow = m_GridSource.RowSel;
				}
				lngRows = m_GridSource.Row - m_GridSource.RowSel;
				if (lngRows<0) {lngRows=0-lngRows;}
				
				if (lngRows==0)
				{
					m_GridSource.RemoveItem(lngStarRow);
					return;
				}

				lngRows=lngRows+1
					;
				////			'网格从（0，0）开始
				for (int lngRowIndex = lngRows;lngRowIndex>0;lngRowIndex--)
				{
					m_GridSource.RemoveItem(lngRowIndex + lngStarRow);
				}
			}
			catch
			{
			
			}

		}

		/// <summary>
		/// 插入行。
		/// </summary>
		public void RowAdd()
		{
			try
			{
				m_GridSource.AddItem("",m_GridSource.Row);
				//强制设置行高不让等于零
				m_GridSource.set_RowHeight(m_GridSource.Row, m_GridSource.get_RowHeight(1));
				m_GridSource.set_RowHeight(m_GridSource.Row + 1, m_GridSource.get_RowHeight(1));
			}
			catch
			{
			
			}
		}

		/// <summary>
		/// 插入多行行。
		/// </summary>
		public void RowsAdd()
		{
			for (int r=0;r<5;r++)
			{
			RowAdd();
			}

			//			Dim n As Long
			//			Dim i As Long
			//			n = Val(InputBox("请输入增加的行数:"))
		}
		/// <summary>
		/// 列排序。
		/// </summary>
		public void ColSort(short SortType)
		{
			//'常数 值 描述
			//'flexSortNone 0 无。不执行排序。
			//'flexSortGenericAscending       1 一般升序。执行估计文本不管是字符串或者是数字的升序排序。
			//'flexSortGenericDescending      2 一般降序。执行估计文本不管是字符串或者是数字的降序排序。
			//'flexSortNumericAscending       3 数值升序。执行将字符串转换为数值的升序排序。
			//'flexSortNumericDescending      4 数值降序。执行将字符串转换为数值的降序排序。
			//'flexSortStringNoCaseAsending   5 字符串升序。执行不区分字符串大小写比较的升序排序。
			//'flexSortNoCaseDescending       6 字符串降序。执行不区分字符串大小写比较的降序排序。
			//'flexSortStringAscending        7 字符串升序。执行区分字符串大小写比较的升序排序。
			//'flexSortStringDescending       8 字符串降序。执行区分字符串大小写比较的降序排序。
			//'flexSortCustom                 9 自定义。使用 Compare 事件比较行。

			m_GridSource.Redraw = false;
			m_GridSource.Row = 1;
			m_GridSource.RowSel = m_GridSource.Rows - 2;
			m_GridSource.Col = m_GridSource.Col;
			m_GridSource.Sort = SortType;
			m_GridSource.Redraw = true;


		}

		/// <summary>
		///'取消列宽为零的设置。
		/// </summary>
		//	
		public void ColAllShow()
		{
			for (int i = 1 ;i< m_GridSource.get_Cols(0);i++)
			{
				if ( m_GridSource.get_ColWidth(i,0) == 0)
				{
					m_GridSource.set_ColWidth(i,0, 567);

					m_CaptionSource.set_ColWidth(i,0, 567);
				}
			}
		}
		/// <summary>
		///自动设置列宽。由于速度问题只判断第0 1行
		/// </summary>
		public void ColWidthAuto()
		{
			int j ;
			int k ;
			string  strTempText ;
			int cs=m_GridSource.get_Cols(0);
			for (int c = 1;c<cs;c++)
			{
				k = m_GridSource.get_TextMatrix(0, c).Length;
				j = m_GridSource.get_TextMatrix(1, c).Length;
				strTempText=m_GridSource.get_TextMatrix(1, c);
				if (k<j) k=j;
				if (strTempText.Trim()!="" && Char.IsNumber(strTempText,0)) // '判断网格列中内容是数字
				{
					m_GridSource.set_ColWidth(c,0, k *100+50);
				}
				else
				{
					m_GridSource.set_ColWidth(c,0, k * 200+50);
				}

			}


//			for (int C = 1;C<m_GridSource.get_Cols(0);C++)
//			{
//				k = m_GridSource.get_TextMatrix(0, C).Length;
//
//				strTempText =m_GridSource.get_TextMatrix(0, C).Trim();
//			
//				for (int i = 1;i<m_GridSource.Rows ;i++)
//				{
//					j =m_GridSource.get_TextMatrix(i, C).Length;
//
//
//					if (j > k )
//					{
//						k = j ;//'判断网格列中最长的行;
//						strTempText = m_GridSource.get_TextMatrix(i, C).Trim();
//					}
//					m_GridSource.set_ColWidth(i,C, k * 200);

//					if (Char.IsNumber(strTempText,strTempText.Length)) // '判断网格列中内容是数字
//					{
//						m_GridSource.set_ColWidth(C,0, k * 200 / 2 + 200);
//					}
//					else
//					{
//						m_GridSource.set_ColWidth(C,0, k * 200 + 100);
//					}
//
//					m_CaptionSource.set_ColWidth(C,0,m_GridSource.get_ColWidth(C,0));
//				}
//			}
		}
		/// <summary>
		///在可视区域内平均列宽。
		/// </summary>
		public void ColWidthAvg()
		{

			int lngVisibleCol=0;//可见列数
			for (int c = 1 ;c< m_GridSource.get_Cols(0);c++)
			{
				if (m_GridSource.get_ColWidth(c,0)!= 0)
				{
					lngVisibleCol+=1;
				}
			}
			for (int i = 1; i<m_GridSource.get_Cols(0) ;i++)
			{
				if (m_GridSource.get_ColWidth(i,0) != 0)
				{
					m_GridSource.set_ColWidth(i,0,(m_GridSource.Width - m_GridSource.get_ColWidth(0,0) - (30 * m_GridSource.get_Cols(0))) / (lngVisibleCol - 1));
				}
				m_CaptionSource.set_ColWidth(i,0,m_GridSource.get_ColWidth(i,0));
			}
		}
//		public void ColWidth()
//		{
//			//Dim lngColWidth As Long
//			//Dim strTemp As String
//			//'On Error Resume Next
//			//    strTemp = InputBox("请输入第" & RTrim(GridEdit.Col) & "列宽数值：", "列宽设置", GridEdit.ColWidth(GridEdit.Col))
//			//    If strTemp = "" Then Exit Sub
//			//    lngColWidth = Val(strTemp)
//			//   If lngColWidth <> GridEdit.ColWidth(GridEdit.Col) Then
//			//        GridEdit.ColWidth(GridEdit.Col) = lngColWidth
//			//        GridCaption.ColWidth(GridEdit.Col) = GridEdit.ColWidth(GridEdit.Col)
//			//   End If
//			//
//
//		}
		/// <summary>
		///清空选定的单元格。
		/// </summary>
		public void GridClear()
		{
			//'ClearGridSelColText  清空网格指定列（部分/全部）文本
			//'ClearGridSelAreaText 清空网格选定区域全部文本
			int lngRows;//  '选定行数
			int lngCols;// '选定列数
			int lngStarRow; //  '起始行
			int lngStarCol; //  '起始列
			//
			lngStarRow = m_GridSource.Row;
			if (m_GridSource.RowSel < lngStarRow)
			{
				lngStarRow = m_GridSource.RowSel;
			}
			
			lngStarCol = m_GridSource.Col;
			if (m_GridSource.ColSel < lngStarCol)
			{
				lngStarCol = m_GridSource.ColSel;
			}

			lngRows = Math.Abs(m_GridSource.Row - m_GridSource.RowSel) + 1;
			lngCols = Math.Abs(m_GridSource.Col - m_GridSource.ColSel) + 1;
			//			'网格从（0，0）开始
			for (int r = 0 ;r<lngRows;r++)
			{
				for (int c = 0; c<lngCols;c++)
				{
					m_GridSource.set_TextMatrix(r + lngStarRow, c + lngStarCol, "");
				}
			}

		}
		/// <summary>
		///数据另存。
		/// </summary>
		public void GridSaveAs()
		{
			string filename="";
//			CreateExcel(filename);
//
////			try{}
////			catch{}
////			finally{}
////			//将模板文件复制到一个新文件中
			SaveFileDialog mySave=new SaveFileDialog();
			mySave.Filter="Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*";
			if(mySave.ShowDialog()!=DialogResult.OK)
			{
				return;
			}
			else
			{
				filename=mySave.FileName;
				try
				{
					CreateExcel(filename);
				}
////				//将模板文件copy到新位置，建议实际开发时用相对路径，如
////				//Application.StartupPath.Trim()+"\\report\\normal.xls"
////				string filenameold=mySave.FileName;
////				FileInfo mode=new FileInfo("d:\\normal.xls");
////				try
////				{
////					mode.CopyTo(filename,true);
////				}
				catch(Exception ee)
				{
					MessageBox.Show(ee.Message);
					return;

				}
			}
		}
		//普通报表，即单纯的文件导出功能

		private void CreateExcel(string p_FileName)

		{
           

			//创建一个Excel文件
			Excel.Application myExcel = new Excel.Application ( ) ;
			myExcel.Application.Workbooks.Add ( true ) ;

			Excel.Workbook myBook=myExcel.Workbooks[1];
			Excel.Worksheet mySheet=(Excel.Worksheet)myBook.Worksheets[1];

			//让Excel文件可见
			myExcel.Visible=false;
			myExcel.DisplayAlerts =false;
			
//			//第一行为报表名称
//			mySheet.Cells[1,4]="导出的数据";
			//逐行写入数据，
             int cs=m_GridSource.get_Cols(0);
             int rs=m_GridSource.Rows;
			for(int i=0;i<rs ;i++)
			{
				for(int j=0;j<cs;j++)
				{
					// 以单引号开头，表示该单元格为纯文本   在Excel中，如果某单元格以单引号“’”开头，表示该单元格为纯文本，因此，我们在每个单元格前面加单引号。
					mySheet.Cells[1+i,1+j]="'"+m_GridSource.get_TextMatrix(i,j);
				}
			}
			myExcel.ActiveWorkbook.SaveCopyAs(p_FileName); 
//			myExcel.SaveWorkspace(p_FileName);
////			myExcel.Save(p_FileName);
////          mySheet._SaveAs(p_FileName);
			myExcel.Quit();
			
			return;
		}

	
		/// <summary>
		///列隐藏。
		/// </summary>
		public void ColHide()
		{
			//			int i ;
			int lngCols;//     '选定列数
			int lngStarCol;//  '起始列
			lngStarCol = m_GridSource.Col;
			if (m_GridSource.ColSel < lngStarCol )
			{
				lngStarCol = m_GridSource.ColSel;
			
			}
			lngCols = Math.Abs(m_GridSource.Col - m_GridSource.ColSel) + 1;
			for (int i = lngStarCol;i< lngStarCol + lngCols;i++)
			{
				m_GridSource.set_ColWidth(i,0,0);
				m_CaptionSource.set_ColWidth(i,0,0);
			
			}

		}
	
         /// <summary>
         /// 计算选取网格区域的合计数
         /// </summary>
         /// <param name="m_GridSource"></param>
		public void ColRowSum()//FlexGrid m_GridSource
		{
			int lngRows;
			int lngCols;
			int lngStarRow ;
			int lngStarCol ;
            double dResult=0;
			double e=0;
			int c;
			int r;
			//选取网格区域时可能由下到上，因此总要求出最小的起始行列
			lngStarRow = m_GridSource.Row;
			if (m_GridSource.RowSel < lngStarRow)
			{
				lngStarRow = m_GridSource.RowSel;
			}
			lngStarCol = m_GridSource.Col;
			if (m_GridSource.ColSel < lngStarCol)
			{
				lngStarCol = m_GridSource.ColSel;
			}
			try
			{
				lngRows = System.Math.Abs(m_GridSource.Row - m_GridSource.RowSel) + 1;
				lngCols = System.Math.Abs(m_GridSource.Col - m_GridSource.ColSel) + 1;
				if (lngRows ==1 && lngCols > 1 ) 
				{
					for (c=0;c<lngCols;c++)
					{
						if (m_GridSource.get_TextMatrix(lngStarRow, c + lngStarCol)=="") 
						e=0;
						else
							e=double.Parse(m_GridSource.get_TextMatrix(lngStarRow, c + lngStarCol));
						dResult=dResult+e;
					}
					int cs=c + lngStarCol-1;
					MessageBox.Show ("在第[" +lngStarRow.ToString()+"]行中第[" +lngStarCol.ToString()+"]列到第["+cs.ToString()+"列]的合计数是：["+dResult.ToString ()+"]","提示",System.Windows.Forms.MessageBoxButtons.OK , System.Windows.Forms.MessageBoxIcon.Warning);
					return;
				}
				if (lngRows >1 && lngCols == 1 ) 
				{
					for (r=0;r<lngRows;r++)
					{
					if (m_GridSource.get_TextMatrix(lngStarRow+r,  lngStarCol)=="") 
								e=0;
						else
                            e=double.Parse(m_GridSource.get_TextMatrix(lngStarRow+r,  lngStarCol));
						dResult=dResult+e;
					}
					int rs=r + lngStarRow-1;
					MessageBox.Show ("在第[" +lngStarCol.ToString()+"]列中第[" +lngStarRow.ToString()+"]行到第["+rs.ToString()+"行]的合计数是：["+dResult.ToString ()+"]","提示",System.Windows.Forms.MessageBoxButtons.OK , System.Windows.Forms.MessageBoxIcon.Information);
				}
			}

			catch(Exception ee)
				{
					MessageBox.Show(ee.Message,"提示",System.Windows.Forms.MessageBoxButtons.OK , System.Windows.Forms.MessageBoxIcon.Warning);
					return;

				}


		}


	
		/// <summary>
		/// 拷贝剪切控件或网格选定区域文本
		/// blnCut  是否剪切
		/// </summary>
		/// <param name="blnCut"></param>
		public void GridAreaCopy(bool blnCut)
		{
			int lngRows;
			int lngCols;
			int lngStarRow ;
			int lngStarCol ;
			string strClipboard="" ;// '保存网格文本到系统剪切板 

						
			//选取网格区域时可能由下到上，因此总要求出最小的起始行列
			lngStarRow = m_GridSource.Row;
			if (m_GridSource.RowSel < lngStarRow)
			{
				lngStarRow = m_GridSource.RowSel;
			}
			lngStarCol = m_GridSource.Col;
			if (m_GridSource.ColSel < lngStarCol)
			{
				lngStarCol = m_GridSource.ColSel;
			}
			
			lngRows = System.Math.Abs(m_GridSource.Row - m_GridSource.RowSel) + 1;
			lngCols = System.Math.Abs(m_GridSource.Col - m_GridSource.ColSel) + 1;
			
			if (lngRows == 1 && lngCols == 1 )   //只选中一格,则直接连接系统剪切板
			{
				Clipboard.SetDataObject(m_GridSource.get_TextMatrix(m_GridSource.Row, m_GridSource.Col), true);
				if (blnCut)
				{
					m_GridSource.set_TextMatrix(m_GridSource.Row, m_GridSource.Col,"");

				}
			}
			else
			{
				for (int lngRowIndex = 0;lngRowIndex<lngRows;lngRowIndex++)
				{
					for (int lngColIndex = 0 ; lngColIndex<lngCols;lngColIndex++)
					{
						//	将数据复制到系统剪切板，并以Tab分开网格线
						if (lngColIndex == 0)
						{
							strClipboard = strClipboard + m_GridSource.get_TextMatrix(lngRowIndex + lngStarRow, lngColIndex + lngStarCol);
						}
						else
						{
							strClipboard = strClipboard +"\t"+ m_GridSource.get_TextMatrix(lngRowIndex + lngStarRow, lngColIndex + lngStarCol);
						}
						if (blnCut)
						{
							m_GridSource.set_TextMatrix(lngRowIndex + lngStarRow, lngColIndex + lngStarCol,"");
						}
					}
					strClipboard = strClipboard+"\r\n"; //换行    \n   换行符 0x000A

				}
				Clipboard.SetDataObject(strClipboard, true);
			}
		}
		//-个简单转义序列表示一个 Unicode 字符编码，详见下表。
		//	转义序列 字符名称 Unicode 编码 
		//	\'   单引号 0x0027
		//	\"    双引号 0x0022
		//	\\   反斜杠 0x005C
		//	\0   空 0x0000
		//	\a   警报 0x0007
		//	\b   退格符 0x0008
		//	\f   换页符 0x000C
		//	\n   换行符 0x000A
		//	\r   回车 0x000D
		//	\t   水平制表符 0x0009
		//	\v   垂直制表符 0x000B

	   /// <summary>
	   /// 得到剪贴板上的文本数据 并把结果放到二维数组中
	   /// </summary>
	   /// <returns></returns>
		public string[,] GetClipboardData()
		{
			string strClipboard="" ;
			string[,] sArray=null;
			//得到剪贴板上的文本数据
			IDataObject iData = Clipboard.GetDataObject();
			if(iData.GetDataPresent(DataFormats.Text)) 
			{
				strClipboard = (String)iData.GetData(DataFormats.Text); 
			}
			else 
			{
				return null;
			}
			try
			{
				//							s.Split(new char[3]{'c','d','e'});
				//解析\r\n个数确定行数
				string[] sArray1=System.Text.RegularExpressions.Regex.Split(strClipboard,"\r\n",System.Text.RegularExpressions.RegexOptions.IgnoreCase) ;
				int rs=sArray1.Length ;
				if (rs>1)  rs=rs-1;
				//解析\t个数确定列数
				string[] sArray2=System.Text.RegularExpressions.Regex.Split(sArray1[0],"\t",System.Text.RegularExpressions.RegexOptions.IgnoreCase) ;
				int  cs=sArray2.Length ;
				sArray=new string[rs,cs];
				//把结果放到二维数组中
				for (int r=0;r<rs;r++)
				{
					sArray2=System.Text.RegularExpressions.Regex.Split(sArray1[r],"\t",System.Text.RegularExpressions.RegexOptions.IgnoreCase) ;
					for (int c=0;c<cs;c++)
					{
						sArray[r,c]=sArray2[c];
					}
				}

			}
			catch(System.Exception ex)
			{
				System.Windows.Forms.MessageBox.Show(ex.Message,"提示",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Warning);
			}
			return sArray;
		}
		/// <summary>
		/// 网格选定区域粘贴
		/// </summary>
		/// <param name="m_GridSource"></param>
		public void GridAreaPaste()//FlexGrid m_GridSource
		{
//			int lngCurFind ;// '当前查找到的位置 '上一次查找到的位置 '临时截断数据长度 '临时截断数据 '剪切板列数 '剪切板行数(对Excel行列) '查找结束点 '查找起始点 '网格选定起始列 '网格选定起始行 '网格列指针 '网格行指针 '网格选定列数 '网格选定行数
			
			string[,] sArray=GetClipboardData();
			int Ars=sArray.GetUpperBound(0)+1;
			int Acs=sArray.GetUpperBound(1)+1;


		    int lngStarRow = m_GridSource.Row;
			if (m_GridSource.RowSel < lngStarRow) 
			{
				lngStarRow = m_GridSource.RowSel;
			}
			int lngStarCol = m_GridSource.Col;
			if (m_GridSource.ColSel < lngStarCol)
			{
				lngStarCol = m_GridSource.ColSel;
			}
			int rs = System.Math.Abs(m_GridSource.Row - m_GridSource.RowSel) + 1;
			int cs = System.Math.Abs(m_GridSource.Col - m_GridSource.ColSel) + 1;

			if (rs != sArray.GetUpperBound(0)+1 || cs!= sArray.GetUpperBound(1)+1)
			{
				MessageBox.Show ("无法粘贴信息，原因是复制区域与粘贴区域形状不同。要继续粘贴操作，请尝试：" +"\n"+ "* 单击某个单元格，然后重新粘贴。" +"\n"+ "* 选定一矩形区域，使该区域与源区域大小和形状完全一致，然后重新粘贴。","提示",System.Windows.Forms.MessageBoxButtons.OK , System.Windows.Forms.MessageBoxIcon.Warning);
				return;
			}
			for (int r=0;r<rs;r++)
			{
				for (int c=0;c<cs;c++)
				{
					m_GridSource.set_TextMatrix( lngStarRow+r, lngStarCol+c,sArray[r,c]);
				}
			}


		}



















	}
}
