RecipeViewModel.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.UI.View.Common;
  3. using Aitex.UI.RecipeEditor;
  4. using Aitex.UI.RecipeEditor.View;
  5. using Prism.Commands;
  6. using Prism.Mvvm;
  7. using Prism.Regions;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Controls;
  15. using System.Windows.Media;
  16. using System.Xml;
  17. using Venus_Core;
  18. using Venus_MainPages.PMs;
  19. using Venus_MainPages.Views;
  20. using WPF.Themes.UserControls;
  21. namespace Venus_MainPages.ViewModels
  22. {
  23. internal class RecipeViewModel : BindableBase
  24. {
  25. #region 私有字段
  26. private string m_Title;
  27. private string m_chamId = "PMA";
  28. private string m_CurrentRecipeName;
  29. private UiRecipeManager m_uiRecipeManager = new UiRecipeManager();
  30. private RecipeView recipeView;
  31. private TreeView treeViewRcpList;
  32. private RecipeEditorControl tableRecipeGrid;
  33. private Recipe m_currentRecipe;
  34. private string m_recipeType;
  35. private bool firstLoad=true;
  36. #endregion
  37. #region 属性
  38. public string Title
  39. {
  40. get { return m_Title; }
  41. set { SetProperty(ref m_Title, value); }
  42. }
  43. public string CurrentRecipeName
  44. {
  45. get { return m_CurrentRecipeName; }
  46. set { SetProperty(ref m_CurrentRecipeName, value); }
  47. }
  48. public Recipe CurrentRecipe
  49. {
  50. get { return m_currentRecipe; }
  51. set
  52. {
  53. m_currentRecipe = value;
  54. RecipeType = m_currentRecipe.Header.Type.ToString();
  55. }
  56. }
  57. public string RecipeType
  58. {
  59. get { return m_recipeType; }
  60. set { SetProperty(ref m_recipeType, value); }
  61. }
  62. #endregion
  63. #region 命令
  64. private DelegateCommand _NewCommand;
  65. public DelegateCommand NewCommand =>
  66. _NewCommand ?? (_NewCommand = new DelegateCommand(OnNew));
  67. private DelegateCommand _ReNameCommand;
  68. public DelegateCommand ReNameCommand =>
  69. _ReNameCommand ?? (_ReNameCommand = new DelegateCommand(OnReName));
  70. private DelegateCommand _DeleteCommand;
  71. public DelegateCommand DeleteCommand =>
  72. _DeleteCommand ?? (_DeleteCommand = new DelegateCommand(OnDelete));
  73. private DelegateCommand<Object> _MouseRightButtonDownCommand;
  74. public DelegateCommand<Object> MouseRightButtonDownCommand =>
  75. _MouseRightButtonDownCommand ?? (_MouseRightButtonDownCommand = new DelegateCommand<Object>(OnMouseRightButtonDown));
  76. private DelegateCommand<Object> _LoadedCommand;
  77. public DelegateCommand<Object> LoadedCommand =>
  78. _LoadedCommand ?? (_LoadedCommand = new DelegateCommand<Object>(OnLoaded));
  79. private DelegateCommand _SaveRecipeCommand;
  80. public DelegateCommand SaveRecipeCommand =>
  81. _SaveRecipeCommand ?? (_SaveRecipeCommand = new DelegateCommand(OnSaveRecipe));
  82. private DelegateCommand _AddStepCommand;
  83. public DelegateCommand AddStepCommand =>
  84. _AddStepCommand ?? (_AddStepCommand = new DelegateCommand(OnAddStep));
  85. private DelegateCommand _DeleteStepCommand;
  86. public DelegateCommand DeleteStepCommand =>
  87. _DeleteStepCommand ?? (_DeleteStepCommand = new DelegateCommand(OnDeleteStep));
  88. //private DelegateCommand _ReLoadCommand;
  89. //public DelegateCommand ReLoadCommand =>
  90. // _ReLoadCommand ?? (_ReLoadCommand = new DelegateCommand(OnReLoad));
  91. #endregion
  92. #region 构造函数
  93. public RecipeViewModel()
  94. {
  95. Title = "配方管理";
  96. }
  97. #endregion
  98. #region 命令方法
  99. private void OnNew()
  100. {
  101. }
  102. private void OnReName()
  103. {
  104. }
  105. private void OnDelete()
  106. {
  107. }
  108. private void OnAddStep()
  109. {
  110. this.tableRecipeGrid.ControlViewModel.OnAddStep();
  111. }
  112. private void OnDeleteStep()
  113. {
  114. this.tableRecipeGrid.ControlViewModel.OnDeleteStep();
  115. }
  116. private void OnReLoad()
  117. {
  118. this.tableRecipeGrid.ControlViewModel.LoadRecipe(CurrentRecipe);
  119. }
  120. private void OnSaveRecipe()
  121. {
  122. SaveRecipe(CurrentRecipeName, RecipeUnity.RecipeToString(CurrentRecipe));
  123. }
  124. private void OnLoaded(Object myrecipeView)
  125. {
  126. if (firstLoad == true)
  127. {
  128. firstLoad = false;
  129. recipeView = myrecipeView as RecipeView;
  130. treeViewRcpList = recipeView.treeViewRcpList;
  131. tableRecipeGrid = recipeView.tableRecipeGrid;
  132. UpdateRecipeFileList();
  133. treeViewRcpList.SelectedItemChanged += TreeViewRcpList_SelectedItemChanged;
  134. }
  135. }
  136. private void TreeViewRcpList_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
  137. {
  138. var selectedItem = e.NewValue as TreeViewFileItem;
  139. if (selectedItem == null)
  140. return;
  141. try
  142. {
  143. CurrentRecipeName = selectedItem.FileName;
  144. string xmlRecipeData = m_uiRecipeManager.LoadRecipe(m_chamId, selectedItem.FileName);
  145. if (xmlRecipeData == "")
  146. {
  147. treeViewRcpList.Items.Remove(selectedItem);
  148. return;
  149. }
  150. CurrentRecipe = Recipe.Load(xmlRecipeData);
  151. this.tableRecipeGrid.ControlViewModel.LoadRecipe(CurrentRecipe);
  152. }
  153. catch (Exception ex)
  154. {
  155. MessageBox.Show(string.Format(Application.Current.Resources["GlobalLableTitleRecipeEditor"].ToString(), ex.Message), Application.Current.Resources["GlobalLableTitleRecipeEditor"].ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
  156. }
  157. e.Handled = true;
  158. }
  159. /// <summary>
  160. /// Load recipe data by recipe name
  161. /// </summary>
  162. /// <param name="receipeName"></param>
  163. /// <returns></returns>
  164. public string LoadRecipe(string receipeName)
  165. {
  166. return m_uiRecipeManager.LoadRecipe(m_chamId, receipeName);
  167. }
  168. /// <summary>
  169. /// Save recipe by recipe name and recipe data
  170. /// </summary>
  171. /// <param name="recipeName"></param>
  172. /// <param name="recipe"></param>
  173. /// <returns></returns>
  174. public bool SaveRecipe(string recipeName, string recipeContent)
  175. {
  176. return m_uiRecipeManager.SaveRecipe(m_chamId, recipeName, recipeContent);
  177. }
  178. /// <summary>
  179. /// 右击TreeView,上下文菜单选择功能
  180. /// </summary>
  181. /// <param name="treeView"></param>
  182. private void OnMouseRightButtonDown(Object treeView)
  183. {
  184. //treeViewRcpList = treeView as TreeView;
  185. treeViewRcpList.ContextMenu = new ContextMenu() { Background = new SolidColorBrush(Colors.AliceBlue)};
  186. MenuItem menuItem = new MenuItem();
  187. menuItem = new MenuItem();
  188. menuItem.Tag = "\\";
  189. menuItem.Click += new RoutedEventHandler(menuItem_MouseClick_CreateRecipe);
  190. menuItem.Header = Application.Current.Resources["GlobalLableMenuNewRecipe"];
  191. treeViewRcpList.ContextMenu.Items.Add(menuItem);
  192. menuItem = new MenuItem();
  193. menuItem.Tag = "\\";
  194. //menuItem.Click += new RoutedEventHandler(menuItem_MouseClick_ImportRecipe);
  195. menuItem.Header = Application.Current.Resources["GlobalLableMenuImportRecipe"];
  196. treeViewRcpList.ContextMenu.Items.Add(menuItem);
  197. treeViewRcpList.ContextMenu.Items.Add(new Separator());
  198. menuItem = new MenuItem();
  199. menuItem.Tag = "\\";
  200. //menuItem.Click += new RoutedEventHandler(menuItem_MouseClick_CreateFolder);
  201. menuItem.Header = Application.Current.Resources["GlobalLableMenuNewFolder"];
  202. treeViewRcpList.ContextMenu.Items.Add(menuItem);
  203. treeViewRcpList.ContextMenu.Visibility = Visibility.Visible;
  204. }
  205. /// <summary>
  206. /// 创建新的配方
  207. /// </summary>
  208. /// <param name="sender"></param>
  209. /// <param name="e"></param>
  210. private void menuItem_MouseClick_CreateRecipe(object sender, RoutedEventArgs e)
  211. {
  212. MenuItem mit = sender as MenuItem;
  213. string folderName = mit.Tag as string;
  214. PerformCreateRecipe(folderName);
  215. }
  216. private void PerformCreateRecipe(string folderName)
  217. {
  218. try
  219. {
  220. RecipeNameInputDlg dlg = new RecipeNameInputDlg(Application.Current.Resources["GlobalLableMsgInputRecipeName"].ToString())
  221. {
  222. Owner = Application.Current.MainWindow
  223. };
  224. if (dlg.ShowDialog() == true)
  225. {
  226. var recipeName = folderName + "\\" + dlg.InputText;
  227. RecipeType type = (RecipeType)Enum.Parse(typeof(RecipeType), dlg.SelectedType);
  228. string newRecipe =RecipeUnity.CreateRecipe(type, dlg.InputText);
  229. //string recipeContent = m_uiRecipeManager.GetRecipeTemplate(m_chamId);
  230. //m_uiRecipeManager.SaveAsRecipe(m_chamId, recipeName, m_uiRecipeManager.LoadRecipe("system",folderName));
  231. if (SaveAsRecipe(recipeName, newRecipe))
  232. {
  233. //UpdateRecipeFileList();
  234. //SelectRecipe(recipeName);
  235. treeViewRcpList.Items.Add(new TreeViewFileItem(dlg.InputText));
  236. }
  237. else
  238. {
  239. WPFMessageBox.ShowError("Error");
  240. }
  241. }
  242. }
  243. catch (Exception ex)
  244. {
  245. LOG.WriteExeption(ex);
  246. MessageBox.Show(string.Format(Application.Current.Resources["GlobalLableMsgRecipeCreateException"].ToString(), ex.Message), Application.Current.Resources["GlobalLableTitleRecipeEditor"].ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
  247. }
  248. }
  249. /// <summary>
  250. /// SaveAs recipe by recipe name and recipe data
  251. /// </summary>
  252. /// <param name="recipeName"></param>
  253. /// <param name="recipe"></param>
  254. /// <returns></returns>
  255. public bool SaveAsRecipe(string recipeName, string recipeContent)
  256. {
  257. return m_uiRecipeManager.SaveAsRecipe(m_chamId, recipeName, recipeContent);
  258. }
  259. /// <summary>
  260. /// Recipe template
  261. /// </summary>
  262. public string RecipeTemplate
  263. {
  264. get
  265. {
  266. string template = m_uiRecipeManager.GetRecipeTemplate(m_chamId);
  267. return template;
  268. }
  269. }
  270. private void UpdateRecipeFileList()
  271. {
  272. XmlDocument doc = new XmlDocument();
  273. doc.LoadXml(GetXmlRecipeList());
  274. treeViewRcpList.Items.Clear();
  275. CreateTreeViewItems(doc.DocumentElement, this.treeViewRcpList);
  276. }
  277. /// <summary>
  278. /// Get recipe list in xml format
  279. /// </summary>
  280. /// <returns></returns>
  281. public string GetXmlRecipeList()
  282. {
  283. return m_uiRecipeManager.GetXmlRecipeList(m_chamId, true) ?? "";
  284. }
  285. void CreateTreeViewItems(XmlElement curElementNode, ItemsControl itemsControl)
  286. {
  287. foreach (XmlElement ele in curElementNode.ChildNodes)
  288. {
  289. if (ele.Name == "File")
  290. {
  291. string fileName = ele.Attributes["Name"].Value;
  292. fileName = fileName.Substring(fileName.LastIndexOf('\\') + 1);
  293. TreeViewFileItem item = new TreeViewFileItem(ele.Attributes["Name"].Value);
  294. item.Tag = ele.Attributes["Name"].Value;
  295. //item.ToolTip = fileName;
  296. itemsControl.Items.Add(item);
  297. }
  298. else if (ele.Name == "Folder")
  299. {
  300. string folderName = ele.Attributes["Name"].Value;
  301. folderName = folderName.Substring(folderName.LastIndexOf('\\') + 1);
  302. TreeViewFolderItem item = new TreeViewFolderItem(folderName);
  303. item.Tag = ele.Attributes["Name"].Value;
  304. CreateTreeViewItems(ele, item);
  305. item.IsExpanded = false;
  306. itemsControl.Items.Add(item);
  307. }
  308. }
  309. }
  310. //void SelectRecipe(string recipeName)
  311. //{
  312. // try
  313. // {
  314. // string[] paths = recipeName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
  315. // string fileName = "";
  316. // for (int i = 0; i < paths.Length - 1; i++)
  317. // fileName += paths[i] + "\\";
  318. // fileName += paths[paths.Length - 1];
  319. // selectRecipe(treeViewRcpList, paths, 0, fileName);
  320. // }
  321. // catch (Exception ex)
  322. // {
  323. // LOG.WriteExeption(ex);
  324. // }
  325. //}
  326. //ItemsControl selectRecipe(ItemsControl currentNode, string[] paths, int index, string fileName)
  327. //{
  328. // if (currentNode == null)
  329. // return null;
  330. // if (index == paths.Length - 1)
  331. // {
  332. // foreach (var item in currentNode.Items)
  333. // {
  334. // TreeViewFileItem tvf = item as TreeViewFileItem;
  335. // if (tvf != null && tvf.FileName == fileName)
  336. // {
  337. // tvf.IsSelected = true;
  338. // return null;
  339. // }
  340. // }
  341. // }
  342. // foreach (var item in currentNode.Items)
  343. // {
  344. // TreeViewFolderItem tvf = item as TreeViewFolderItem;
  345. // if (tvf != null && tvf.FolderName == paths[index])
  346. // {
  347. // tvf.IsExpanded = true;
  348. // selectRecipe(tvf, paths, index + 1, fileName);
  349. // break;
  350. // }
  351. // }
  352. // return null;
  353. //}
  354. #endregion
  355. }
  356. }