コード例 #1
0
        private void tsmiReaction_Click(object sender, EventArgs e)
        {
            if (!controlsAlreadyCreated)
            {
                BackgroundImage = ChemLab.Properties.Resources.background;                              // Сменя се фоновото изображение
                CreateAndShowPeriodicTable();                                                           // Зарежда се информацията за всички химични елементи, създадат се бутоните и се показва таблицата
                rtbReaction.Visible = true;                                                             // Показва се контролата за извеждане на изравнените реакции
                ShowLegends();                                                                          // Показва надписите за периодите и групите

                controlsAlreadyCreated = true;
            }

            firstReactantFormula  = string.Empty;                                                       // Изчиства се първият избран реагент
            secondReactantFormula = string.Empty;                                                       // Изчиства се вторият избран реагент

            FmFirstReactantMenu fmFirstReactantMenu = new FmFirstReactantMenu();

            fmFirstReactantMenu.ShowDialog();                                                           // Показва се прозорецът с менюто за избор на първия реагент
        }
コード例 #2
0
ファイル: RoundButton.cs プロジェクト: andigold/ChemLab
        protected override void OnMouseClick(MouseEventArgs e)
        {
            if (MouseInCircle(e.Location))                                                                                                  // Събитието натискане на бутон на мишката се отчита само, ако контролът е активен и мишката се намира в рамките на кръга
            {
                FmTable fmTable = (FmTable)Application.OpenForms["FmTable"];
                if (fmTable.FirstReactantFormula == string.Empty)
                {
                    FmFirstReactantMenu fmFirstReactantMenu = (FmFirstReactantMenu)Application.OpenForms["FmFirstReactantMenu"];

                    if (Text == "неметал" || Text == "метал")
                    {
                        Folder        folder    = new Folder();
                        List <string> reactants = folder.LoadReactants();

                        string generalCategory = (Text == "метал") ? "метал" : "неметал";                                                   // Въз основа на надписа се определя основната група елементи, която потребителят е избрал
                        fmTable.EnableButtonsByReactionsAndGeneralCategory(reactants, generalCategory);                                     // Като се знае основната група се филтрират само елементите, за които има въведени реакции и са от същата група

                        fmFirstReactantMenu.ChoiceHasBeenMade = true;                                                                       // Потребителя е направил своя избор
                        fmFirstReactantMenu.Close();                                                                                        // и формата се затваря
                    }
                    else if (Text == "вода")
                    {
                        Element element = new Element();
                        element.SetFirstReactantFormula("H2O");

                        fmFirstReactantMenu.ChoiceHasBeenMade = true;
                        fmFirstReactantMenu.Close();

                        FmSecondReactantMenu fmSecondReactantMenu = new FmSecondReactantMenu();
                        fmSecondReactantMenu.ShowDialog(fmTable);
                    }
                    else if (Text == "киселина" || Text == "основа" || Text == "оксид")                                                     // Ако избраното е "киселина", "основа" или "оксид"
                    {
                        foreach (Control control in fmFirstReactantMenu.Controls)                                                           // се деактивира "вътрешното" меню
                        {
                            if (control is RoundButton)                                                                                     // т.е. всички потребителски контроли показани до момента
                            {
                                RoundButton roundButton = (RoundButton)control;
                                roundButton.Enabled = false;
                            }
                        }

                        fmFirstReactantMenu.OuterMenuCenter = circleCenter;                                                                 // Съхраняват се координатите на центъра на външното меню

                        List <string> outerMenuOptions = fmFirstReactantMenu.LoadOuterMenuOptions(Text);                                    // след това веществата, за които има въведени реакции
                        fmFirstReactantMenu.OuterMenuCenters = new List <Point>(outerMenuOptions.Count);                                    // Определя се броя на центровете за външното меню

                        fmFirstReactantMenu.DrawCircleMenu(circleCenter, fmFirstReactantMenu.OuterMenuRadius,
                                                           fmFirstReactantMenu.OuterMenuCircleRadius, fmFirstReactantMenu.OuterMenuFontSize,
                                                           outerMenuOptions, true, false);                                                  // и по определения нов център и списък с вещества се изчертава "външното" меню
                    }
                    else                                                                                                                    // Във всички останали случаи, потребителят е избрал опция от външното меню
                    {
                        string text = Text.Replace('\n', ' ');                                                                              // Възвръща се оригиналното име на съединението (без знаците за нов ред)

                        Compound compound = new Compound();
                        string   formula  = compound.SearchFormulaByName(text);

                        Element element = new Element();
                        element.SetFirstReactantFormula(formula);                                                                           // След като е открито съвпадение, то се записва като формула за първия реагент

                        fmFirstReactantMenu.ChoiceHasBeenMade = true;
                        fmFirstReactantMenu.Close();

                        FmSecondReactantMenu fmSecondReactantMenu = new FmSecondReactantMenu();
                        fmSecondReactantMenu.ShowDialog(fmTable);
                    }
                }
                else if (fmTable.SecondReactantFormula == string.Empty)
                {
                    FmSecondReactantMenu fmSecondReactantMenu = (FmSecondReactantMenu)Application.OpenForms["FmSecondReactantMenu"];

                    Element element = new Element();

                    if (Text == "неметал" || Text == "метал")
                    {
                        string generalCategory      = (Text == "метал") ? "метал" : "неметал";                                              // Въз основа на надписа се определя основната група елементи, която потребителят е избрал
                        string firstReactantFormula = element.GetFirstReactantFormula();                                                    // и формулата на първия реагент
                        fmTable.EnableButtonsByFirstReactantAndGeneralCategory(generalCategory);                                            // След това, като се знае първия реагент и основната група за втория се филтрират само елементите, които реагират с първия избран и са от същата основна група

                        fmSecondReactantMenu.ChoiceHasBeenMade = true;                                                                      // Потребителя е направил своя избор
                        fmSecondReactantMenu.Close();                                                                                       // и формата се затваря
                    }
                    else if (Text == "водород" || Text == "кислород" || Text == "вода")                                                     // Ако потребителят е избрал опция с надпис водород, кислород или вода
                    {
                        switch (Text)
                        {
                        case "водород": element.SetSecondReactantFormula("H"); break;

                        case "кислород": element.SetSecondReactantFormula("O"); break;

                        case "вода": element.SetSecondReactantFormula("H2O"); break;
                        }
                        fmTable.LoadBalanceAndShowEquations();                                                                              // Понеже формулата е ясна, може направо да се премина към изравняване на реакцията

                        fmSecondReactantMenu.ChoiceHasBeenMade = true;                                                                      // и да се затвори формата с менюто
                        fmSecondReactantMenu.Close();
                    }
                    else if (Text == "киселина" || Text == "основа" || Text == "оксид")                                                     // Ако избраното е "киселина", "основа" или "оксид"
                    {
                        foreach (Control control in fmSecondReactantMenu.Controls)                                                          // се деактивира "вътрешното" меню
                        {
                            if (control is RoundButton)                                                                                     // т.е. всички потребителски контроли показани до момента
                            {
                                RoundButton roundButton = (RoundButton)control;
                                roundButton.Enabled = false;
                            }
                        }

                        fmSecondReactantMenu.OuterMenuCenter = circleCenter;                                                                // Съхраняват се координатите на центъра на външното меню

                        List <string> outerMenuOptions = fmSecondReactantMenu.LoadOuterMenuOptions(Text);                                   // след това веществата, с които реагира първият реагент
                        fmSecondReactantMenu.OuterMenuCenters = new List <Point>(outerMenuOptions.Count);                                   // Определя се броя на центровете за външното меню

                        fmSecondReactantMenu.DrawCircleMenu(circleCenter, fmSecondReactantMenu.OuterMenuRadius,
                                                            fmSecondReactantMenu.OuterMenuCircleRadius, fmSecondReactantMenu.OuterMenuFontSize,
                                                            outerMenuOptions, true, false);                                                 // и по определения нов център и списък с вещества се изчертава "външното" меню
                    }
                    else                                                                                                                    // Във всички останали случаи, потребителят е избрал опция от външното меню
                    {
                        string text = Text.Replace('\n', ' ');                                                                              // Възвръща се оригиналното име на съединението (без знаците за нов ред)

                        Compound compound = new Compound();
                        string   formula  = compound.SearchFormulaByName(text);

                        element.SetSecondReactantFormula(formula);                                                                          // След като е открито съвпадение, то се записва като формула за втория реагент
                        fmTable.LoadBalanceAndShowEquations();

                        fmSecondReactantMenu.ChoiceHasBeenMade = true;
                        fmSecondReactantMenu.Close();
                    }
                }
            }
        }