You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

353 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.Core;
using Mesnac.Basic;
using System.Text.RegularExpressions;
using Mesnac.ActionService;
namespace Mesnac.Gui.Edit.Dialog
{
public partial class FrmEventAction : Form
{
private List<Mesnac.Controls.Base.DesignAction> _currentActionList = new List<Controls.Base.DesignAction>(); //当前控件的操作列表
public FrmEventAction()
{
InitializeComponent();
this.InitData(string.Empty);
this.InitUIMethod();
}
/// <summary>
/// 初始化界面元素
/// </summary>
public void InitUIMethod()
{
this.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmEventAction_Text")); //事件操作选择器
this.label1.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmEventAction_label1")); //当前选择
this.lblRemarkTitle.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmEventAction_lblRemarkTitle")); //备注信息
this.btnOk.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnOK")); //确定
this.btnCancel.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnCancel")); //取消
this.btnClear.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_btnClear")); //清除
}
public void InitData(string filter)
{
Mesnac.ActionService.Service.Instance.IniDesignAction(Mesnac.Gui.Edit.Global.AppConfigHandler.Instance.CurrentProjectWizardName + "/");
TreeNode root = new TreeNode();
root.Text = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_FrmEventAction_treeView1_rootText")); //"操作树";
this.IniTree(root, Mesnac.ActionService.Service.Instance.DesignActionTree, filter, false);
this.treeView1.Nodes.Clear();
this.treeView1.Nodes.Add(root);
if (String.IsNullOrEmpty(filter))
{
this.treeView1.CollapseAll();
root.Expand();
}
else
{
this.treeView1.ExpandAll();
}
//this.treeView1.CheckBoxes = true;
}
bool GetLevel(DesignActionNode cur, string Filter)
{
bool returnbool=false;
Regex chinese = new Regex(@"[\u4e00-\u9fa5]");
if (chinese.IsMatch(Filter))
{
if (cur.Children.Count != 0 && !cur.Name.Contains(Filter))
{
foreach (DesignActionNode actionnode in cur.Children)
{
//if (actionnode.ActionNode.Where(t => t.Name.Contains(Filter)).FirstOrDefault() != null)
// return true;
if (GetLevel(actionnode, Filter))
return true;
}
}
else
{
if (cur.Name.Contains(Filter) || cur.ActionNode.Where(t => t.Name.Contains(Filter)).FirstOrDefault() != null)
return true;
else
return false;
}
}
else
{
if (cur.Children.Count != 0 && GetChineseSpell(cur.Name).IndexOf(Filter,StringComparison.OrdinalIgnoreCase)<0)
{
foreach (DesignActionNode actionnode in cur.Children)
{
//if (actionnode.ActionNode.Where(t => t.Name.Contains(Filter)).FirstOrDefault() != null)
// return true;
if (GetLevel(actionnode, Filter))
return true;
}
}
else
{
if (GetChineseSpell(cur.Name).IndexOf(Filter, StringComparison.OrdinalIgnoreCase) >=0 || cur.ActionNode.Where(t =>GetChineseSpell(t.Name).ToLower().Contains(Filter.ToLower())).FirstOrDefault() != null)
return true;
else
return false;
}
}
return returnbool;
}
private void IniTree(TreeNode node, DesignActionNode cur,string filter,bool isComplete)
{
Regex chinese = new Regex(@"[\u4e00-\u9fa5]");
foreach (DesignAction actionnode in cur.ActionNode)
{
if (!Convert.ToBoolean(node.Tag))
{
if (!isComplete)
{
if (chinese.IsMatch(filter))
{
if (!actionnode.Name.Contains(filter))
continue;
}
else
{
if (GetChineseSpell(actionnode.Name).IndexOf(filter,StringComparison.OrdinalIgnoreCase)<0)
continue;
}
}
}
TreeNode child = new TreeNode();
child.Name = actionnode.GUID;
child.ToolTipText = actionnode.Remark;
child.Text = actionnode.Name;
node.Nodes.Add(child);
}
foreach (DesignActionNode actionnode in cur.Children)
{
if (!Convert.ToBoolean(node.Tag))
{
//if (actionnode.Children.Count == 0)
//{
// if (!actionnode.Name.Contains(Filter) && actionnode.ActionNode.Where(t => t.Name.Contains(Filter)).FirstOrDefault() == null)
// continue;
//}
if (!GetLevel(actionnode, filter))
continue;
}
TreeNode child = new TreeNode();
child.Name = string.Empty;
child.ToolTipText = actionnode.Name;
child.Text = actionnode.Name;
if (chinese.IsMatch(filter))
{
child.Tag = Convert.ToBoolean(node.Tag) ? true : actionnode.Name.Contains(filter);
node.Nodes.Add(child);
IniTree(child, actionnode, filter, actionnode.Name.Contains(filter) ? true : false);
}
else
{
child.Tag = Convert.ToBoolean(node.Tag) ? true : GetChineseSpell(actionnode.Name).IndexOf(filter,StringComparison.OrdinalIgnoreCase)>=0;
node.Nodes.Add(child);
IniTree(child, actionnode, filter, GetChineseSpell(actionnode.Name).IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0 ? true : false);
}
}
}
/// <summary>
/// 操作列表
/// </summary>
public string StrActionList
{
get { return this.txtCurrent.Text; }
set { this.txtCurrent.Text = value; }
}
/// <summary>
/// 操作列表
/// </summary>
public List<Mesnac.Controls.Base.DesignAction> ActionList
{
get { return this._currentActionList; }
set
{
this._currentActionList = value;
if (this._currentActionList != null && this._currentActionList.Count > 0)
{
foreach (Mesnac.Controls.Base.DesignAction action in this._currentActionList)
{
TreeNode node = this.treeView1.GetFirstNodeByNodeName(action.GUID);
if (node != null)
{
//node.Checked = true;
//node. = true;
this.treeView1.CollapseAll();
this.treeView1.SelectedNode = node;
node.Expand();
this.treeView1.Focus();
return;
}
}
}
}
}
/// <summary>
/// 生成操作列表
/// </summary>
/// <param name="tn"></param>
public void GenerateActionList(TreeNode tn)
{
if (tn.IsSelected && !String.IsNullOrEmpty(tn.Name))
{
this._currentActionList.Add(new Controls.Base.DesignAction() { GUID=tn.Name, Name = tn.Text, Remark = tn.ToolTipText });
}
foreach (TreeNode node in tn.Nodes)
{
this.GenerateActionList(node);
}
}
TreeNode ShowAllNodes(TreeNodeCollection nodes)
{
TreeNode tn = null;
foreach (TreeNode node in nodes)
{
if (node.IsSelected)
tn = node;
if (node.Nodes.Count > 0)
{
ShowAllNodes(node.Nodes);
}
}
return tn;
}
/// <summary>
/// 选择树节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode tn = this.treeView1.SelectedNode;
if (tn != null && !string.IsNullOrEmpty(tn.Name))
{
txtCurrent.Text = tn.Parent.Parent.Text + "-" + tn.Parent.Text + "-" + tn.Text;
this.lblRemark.Text = String.Format("{0}", tn.ToolTipText);
}
else
{
txtCurrent.Text = "";
this.lblRemark.Text = String.Empty;
}
this.treeView1.Focus();
}
private void btnOk_Click(object sender, EventArgs e)
{
this._currentActionList.Clear();
this.GenerateActionList(this.treeView1.Nodes[0]);
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
}
/// <summary>
/// 筛选
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtFilter_TextChanged(object sender, EventArgs e)
{
InitData(txtFilter.Text);
if (this._currentActionList != null && this._currentActionList.Count > 0)
{
foreach (Mesnac.Controls.Base.DesignAction action in this._currentActionList)
{
TreeNode node = this.treeView1.GetFirstNodeByNodeName(action.GUID);
if (node != null)
{
this.treeView1.CollapseAll();
this.treeView1.SelectedNode = node;
node.Expand();
this.treeView1.Focus();
}
}
}
}
private void FrmEventAction_Activated(object sender, EventArgs e)
{
this.treeView1.Focus();
if (String.IsNullOrEmpty(this.txtFilter.Text))
{
if (this.treeView1.Nodes.Count > 0)
{
this.treeView1.Nodes[0].Expand();
}
}
}
/// <summary>
/// 获取首字母
/// </summary>
/// <param name="strText"></param>
/// <returns></returns>
private string GetChineseSpell(string strText)
{
int len = strText.Length;
string myStr = "";
for (int i = 0; i < len; i++)
{ myStr += getSpell(strText.Substring(i, 1)); }
return myStr;
}
private string getSpell(string cnChar)
{
byte[] arrCN = System.Text.Encoding.Default.GetBytes(cnChar);
if (arrCN.Length > 1)
{
int area = (short)arrCN[0];
int pos = (short)arrCN[1];
int code = (area << 8) + pos;
int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
for (int i = 0; i < 26; i++)
{
int max = 55290;
if (i != 25)
max = areacode[i + 1];
if (areacode[i] <= code && code < max)
{
return System.Text.Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
}
}
return "";
}
else
return cnChar;
}
private void btnClear_Click(object sender, EventArgs e)
{
this._currentActionList.Clear();
//this.GenerateActionList(this.treeView1.Nodes[0]);
this.txtCurrent.Text = String.Empty;
this.lblRemark.Text = String.Empty;
this.DialogResult = System.Windows.Forms.DialogResult.OK;
}
}
}