Example #1
0
 private void Throw(string text, ErrorType errorType, Screen menuType = Screen.MainMenu)
 {
     UserControlHost.Throw(text, GetMenuTypeString(menuType) + "設定に関する" + GetErrorTypeString(errorType), errorType);
 }
Example #2
0
        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;
        }