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.

792 lines
29 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 菜单最大可显示的数量
/// </summary>
private int MenuMaxCount = 24;
/// <summary>
/// 数据库的模块数据
/// </summary>
private List<ShortcutMenu> _dataSource = null;
/// <summary>
/// 数据库的资源数据
/// </summary>
private List<Resources> _resourceDataSource = null;
/// <summary>
/// 资源分组字段,用来出来选择某一个分组
/// </summary>
private Dictionary<ResourcesGroup, ItemPanel> _resourceItemPanel = null;
/// <summary>
/// 当前选中的功能块
/// </summary>
private MetroTileItem _selectedItem = null;
/// <summary>
/// 当前选中功能所在的操作区
/// </summary>
private ModuleArea _selectedArea = ModuleArea.;
private static int DefaultWidth = 55;
private static int DefaultHeight = 50;
private readonly Size DefaultTileItemSize = new Size(DefaultWidth, DefaultHeight);
/// <summary>
/// 数据库的模块数据
/// </summary>
private List<ShortcutMenu> _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<ShortcutMenu>("where area == @0", this._selectedArea.ToString()).ToList();
}
//如果数据库数据为空
if (this._dataSource == null)
{
this._dataSource = new List<ShortcutMenu>();
}
//复制数据源对象,用于比较变更
this._oldValue = ObjectUtils.Copy<List<ShortcutMenu>>(this._dataSource);
//获取数据库的资源数据
using (var db = Global.Instance.OpenDataBase)
{
this._resourceDataSource = db.Query<Resources>("where [group] == @0", ResourcesGroup..ToString()).ToList();
}
//如果数据库数据为空
if (this._resourceDataSource == null)
{
this._resourceDataSource = new List<Resources>();
}
this._resourceItemPanel = new Dictionary<ResourcesGroup, ItemPanel>();
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<Resources> 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<ModuleFont>(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);
}
/// <summary>
/// 初始化主菜单
/// </summary>
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);
}
}
}
/// <summary>
/// 颜色修改事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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<bool, string> 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<bool, string>(true, LangProxy.ToLang("更新成功"));
}
}
}