private void Throw(string text, ErrorType errorType, Screen menuType = Screen.MainMenu) { UserControlHost.Throw(text, GetMenuTypeString(menuType) + "設定に関する" + GetErrorTypeString(errorType), errorType); }
public void LoadGroupBoxesFromFile(string path, Action <string> changeProgressStatusAction) { path = IOPath.GetFullPath(path); changeProgressStatusAction.Invoke($"メインメニューレイアウトファイルの読込中: {path.Replace(AppDirectory + @"\", "")}"); XDocument xDocument; try { xDocument = XDocument.Load(path); } catch { Throw($"ファイル \"{path}\" の読込に失敗しました。", ErrorType.Error); return; } XElement mainMenuLayout = xDocument.Element("MainMenuLayout"); if (mainMenuLayout == null) { Throw($"ファイル \"{IOPath.GetFileName(path)}\" はメインメニューレイアウトファイルではありません。\nMainMenuLayout タグが見つかりません。", ErrorType.Error); return; } XElement left = mainMenuLayout.Element("Left"); if (left == null) { Throw("Left タグが見つかりません。", ErrorType.Error); return; } XElement right = mainMenuLayout.Element("Right"); if (right == null) { Throw("Right タグが見つかりません。", ErrorType.Error); return; } List <List <MainMenuGroupBox> > groupBoxInfos = new List <List <MainMenuGroupBox> >(); int leftGroupBoxCount = 0; int leftTotalRow = 0; XElement currentSide = left; for (int m = 0; m < 2; m++) { List <MainMenuGroupBox> groupBoxInfosChild = new List <MainMenuGroupBox>(); int groupBoxCount = 0; int totalRow = 0; int i = 0; IEnumerable <XElement> groupBoxes = currentSide.Elements("GroupBox"); foreach (XElement groupBox in groupBoxes) { string header = (string)groupBox.Attribute("Header") ?? ""; int row = (int?)groupBox.Attribute("Row") ?? -1; if (row == -1) { Throw($"グループボックス \"{header}\" に Height 属性が見つかりません。", ErrorType.Error); return; } else if (row == 0) { Throw($"グループボックス \"{header}\" の高さ \"{row}\" は非推奨の値です。", ErrorType.Warning); } List <MainMenuContent> contentInfos = new List <MainMenuContent>(); int n = 0; IEnumerable <XElement> contents = groupBox.Elements("Content"); foreach (XElement content in contents) { List <TicketButton> tickets = new List <TicketButton>(); string groupSource = IOPath.GetFullPath(IOPath.Combine(IOPath.GetDirectoryName(path), (string)content.Attribute("GroupSource") ?? "")); changeProgressStatusAction.Invoke($"券種メニューレイアウトファイルの読込中: {groupSource.Replace(AppDirectory, "")}"); if (!File.Exists(groupSource)) { Throw($"ファイル \"{groupSource}\" の読込に失敗しました。", ErrorType.Warning); } else { XDocument groupDocument = XDocument.Load(groupSource); XElement groupMenuLayout = groupDocument.Element("GroupMenuLayout"); if (groupMenuLayout == null) { Throw($"ファイル \"{IOPath.GetFileName(groupSource)}\" は券種メニューレイアウトファイルではありません。\nGroupMenuLayout タグが見つかりません。", ErrorType.Warning, Screen.GroupMenu); } else { IEnumerable <XElement> groupMenuContents = groupMenuLayout.Elements("Content"); foreach (XElement groupMenuContent in groupMenuContents) { string ticketPluginClassName = (string)groupMenuContent.Attribute("Type") ?? ""; ITicketPlugin ticketPlugin = UserControlHost.TicketPlugins.Find(p => p.GetType().FullName == TicketPluginsNamespace + ticketPluginClassName); if (ticketPluginClassName == "") { } else if (ticketPlugin == null) { Throw($"券種 \"{TicketPluginsNamespace}{ticketPluginClassName}\" が見つかりません。", ErrorType.Warning, Screen.GroupMenu); } else { string typeName = (string)groupMenuContent.Attribute("Name") ?? ""; tickets.Add(new TicketButton() { TypeName = typeName, TicketPlugin = ticketPlugin, }); } } while (tickets.Count % 60 != 0) { tickets.Add(new TicketButton() { TypeName = "", TicketPlugin = null, }); } } } string typicalTicketPluginClassName = (string)content.Attribute("TypicalTicketType") ?? ""; ITicketPlugin typicalTicketPlugin = UserControlHost.TicketPlugins.Find(p => p.GetType().FullName == TicketPluginsNamespace + typicalTicketPluginClassName); if (typicalTicketPluginClassName == "") { } else if (typicalTicketPlugin == null) { Throw($"券種 \"{TicketPluginsNamespace}{typicalTicketPluginClassName}\" が見つかりません。", ErrorType.Warning); } string ticketGroupName = (string)content.Attribute("GroupName") ?? ""; contentInfos.Add(new MainMenuContent() { TicketGroupName = ticketGroupName, TicketGroup = tickets, TypicalTicketName = (string)content.Attribute("TypicalTicketName") ?? "", TypicalTicket = typicalTicketPlugin, Command = new DelegateCommand(() => { UserControlHost.SetCurrentScreen(Screen.None); DoEvents(); UserControlHost.SetCurrentTicket(typicalTicketPlugin, Screen.MainMenu); UserControlHost.SetCurrentScreen(Screen.Tickets); }), OpenTabCommand = new DelegateCommand(() => { UserControlHost.SetCurrentScreen(Screen.None); DoEvents(); ((GroupMenuModel)UserControlHost.Models[Screen.GroupMenu]).CurrentGroup = new TicketGroup(ticketGroupName, tickets); UserControlHost.SetCurrentScreen(Screen.GroupMenu); }), }); n++; } groupBoxInfosChild.Add(new MainMenuGroupBox() { Header = header, Row = row, Contents = contentInfos, }); groupBoxCount++; totalRow += row; i++; } changeProgressStatusAction.Invoke(""); groupBoxInfos.Add(groupBoxInfosChild); if (currentSide == left) { if (totalRow > 5 && !((bool?)left.Attribute("IgnoreRowExcess") ?? false)) { Throw("左側について、行数が多すぎる ( " + totalRow + "行 ) ため、レイアウトが崩れる恐れがあります。\n" + "この警告を表示しないようにするには、Left タグの属性に「IgnoreRowExcess=\"True\"」を追加して下さい。", ErrorType.Warning); } else if (totalRow < 5 && !((bool?)left.Attribute("IgnoreRowShortage") ?? false)) { Throw("左側について、行数が少なすぎる ( " + totalRow + "行 ) ため、" + (5 - totalRow) + " 行分の空白が表示されます。\n" + "この警告を表示しないようにするには、Left タグの属性に「IgnoreRowShortage=\"True\"」を追加して下さい。", ErrorType.Warning); } leftTotalRow = totalRow; leftGroupBoxCount = groupBoxCount; currentSide = right; } else { totalRow++; if (totalRow > 5 && !((bool?)right.Attribute("IgnoreRowExcess") ?? false)) { Throw("右側について、行数が多すぎる ( " + totalRow + "行 ) ため、レイアウトが崩れる恐れがあります。\n" + "この警告を表示しないようにするには、Right タグの属性に「IgnoreRowExcess=\"True\"」を追加して下さい。", ErrorType.Warning); } else if (totalRow < 5 && !((bool?)right.Attribute("IgnoreRowShortage") ?? false)) { Throw("右側について、行数が少なすぎる ( " + totalRow + "行 ) ため、" + (5 - totalRow) + " 行分の空白が表示されます。\n" + "この警告を表示しないようにするには、Right タグの属性に「IgnoreRowShortage=\"True\"」を追加して下さい。", ErrorType.Warning); } else if (leftGroupBoxCount != groupBoxCount) { Throw("グループボックスの個数が左側と右側で異なる ( 左: " + leftGroupBoxCount + "個、右: " + groupBoxCount + "個 ) ため、ボタンの高さが不均一になります。", ErrorType.Warning); } else if (leftTotalRow != totalRow) { Throw("行数の合計が左側と右側で異なる ( 左: " + leftTotalRow + "行、右: " + totalRow + " 行 ) ため、ボタンの高さが不均一になります。", ErrorType.Warning); } } } changeProgressStatusAction.Invoke("メインメニューレイアウトの登録中"); GroupBoxInfos = groupBoxInfos; }
public void LoadFromFile(string path) { void ThrowError(string text, bool isInGroupMenu = false) { string menuName = isInGroupMenu ? "券種メニュー" : "メインメニュー"; UserControlHost.Throw(text, menuName + "設定に関するエラー", ErrorType.Error); } void ThrowWarning(string text, bool isInGroupMenu = false) { string menuName = isInGroupMenu ? "券種メニュー" : "メインメニュー"; UserControlHost.Throw(text, menuName + "設定に関する警告", ErrorType.Warning); } void ThrowInformation(string text, bool isInGroupMenu = false) { string menuName = isInGroupMenu ? "券種メニュー" : "メインメニュー"; UserControlHost.Throw(text, menuName + "設定に関する情報", ErrorType.Warning); } XDocument oneTouchMenuLayoutFile; try { oneTouchMenuLayoutFile = XDocument.Load(path); } catch { ThrowError("ファイル \"" + path + "\" の読込に失敗しました。"); return; } XElement oneTouchMenuLayout = oneTouchMenuLayoutFile.Element("OneTouchMenuLayout"); if (oneTouchMenuLayout == null) { ThrowError("ファイル \"" + IOPath.GetFileName(path) + "\" はワンタッチメニューレイアウトファイルではありません。\n" + "OneTouchMenuLayout タグが見つかりません。"); return; } List <OneTouchMenuGroup> groups = new List <OneTouchMenuGroup>(); foreach (XElement groupElement in oneTouchMenuLayout.Elements("Group")) { XDocument oneTouchMenuGroupFile; string groupPath = IOPath.Combine(IOPath.GetDirectoryName(path), (string)groupElement.Attribute("Source")); try { oneTouchMenuGroupFile = XDocument.Load(groupPath); } catch { ThrowWarning("ファイル \"" + groupPath + "\" の読込に失敗しました。"); continue; } XElement oneTouchMenuGroup = oneTouchMenuGroupFile.Element("OneTouchMenuGroup"); if (oneTouchMenuGroup == null) { ThrowWarning("ファイル \"" + IOPath.GetFileName(groupPath) + "\" はワンタッチメニューグループファイルではありません。\n" + "OneTouchMenuGroup タグが見つかりません。"); continue; } List <TicketButton> shortcuts = new List <TicketButton>(); XElement shortcutsElement = oneTouchMenuGroup.Element("Shortcuts"); if (shortcutsElement == null) { ThrowWarning("ワンタッチメニューグループファイル \"" + IOPath.GetFileName(groupPath) + "\" で Shortcuts タグが見つかりません。", true); } else { foreach (XElement shortcutElement in shortcutsElement.Elements("Shortcut")) { string ticketPluginClassName = (string)shortcutElement.Attribute("Type") ?? ""; ITicketPlugin ticketPlugin = UserControlHost.TicketPlugins.Find(p => p.GetType().FullName == TicketPluginsNamespace + ticketPluginClassName); if (ticketPluginClassName == "") { } else if (ticketPlugin == null) { ThrowWarning("券種 \"" + TicketPluginsNamespace + ticketPluginClassName + "\" が見つかりません。", true); } else { shortcuts.Add(new TicketButton() { TypeName = (string)shortcutElement.Attribute("Name") ?? "", TicketPlugin = ticketPlugin, }); } } while (shortcuts.Count < 9) { shortcuts.Add(new TicketButton() { TypeName = "", TicketPlugin = null, }); } } List <OneTouchMenuGroupPage> pages = new List <OneTouchMenuGroupPage>(); XElement pagesElement = oneTouchMenuGroup.Element("Pages"); if (pagesElement == null) { ThrowWarning("ワンタッチメニューグループファイル \"" + IOPath.GetFileName(groupPath) + "\" で Pages タグが見つかりません。", true); } else { foreach (XElement pageElement in pagesElement.Elements("Page")) { List <TicketButton> buttons = new List <TicketButton>(); foreach (XElement buttonElement in pageElement.Elements("Content")) { string ticketPluginClassName = (string)buttonElement.Attribute("Type") ?? ""; ITicketPlugin ticketPlugin = UserControlHost.TicketPlugins.Find(p => p.GetType().FullName == TicketPluginsNamespace + ticketPluginClassName); if (ticketPluginClassName == "") { } else if (ticketPlugin == null) { ThrowWarning("券種 \"" + TicketPluginsNamespace + ticketPluginClassName + "\" が見つかりません。", true); } else { buttons.Add(new TicketButton() { TypeName = (string)buttonElement.Attribute("Name") ?? "", TicketPlugin = ticketPlugin, Command = (string)buttonElement.Attribute("Command") ?? "", }); } } while (buttons.Count < 90) { buttons.Add(new TicketButton() { TypeName = "", TicketPlugin = null, }); } pages.Add(new OneTouchMenuGroupPage() { Name = (string)pageElement.Attribute("Name") ?? "", Buttons = buttons, }); } while (pages.Count < 10) { pages.Add(new OneTouchMenuGroupPage() { Name = "", Buttons = null, }); } } groups.Add(new OneTouchMenuGroup() { Header = (string)groupElement.Attribute("Header") ?? "", Shortcuts = shortcuts, Pages = pages, }); } while (groups.Count < 9) { groups.Add(new OneTouchMenuGroup() { Header = "", Shortcuts = null, Pages = null, }); } Groups = groups; }