using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Windows.Forms; using POSV.Entity; using DevComponents.DotNetBar; using DevComponents.DotNetBar.Metro; using POSV.Utils; using DevComponents.DotNetBar.Controls; using OfficePickers.ColorPicker; using POSV.MessageEvent; using POS.Language.Language; namespace POSV.Component { [ToolboxItem(true)] public partial class ShortcutControlDesigner : BaseUserControl { /// /// 菜单最大可显示的数量 /// private int MenuMaxCount = 24; /// /// 数据库的模块数据 /// private List _dataSource = null; /// /// 数据库的资源数据 /// private List _resourceDataSource = null; /// /// 资源分组字段,用来出来选择某一个分组 /// private Dictionary _resourceItemPanel = null; /// /// 当前选中的功能块 /// private MetroTileItem _selectedItem = null; /// /// 当前选中功能所在的操作区 /// private ModuleArea _selectedArea = ModuleArea.快捷区; private static int DefaultWidth = 55; private static int DefaultHeight = 50; private readonly Size DefaultTileItemSize = new Size(DefaultWidth, DefaultHeight); /// /// 数据库的模块数据 /// private List _oldValue = null; public ShortcutControlDesigner() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; this.BackColor = Color.Transparent; //获取数据库的数据 using (var db = Global.Instance.OpenDataBase) { this._dataSource = db.Query("where area == @0", this._selectedArea.ToString()).ToList(); } //如果数据库数据为空 if (this._dataSource == null) { this._dataSource = new List(); } //复制数据源对象,用于比较变更 this._oldValue = ObjectUtils.Copy>(this._dataSource); //获取数据库的资源数据 using (var db = Global.Instance.OpenDataBase) { this._resourceDataSource = db.Query("where [group] == @0", ResourcesGroup.快捷类.ToString()).ToList(); } //如果数据库数据为空 if (this._resourceDataSource == null) { this._resourceDataSource = new List(); } this._resourceItemPanel = new Dictionary(); RefreshUi(); } private void BuilderResourceTabItem() { this._resourceItemPanel.Clear(); this.superTabControl.Tabs.Clear(); foreach (ResourcesGroup item in Enum.GetValues(typeof(ResourcesGroup))) { //如果数据表中不包含资源,不显示 var lists = this._resourceDataSource.FindAll(x => x.Enable == 1 && x.Group == item.ToString()); if (lists.Count == 0) continue; SuperTabItem tab = this.superTabControl.CreateTab(item.ToString()); ItemPanel panel = new ItemPanel(); panel.BackgroundStyle.Class = "ItemPanel"; panel.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square; panel.Dock = System.Windows.Forms.DockStyle.Fill; panel.LicenseKey = "F962CEC7-CD8F-4911-A9E9-CAB39962FC1F"; panel.Location = new System.Drawing.Point(0, 0); panel.MultiLine = true; tab.AttachedControl.Controls.Add(panel); this._resourceItemPanel.Add(item, panel); this.BindResourceTabItem(panel, lists); } } private void RefreshUi() { this.BuilderResourceTabItem(); //字体支持列表 this.comboBoxFontSize.DataSource = System.Enum.GetNames(typeof(ModuleFont)); ModuleFont defaultFontSize = ModuleFont.默认; this.comboBoxFontSize.SelectedIndex = this.comboBoxFontSize.FindString(defaultFontSize.ToString()); //初始化菜单 BuilderItemPanel(null); } private void BindResourceTabItem(ItemPanel panel, List lists) { foreach (ResourcesGroup group in Enum.GetValues(typeof(ResourcesGroup))) { panel.Items.Clear(); ItemContainer ic = new ItemContainer(); ic.MultiLine = true; foreach (Resources entity in lists) { MetroTileItem item = new MetroTileItem(); item.TileStyle.Padding = -2; item.Checked = false; item.CheckBehavior = eMetroTileCheckBehavior.LeftMouseButtonClick; switch (entity.KeyCode) { case "数量加": { //➕ item.Text = string.Empty; item.Symbol = "\uf067"; item.SymbolSize = 0; item.ImageIndent = new Point(0, 0); item.ImageTextAlignment = ContentAlignment.MiddleCenter; item.ItemAlignment = eItemAlignment.Center; } break; case "数量减": { //➖ item.Text = string.Empty; item.Symbol = "\uf068"; item.SymbolSize = 0; item.ImageIndent = new Point(0, 0); item.ImageTextAlignment = ContentAlignment.MiddleCenter; item.ItemAlignment = eItemAlignment.Center; } break; default: { item.Text = LangProxy.ToLang(entity.Name); } break; } item.TileStyle.Font = Constant.NORMAL_FONT; item.TileStyle.TextAlignment = eStyleTextAlignment.Center; item.SymbolColor = Color.Empty; item.TileColor = eMetroTileColor.Gray; item.TileSize = new Size(85, 40); item.Tag = entity; item.MouseDown += ResourceItemPanelMouseDown; item.CheckedChanged += ResourceItemPanelCheckedChanged; ic.SubItems.Add(item); } panel.Items.Add(ic); panel.Invalidate(); } } private void ResourceItemPanelMouseDown(object sender, MouseEventArgs e) { } private void ResourceItemPanelCheckedChanged(object sender, EventArgs e) { MetroTileItem item = (MetroTileItem)sender; item.TileColor = item.Checked ? eMetroTileColor.Azure : eMetroTileColor.Gray; //当前模块下已经选择功能 var lists = this._dataSource.FindAll(x => !string.IsNullOrEmpty(x.ParentId)); if (lists.Count + 1 > this.MenuMaxCount) { item.Checked = false; } if (item.Checked) { //资源功能添加到模块 ResourceSelectedNotify(ModuleAction.Add, item.Tag as Resources); } else { //资源功能刪除到模块 ResourceSelectedNotify(ModuleAction.Delete, item.Tag as Resources); } } private Font GetFont(string fontSize) { Font result = Constant.DEFAULT_FONT; ModuleFont font = ModuleFont.默认; Enum.TryParse(fontSize, out font); switch (font) { case ModuleFont.默认: { result = Constant.DEFAULT_FONT; } break; case ModuleFont.正常: { result = Constant.NORMAL_FONT; } break; case ModuleFont.小字: { result = Constant.SMALL_FONT; } break; case ModuleFont.大字: { result = Constant.BIG_FONT; } break; } return result; } private void RefreshOrderNo() { var subItems = this.menuItemPanel.Items; if (subItems.Count > 0) { int orderNo = 0; var items = subItems[0].SubItems; foreach (MetroTileItem item in items) { var module = item.Tag as ShortcutMenu; module.OrderNo = (orderNo++); } this.menuItemPanel.Invalidate(); } } protected void ResourceSelectedNotify(ModuleAction action, Resources resources) { //当前选择的模块菜单 var parent = this._dataSource.SingleOrDefault(x => string.IsNullOrEmpty(x.ParentId)); //当前选择的模块 ShortcutMenu entity = null; //当前模块下已经选择功能 var lists = this._dataSource.FindAll(x => !string.IsNullOrEmpty(x.ParentId)); lists.Sort((x, y) => (x.OrderNo.CompareTo(y.OrderNo))); switch (action) { case ModuleAction.Add: { //不包含当前资源的就添加 if (!lists.Exists(x => x.ResourceId == resources.Id)) { entity = new ShortcutMenu(); entity.Id = IdWorkerUtils.Instance.NextId(); entity.Area = this._selectedArea.ToString(); entity.ParentId = parent.Id; entity.TenantId = parent.TenantId; entity.Name = resources.Name; entity.KeyCode = resources.KeyCode; entity.KeyData = resources.KeyData; entity.Alias = resources.Name; entity.Shortcut = ""; entity.OrderNo = lists.Count(); entity.Color1 = ColorTranslator.ToHtml(this.comboBoxColor1.Color); entity.Color2 = ColorTranslator.ToHtml(this.comboBoxColor1.Color); entity.Color3 = ColorTranslator.ToHtml(this.comboBoxColor3.Color); entity.FontSize = ModuleFont.默认.ToString(); entity.Enable = 1; entity.Icon = "\uf023"; entity.ResourceId = resources.Id; this._dataSource.Add(entity); } } break; case ModuleAction.Delete: { this._dataSource.RemoveAll(x => x.ParentId == parent.Id && x.ResourceId == resources.Id); } break; } RefreshOrderNo(); this.BuilderItemPanel(entity); } /// /// 初始化主菜单 /// private void BuilderItemPanel(ShortcutMenu module) { this.menuItemPanel.Items.Clear(); ItemContainer ic = new ItemContainer(); ic.MultiLine = true; ic.ItemSpacing = 1; //加载菜单显示区域为主菜单的数据 var lists = this._dataSource.FindAll(x => !string.IsNullOrEmpty(x.ParentId)); lists.Sort((x, y) => (x.OrderNo.CompareTo(y.OrderNo))); int inx = 0; MetroTileItem last = null; foreach (ShortcutMenu entity in lists) { MetroTileItem item = new MetroTileItem(); item.TileStyle.Padding = -2; item.CheckBehavior = eMetroTileCheckBehavior.LeftMouseButtonClick; item.Checked = false; item.OptionGroup = "Menu"; item.TileStyle.Font = GetFont(entity.FontSize); item.TileStyle.TextAlignment = eStyleTextAlignment.Center; switch (entity.KeyCode) { case "数量加": { //➕ if (string.IsNullOrEmpty(entity.Alias) || "➕".Equals(entity.Alias)) { item.Text = string.Empty; item.Symbol = "\uf067"; item.SymbolSize = 0; item.ImageIndent = new Point(0, 0); item.ImageTextAlignment = ContentAlignment.MiddleCenter; item.ItemAlignment = eItemAlignment.Center; } else { item.Text = LangProxy.ToLang(entity.Alias); } } break; case "数量减": { //➖ if (string.IsNullOrEmpty(entity.Alias) || "➖".Equals(entity.Alias)) { item.Text = string.Empty; item.Symbol = "\uf068"; item.SymbolSize = 0; item.ImageIndent = new Point(0, 0); item.ImageTextAlignment = ContentAlignment.MiddleCenter; item.ItemAlignment = eItemAlignment.Center; } else { item.Text = LangProxy.ToLang(entity.Alias); } } break; default: { item.Text = LangProxy.ToLang(string.IsNullOrEmpty(entity.Alias) ? entity.Name : entity.Alias); } break; } item.TileStyle.TextColor = ColorTranslator.FromHtml(entity.Color3); item.TileStyle.BackColor = ColorTranslator.FromHtml(entity.Color1); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(entity.Color1); item.TileStyle.BorderColor = Color.Transparent; item.TileStyle.BorderColor2 = Color.Transparent; item.Tag = entity; item.TileSize = this.DefaultTileItemSize; item.Tag = entity; item.MouseDown += OnMenuMouseDown; item.CheckedChanged += OnMenuCheckedChanged; if (module != null && module.Id.Equals(entity.Id)) { this._selectedItem = item; } //保留最后一项的选择机会 last = item; ic.SubItems.Add(item); inx++; } this.menuItemPanel.Items.Add(ic); this.menuItemPanel.Invalidate(); //没有匹配到具体的模块,将第一个主菜单选中 if (module == null || this._selectedItem == null) { this._selectedItem = last; } //选中当前菜单 if (this._selectedItem != null) { this._selectedItem.Checked = true; } else { this.BindModuleParameter(null); } } private void OnMenuMouseDown(object sender, MouseEventArgs e) { MetroTileItem item = (MetroTileItem)sender; item.Checked = true; } private void OnMenuCheckedChanged(object sender, EventArgs e) { MetroTileItem item = (MetroTileItem)sender; item.TileStyle.BorderColor = Color.Transparent; item.TileStyle.BorderColor2 = Color.Transparent; var entity = item.Tag as ShortcutMenu; if (item.Checked) { //设置当前选择的模块 this._selectedItem = item; item.TileStyle.TextColor = ColorTranslator.FromHtml(entity.Color3); item.TileStyle.BackColor = ColorTranslator.FromHtml(entity.Color2); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(entity.Color2); //绑定参数 BindModuleParameter(entity); SendToResources(); } else { item.TileStyle.TextColor = ColorTranslator.FromHtml(entity.Color3); item.TileStyle.BackColor = ColorTranslator.FromHtml(entity.Color1); item.TileStyle.BackColor2 = ColorTranslator.FromHtml(entity.Color1); } } private void BindModuleParameter(ShortcutMenu module) { if (module == null) { this.txtAlias.Text = string.Empty; this.comboBoxColor1.Color = Color.Tan; this.comboBoxColor2.Color = Color.Tan; this.comboBoxColor3.Color = Color.Black; ModuleFont defaultFontSize = ModuleFont.默认; this.comboBoxFontSize.SelectedIndex = this.comboBoxFontSize.FindString(defaultFontSize.ToString()); return; } this.txtAlias.Text = module.Alias; this.comboBoxColor1.Color = ColorTranslator.FromHtml(module.Color1); this.comboBoxColor2.Color = ColorTranslator.FromHtml(module.Color2); this.comboBoxColor3.Color = ColorTranslator.FromHtml(module.Color3); this.comboBoxFontSize.SelectedIndex = this.comboBoxFontSize.FindString(module.FontSize); } private void SendToResources() { if (this._selectedItem == null) return; var module = this._selectedItem.Tag as ShortcutMenu; //当前模块下已经选择功能 var selected = this._dataSource.FindAll(x => !string.IsNullOrEmpty(x.ParentId)); selected.Sort((x, y) => (x.OrderNo.CompareTo(y.OrderNo))); foreach (var panel in this._resourceItemPanel) { var items = panel.Value.Items[0].SubItems; foreach (MetroTileItem o in items) { var resource = o.Tag as Resources; o.OptionGroup = string.Empty; o.Checked = selected.Exists(x => x.ResourceId == resource.Id); } } } private void OnFontSelectedIndexChanged(object sender, EventArgs e) { var item = sender as ComboBoxEx; var subItems = this.menuItemPanel.Items; if (subItems.Count < 1) return; var items = subItems[0].SubItems; var font = (ModuleFont)Enum.Parse(typeof(ModuleFont), item.SelectedItem.ToString(), false); foreach (MetroTileItem o in items) { //当前选择的或者当前区域全部 if (o.Checked || checkBoxFontAndColor.Checked) { var module = o.Tag as ShortcutMenu; module.FontSize = font.ToString(); o.TileStyle.Font = GetFont(module.FontSize); } } } /// /// 颜色修改事件 /// /// /// private void OnSelectedColorChanged(object sender, EventArgs e) { var item = sender as ComboBoxColorPicker; var subItems = this.menuItemPanel.Items; if (subItems.Count < 1) return; var items = subItems[0].SubItems; foreach (MetroTileItem o in items) { //当前选择的或者当前区域全部 if (o.Checked || checkBoxFontAndColor.Checked) { var module = o.Tag as ShortcutMenu; switch (item.Name) { case "comboBoxColor1": { module.Color1 = ColorTranslator.ToHtml(item.Color); o.TileStyle.BackColor = item.Color; o.TileStyle.BackColor2 = item.Color; } break; case "comboBoxColor2": { module.Color2 = ColorTranslator.ToHtml(item.Color); } break; case "comboBoxColor3": { module.Color3 = ColorTranslator.ToHtml(item.Color); o.TileStyle.TextColor = item.Color; } break; } } } } private void OnAliasTextChanged(object sender, EventArgs e) { if (this._selectedItem == null) return; var item = sender as TextBoxX; switch (this._selectedArea) { case ModuleArea.快捷区: { var module = this._selectedItem.Tag as ShortcutMenu; var alias = item.Text.Trim(); switch (module.KeyCode) { case "数量加": { //➕ if (string.IsNullOrEmpty(alias) || "➕".Equals(alias)) { this._selectedItem.Text = string.Empty; this._selectedItem.Symbol = "\uf067"; this._selectedItem.SymbolSize = 0; this._selectedItem.ImageIndent = new Point(0, 0); this._selectedItem.ImageTextAlignment = ContentAlignment.MiddleCenter; this._selectedItem.ItemAlignment = eItemAlignment.Center; } else { this._selectedItem.Text = LangProxy.ToLang(alias); } } break; case "数量减": { //➖ if (string.IsNullOrEmpty(alias) || "➖".Equals(alias)) { this._selectedItem.Text = string.Empty; this._selectedItem.Symbol = "\uf068"; this._selectedItem.SymbolSize = 0; this._selectedItem.ImageIndent = new Point(0, 0); this._selectedItem.ImageTextAlignment = ContentAlignment.MiddleCenter; this._selectedItem.ItemAlignment = eItemAlignment.Center; } else { this._selectedItem.Text = LangProxy.ToLang(alias); } } break; default: { this._selectedItem.Text = LangProxy.ToLang(string.IsNullOrEmpty(alias) ? module.Name : alias); } break; } module.Alias = alias; } break; } } private void OnButtonForward(object sender, EventArgs e) { if (this._selectedItem == null) return; switch (this._selectedArea) { case ModuleArea.快捷区: { //当前要前移的对象 var current = this._selectedItem.Tag as ShortcutMenu; //当前明细区记录集 var lists = this._dataSource.FindAll(x => x.ParentId == current.ParentId && ModuleArea.快捷区.ToString().Equals(x.Area)); lists.Sort((x, y) => x.OrderNo.CompareTo(y.OrderNo)); if (current.OrderNo > 0) { //当前对象前的对象,需要后移 var item = lists[current.OrderNo - 1]; //对象序号+1,后移 item.OrderNo += 1; //对象序号-1,前移 current.OrderNo -= 1; //交换两个对象 lists[item.OrderNo] = item; lists[current.OrderNo] = current; } this.BuilderItemPanel(current); } break; } RefreshOrderNo(); } private void OnButtonBackward(object sender, EventArgs e) { if (this._selectedItem == null) return; switch (this._selectedArea) { case ModuleArea.快捷区: { //当前要前移的对象 var current = this._selectedItem.Tag as ShortcutMenu; //当前结账区记录集 var lists = this._dataSource.FindAll(x => x.ParentId == current.ParentId && ModuleArea.快捷区.ToString().Equals(x.Area)); lists.Sort((x, y) => x.OrderNo.CompareTo(y.OrderNo)); if (current.OrderNo + 1 < lists.Count()) { //当前对象后面的对象,需要后移 var item = lists[current.OrderNo + 1]; //对象序号+1,后移 item.OrderNo -= 1; //对象序号-1,前移 current.OrderNo += 1; //交换两个对象 lists[item.OrderNo] = item; lists[current.OrderNo] = current; } this.BuilderItemPanel(current); } break; } RefreshOrderNo(); } public Tuple SaveChanged() { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { db.Execute("delete from pos_shortcut;"); db.InsertBatch(this._dataSource); transaction.Complete(); } } //发送通知,修改界面呈现 MsgEvent.Send(Constant.SHORTCUT_CHANGED_NOTIFY, this._dataSource); return new Tuple(true, LangProxy.ToLang("更新成功")); } } }