using System;
using System.Collections.Generic;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using UAS_MES_NEW.DataOperate;
using UAS_MES_NEW.Entity;
using DevExpress.XtraNavBar;
using System.Collections;
using System.Reflection;
namespace UAS_MES_NEW.CustomControl.AccordionMenu
{
public partial class NavagationBar : NavBarControl
{
StringBuilder sql = new StringBuilder();
public static int WinIndex = 0;
///
/// 记录当前功能面板中的按钮
///
private ArrayList ArrFunButton = new ArrayList();
///
/// 记录当前功能面板中的listview
///
private ArrayList ArrFunListView = new ArrayList();
///
/// 已经打开的Form
///
public static Dictionary OpenedFormName = new Dictionary();
public NavagationBar()
{
InitializeComponent();
DataHelper dh = SystemInf.dh;
if (dh == null)
return;
if (User.UserAccountType == "admin")
{
sql.Clear();
sql.Append("select distinct sn_id,sn_detno,sn_module,sn_modulecode,sn_classname,sn_displayname,sn_displayname_en,sn_displayname_ynan,sn_displayname_yni,sn_caller ugp_caller,1 ugp_ifdelete,1 ugp_ifread,1 ugp_ifspecial,1 ugp_ifall,");
sql.Append("1 ugp_ifwrite from CS$SYSNAVATION left join CS$USERGROUPPOWER on sn_caller=ugp_caller where sn_using=1 order by sn_modulecode,sn_detno");
}
else
{
sql.Clear();
sql.Append("select sn_id,sn_detno,sn_module,sn_displayname,sn_displayname_en,sn_displayname_ynan,sn_displayname_yni,sn_modulecode,sn_classname,ugp_caller,max(ugp_ifdelete)ugp_ifdelete,max(ugp_ifread)ugp_ifread");
sql.Append(",max(ugp_ifspecial)ugp_ifspecial,max(ugp_ifwrite)ugp_ifwrite,max(ugp_ifall)ugp_ifall from CS$USERGROUPPOWER ");
sql.Append("left join CS$SYSNAVATION on sn_caller=ugp_caller where sn_using=1 and ugp_groupcode in ( select eg_groupcode from cs$empgroup ");
sql.Append("left join cs$userresource on ur_groupcode = eg_groupcode where eg_emcode = '" + User.UserCode + "') and (nvl(ugp_ifread,0)<>0 or nvl(ugp_ifall,0)<>0) group by sn_id,sn_caller,sn_detno,sn_modulecode,sn_classname,sn_module,sn_displayname,sn_displayname_en,sn_displayname_ynan,sn_displayname_yni,ugp_caller order by sn_modulecode,sn_detno");
}
DataTable dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
if (dt.Rows.Count == 0 && User.UserAccountType != "admin")
{
return;
}
//模块分组缓存:key=数据库原始中文模块名(sn_module)。
//注意:不能用翻译后的组名(Caption)做去重比较,否则非中文语言下
//Caption(如"Line Operations")与 sn_module(如"产线作业")永远不等,
//会导致每行菜单都新建一个分组(每组只有一条菜单项)。
Dictionary GroupMap = new Dictionary();
for (int i = 0; i < dt.Rows.Count; i++)
{
string module_name = dt.Rows[i]["sn_module"].ToString();
string caller = GetMenuDisplayName(dt.Rows[i]);
NavBarItem nbi = new NavBarItem(caller);
nbi.Tag = dt.Rows[i]["sn_classname"].ToString();
nbi.LinkClicked += Nbi_LinkClicked;
nbi.Hint = dt.Rows[i]["ugp_caller"].ToString();
nbi.Name = dt.Rows[i]["sn_id"].ToString();
NavBarGroup nbg;
if (GroupMap.TryGetValue(module_name, out nbg))
{
//已存在该模块分组,按权限添加菜单项
if (dt.Rows[i]["ugp_ifread"].ToString() != "0" || dt.Rows[i]["ugp_ifall"].ToString() != "0")
{
nbg.ItemLinks.Add(nbi);
}
}
else
{
//新建分组:标题用当前语言翻译(Lang.xml 兜底),去重用原始模块名
nbg = new NavBarGroup(UAS_MES_NEW.I18n.LanguageManager.T(module_name));
//如果加载Icon失败则加载默认图片
try
{
nbg.LargeImage = new Bitmap(@Application.StartupPath + "/Resources/" + dt.Rows[i]["sn_module"].ToString() + ".png");
}
catch (Exception)
{
try
{
nbg.LargeImage = new Bitmap(@Application.StartupPath + "/Resources/defaulticon.png");
}
catch (Exception)
{
nbg.ImageUri = null;
}
}
Groups.Add(nbg);
GroupMap[module_name] = nbg;
nbg.ItemLinks.Add(nbi);
}
}
//查询出的用户可见的Caller
//将查询出的数据添加到队列中
for (int i = 0; i < dt.Rows.Count; i++)
{
//添加权限
Dictionary dic = new Dictionary();
dic.Add("IFDELETE", dt.Rows[i]["UGP_IFDELETE"].ToString() != "1" ? false : true);
dic.Add("IFREAD", dt.Rows[i]["UGP_IFREAD"].ToString() != "1" ? false : true);
dic.Add("IFWRITE", dt.Rows[i]["UGP_IFWRITE"].ToString() != "1" ? false : true);
dic.Add("IFSPECIAL", dt.Rows[i]["UGP_IFSPECIAL"].ToString() != "1" ? false : true);
dic.Add("IFALL", dt.Rows[i]["UGP_IFALL"].ToString() != "1" ? false : true);
//之后通过Call来获取页面操作的权限
if (SystemInf.Caller.ContainsKey(dt.Rows[i]["ugp_caller"].ToString()))
{
SystemInf.Caller.Remove(dt.Rows[i]["ugp_caller"].ToString());
}
SystemInf.Caller.Add(dt.Rows[i]["ugp_caller"].ToString(), dic);
}
}
private void Nbi_LinkClicked(object sender, NavBarLinkEventArgs e)
{
NavBarItem nbi = (sender as NavBarItem);
Form OpenForm = (Form)Assembly.GetExecutingAssembly().CreateInstance("UAS_MES_NEW." + nbi.Tag.ToString());
//if (nbi.Tag.ToString() != "Query.Query_MacAddress")
//{
// DataTable dt = (DataTable)SystemInf.dh.ExecuteSql("select * from DeviceMacAddress where dma_mac='" + SystemInf.MacAddress + "'", "select");
// if (dt.Rows.Count == 0)
// {
// MessageBox.Show(UAS_MES_NEW.I18n.LanguageManager.T("该设备不在作业设备清单中,请先上传MAC以及设备信息"));
// return;
// }
//}
OpenForm.Dock = DockStyle.Fill;
OpenForm.Text = nbi.Caption;
//用Tag保存Caller
OpenForm.Tag = nbi.Hint;
TabControl tc = (TabControl)this.Parent.Controls["MainTabControl"];
//如果窗体不存在进行打开,item.ToolTip是Caller
if (!OpenedFormName.ContainsKey(nbi.Hint))
{
TabPage tb = new TabPage { Name = nbi.Name, Tag = nbi.Hint, Text = OpenForm.Text };
OpenForm.TopLevel = false;
tc.TabPages.Add(tb);
//直接选中新打开的界面
tc.SelectedTab = tb;
tb.Controls.Add(OpenForm);
OpenedFormName.Add(nbi.Hint, WinIndex);
tc.TabIndex = WinIndex;
WinIndex++;
OpenForm.Show();
}
//如果窗体已存在展示该窗体
else
tc.SelectTab(nbi.Name);
}
///
/// 根据当前界面语言,从 CS$SYSNAVATION 行读取对应语言的菜单名称。
/// 语言字段为空时回退到中文 sn_displayname。
///
private static string GetMenuDisplayName(System.Data.DataRow row)
{
string field;
switch (UAS_MES_NEW.I18n.LanguageManager.CurrentCulture)
{
case "en": field = "sn_displayname_en"; break;
case "vi": field = "sn_displayname_ynan"; break;
case "id": field = "sn_displayname_yni"; break;
default: field = "sn_displayname"; break;
}
object val = row[field];
if (val != null && !string.IsNullOrWhiteSpace(val.ToString()))
return val.ToString();
// 回退到中文
object zh = row["sn_displayname"];
return zh == null ? string.Empty : zh.ToString();
}
}
}