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#

9 months ago
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("更新成功"));
}
}
}