private void listNouns_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (editing)
                return;

            Option<Noun> selected = (Option<Noun>)listNouns.SelectedItem;

            if (selected != null)
            {
                if (selectedNoun != null && tmp != null)
                {
                    // save changes
                    selectedNoun.AnalyzeLine(tmp.WriteNoun());

                    // refresh display correctly   
                    int indx = listNouns.SelectedIndex;
                    editing = true;
                    DoFilterNouns();                  
                    listNouns.SelectedIndex = indx;
                    editing = false;
                }

                selectedNoun = selected.Key;

                tmp = _grammarSerializers.NounSerializer.Load(_grammarSerializers.NounSerializer.Write(selectedNoun)); // clone...

                this.controlEditNoun.EditNoun(tmp);

            }
            else
                this.controlEditNoun.EditNoun(null);
        }
        public void SetNoun(Noun noun)
        {
            edited = noun;

            RandomAdjective();

            for (int i = 0; i < cboGenre.Items.Count; i++)
            {
                if (((Option<GrammaticalGender>)cboGenre.Items[i]).Key == edited.IrregularGenre)
                {
                    cboGenre.SelectedIndex = i;
                    cboGenre_SelectedIndexChanged(cboGenre, EventArgs.Empty);
                    break;
                }
            }

            //Display();
        }
        public void EditNoun(Noun noun)
        {
            edited = noun;
            

            if (noun == null)
            {
                editing = true;

                this.eRoot.Text = "";
                this.eRootIrregular.Text = "";
                this.checkConstant.Checked = false;
                this.checkNoPlural.Checked = false;
                this.checkNoSingular.Checked = false;

                editing = false;
            }
            else
            {
                RefreshFields();
            }

        }
        private void SetEdited(Panel targetPanel, Noun noun)
        {
            foreach (Control ctrl in targetPanel.Controls)
            {
                if (!(ctrl is ControlNounCaseEdit))
                    continue;

                ControlNounCaseEdit edit = ctrl as ControlNounCaseEdit;
                if (noun == null)
                    edit.Value = "";
                else
                {
                    string form = NounDecliner.Decliner.MakeWord(
                        noun, edit.InflectionCase, edit.DecliantionNumber);
                    edit.Value = form;
                    edit.PostFixes = NounDecliner.Decliner.GetPostFix(noun.Genre, noun.DeclinationType,
                        edit.InflectionCase, DecliantionNumber.Singular).Split(' ');
                    edit.PostFixIndex = NounGrammar.GetPostFixIndex(noun, DecliantionNumber.Singular, edit.InflectionCase);
                }
            }
        }
        private void bDelete_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show(this, "Na pewno?", "Usuwanie rzeczownika", MessageBoxButtons.YesNo,
                MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                NounCollection.Collection.Nouns.Remove(selectedNoun);
                this.controlEditNoun.EditNoun(null);

                selectedNoun = null;
                tmp = null;

                DoFilterNouns();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (selectedNoun != null && tmp != null)
            {
                // save changes in existing noun
                selectedNoun.AnalyzeLine(tmp.WriteNoun());
                DoFilterNouns();
            }

            selectedNoun = new Noun();
            selectedNoun.Root = "<nowy>";
            tmp = selectedNoun;
            NounCollection.Collection.Nouns.Add(selectedNoun);
            this.controlEditNoun.EditNoun(tmp);

            DoFilterNouns();

            foreach (Option<Noun> opt in this.listNouns.Items)
                if (opt.Key == selectedNoun)
                {
                    this.listNouns.SelectedItem = opt;
                    break;
                }
        }