Esempio n. 1
0
        public override async Task SaveAsync()
        {
            IsSaving = true;
            IncrementApplicationBusyEventMessage.Publish("AddSongMultiLineTextEditViewModel.SaveAsync");
            //DisableNavigationRequestedEventMessage.Publish();
            var thinkId = Guid.NewGuid();

            History.Events.ThinkingAboutTargetEvent.Publish(thinkId);
            try
            {
                //TODO: PUT ALL SAVE SONG STUFF INTO ONE SAVER COMMAND OBJECT.  THIS OBJECT SHOULD TAKE THE ENTERED SONG INFO, PARSE THE SONG, AND SAVE ALL SUBPHRASES AS WE DO HERE.  THIS SHOULD *NOT* GO INTO THE SONGEDIT MODEL SAVE, AS THE SONG MODEL SHOULD NOT PARSE EVERY TIME IT IS SAVED.

                ///when we save the song lyrics, we want to...
                ///  1) Parse each text line into a subphrase, parse each subphrase into a word-subphrase
                ///     if subphrase is unique and not already in the database, save that subphrase
                ///  2) Create LineEdits from text lines and add these to the song model.
                ///  3) Save the song model itself.
                ///e.g.
                ///  this is line one
                ///  this is line two
                ///  this is line three
                ///  subphrases: "this is line one" "this is line two" "this is line three"
                ///  word-subphrases: "this" "is" "line" "one" "two" "three"

                #region PARSE THE SONGTEXT INTO LINES AND ADD TO MODEL.LINES
                {
                    var songText     = SongText;
                    var languageText = SongLanguage.Text;
                    var lines        = songText.ParseIntoLines(); //removes empty entries
                    var words        = songText.ParseIntoWords();
                    var wordCount    = words.Count;
                    var escapeHelper = 0;
                    while (words.Contains(""))
                    {
                        History.Events.ThinkedAboutTargetEvent.Publish();

                        //ESCAPE HELPER TO ESCAPE IN CASE OF INFINITE LOOP WITH WHILE STATEMENT.
                        //I WANT THE WHILE LOOP TO USE THE QUICKNESS OF CONTAINS(),
                        //AS OPPOSED TO FOREACH-ING OR FOR-ING.  BUT I HATE POSSIBILITY OF
                        //ENDLESS LOOP, EVEN THOUGH I DON'T SEE HOW IT COULD HAPPEN.
                        words.Remove("");
                        escapeHelper++;
                        if (escapeHelper > wordCount)
                        {
                            break;
                        }
                    }

                    //I'M CHANGING THIS TO UTILIZE MY LINELIST.NEWLINELIST(INFOS) ALREADY IN
                    //PLACE.
                    //SO AT THIS TIME, WE ONLY NEED TO SAVE THE WORDS THEMSELVES.  THE LINES
                    //WILL BE SAVED IN FUTURE STEP IN THIS BLOCK.
                    var allWords = new List <string>(words);

                    #region REMOVE ALL WORDS THAT ALREADY EXIST IN DB, SO THAT WE ARE LEFT WITH ONLY NEW WORDS

                    //WE DON'T WANT TO ADD DUPLICATE WORDS TO THE DB, SO CHECK TO SEE IF ANY
                    //OF THESE WORDS ALREADY EXIST IN DB.
                    var removeCmd = await RemoveAlreadyExistingPhraseTextsCommand.ExecuteAsync(languageText, allWords);

                    var allWordsNotAlreadyInDatabase = removeCmd.PrunedPhraseTexts;

                    #region CREATE PHRASE FOR EACH NEW WORD

                    var criteria = new Business.Criteria.PhraseTextsCriteria(languageText,
                                                                             allWordsNotAlreadyInDatabase);
                    History.Events.ThinkedAboutTargetEvent.Publish();
                    var phraseListContainingAllWordsNotAlreadyInDatabase =
                        await PhraseList.NewPhraseListAsync(criteria);

                    History.Events.ThinkedAboutTargetEvent.Publish();

                    #region SAVE ALL WORDS THAT ARE NEW (NOT ALREADY IN DATABASE)

                    //phraseListContainingAllWordsNotAlreadyInDatabase =
                    //  await phraseListContainingAllWordsNotAlreadyInDatabase.SaveAsync();
                    //SO NOW, ALL OF OUR SONG'S WORDS THAT WERE NOT ALREADY IN THE DATABASE
                    //ARE INDEED NOW STORED IN THE DATABASE.

                    #region CREATE LINEEDIT OBJECTS FOR EACH TEXT LINE AND ADD TO MODEL

                    var lineInfoDictionary = new Dictionary <int, string>();
                    for (int i = 0; i < lines.Count; i++)
                    {
                        History.Events.ThinkedAboutTargetEvent.Publish();
                        lineInfoDictionary.Add(i, lines[i]);
                    }

                    //WE NOW HAVE INFO DICTIONARY WHICH HAS LINE NUMBER AND CORRESPONDING LINE TEXT
                    //CREATE A NEW LINELIST WITH THIS CRITERIA WILL CREATE PHRASES WITH EACH LINE TEXT,
                    //AND LINEEDITS OBJECT FOR EACH LINE NUMBER + PHRASE.
                    var criteria2 = new Business.Criteria.LineInfosCriteria(languageText, lineInfoDictionary);
                    Model.Lines = await LineList.NewLineListAsync(criteria2);

                    //WE NOW HAVE A LIST OF LINEEDITS, EACH WITH A PHRASE WITH A SINGLE LINE OF TEXT AND LINE NUMBER.
                    //SET OUR MODEL.LINES TO THIS LINELIST
                    History.Events.ThinkedAboutTargetEvent.Publish();

                    #region SET SONG TITLE (IF NECESSARY)
                    //IF THE SONGTITLE IS EMPTY, THEN USE THE FIRST LINE OF THE SONG AS THE SONG TITLE
                    if (string.IsNullOrEmpty(Model.Title))
                    {
                        Model.Title = ViewViewModelResources.AutoTitlePrefix + Model.Lines.GetLine(0).Phrase.Text;
                    }
                    #endregion
                    History.Events.ThinkedAboutTargetEvent.Publish();

                    #region ADD METADATA TYPEISSONG

                    Model.AddMetadata(BusinessResources.MetadataKeyType,
                                      BusinessResources.MetadataValueTypeSong);

                    #endregion

                    #region SAVE THE ACTUAL SONG MODEL

                    //NOW WE CAN USE THE BASE SAVE
                    History.Events.ThinkedAboutTargetEvent.Publish();
                    await base.SaveAsync();

                    SongHasBeenSaved = true;
                    IsSaving         = false;
                    History.Events.ThinkedAboutTargetEvent.Publish();

                    #endregion

                    #endregion

                    #endregion

                    #endregion

                    #endregion
                }
                #endregion
            }
            finally
            {
                History.Events.ThinkedAboutTargetEvent.Publish(thinkId);
                //EnableNavigationRequestedEventMessage.Publish();
                DecrementApplicationBusyEventMessage.Publish("AddSongMultiLineTextEditViewModel.SaveAsync");
            }
        }
Esempio n. 2
0
        /// <summary>
        /// When the viewmodel is shown, we know we are the entity that started it.  We should
        /// publish an event saying we are studying an entire line.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //private void ViewModelShownWhenStudyingAnEntireLine(object sender, EventArgs e)
        //{
        //  var viewModel = (IStudyItemViewModelBase)sender;
        //  var reviewMethodId = viewModel.ReviewMethodId;
        //  var reviewingLineEvent = new History.Events.ReviewingLineEvent(_Target, reviewMethodId);
        //  HistoryPublisher.Ton.PublishEvent(reviewingLineEvent);
        //}

        private async Task PopulateStudiersWithAggregatePhraseTexts()
        {
            if (_AbortIsFlagged)
            {
                return;
            }
            _Studiers.Clear();
            _LastStudiedIndex = -1;

            #region IF WE ONLY HAVE ONE AGGREGATE PHRASE TEXT, THEN POPULATE OUR STUDIER WITH OUR TARGET LINE

            if (AggregatePhraseTexts.Count == 1)
            {
                var studier = new DefaultPhraseMeaningStudier();
                #region Thinking (try..)
                var targetId = Guid.NewGuid();
                History.Events.ThinkingAboutTargetEvent.Publish(targetId);
                try
                {
                    #endregion
                    await studier.InitializeForNewStudySessionAsync(_Target.Phrase);

                    #region (...finally) Thinked
                }
                finally
                {
                    History.Events.ThinkedAboutTargetEvent.Publish(targetId);
                }
                #endregion
                _Studiers.Add(0, studier);
                return;
            }

            #endregion

            var phraseTextsCriteria =
                new Business.Criteria.PhraseTextsCriteria(_Target.Phrase.Language.Text, AggregatePhraseTexts);
            PhraseList phraseList = null;
            #region Thinking (try..)
            var targetId2 = Guid.NewGuid();
            History.Events.ThinkingAboutTargetEvent.Publish(targetId2);
            try
            {
                #endregion
                phraseList = await PhraseList.NewPhraseListAsync(phraseTextsCriteria);

                #region (...finally) Thinked
            }
            finally
            {
                History.Events.ThinkedAboutTargetEvent.Publish(targetId2);
            }
            #endregion
            if (_AbortIsFlagged)
            {
                return;
            }

            List <PhraseEdit> unknownPhraseEdits = new List <PhraseEdit>();
            for (int i = 0; i < AggregatePhraseTexts.Count; i++)
            {
                if (_AbortIsFlagged)
                {
                    return;
                }
                var results = from phrase in phraseList
                              where phrase.Text == AggregatePhraseTexts[i]
                              select phrase;
                unknownPhraseEdits.Insert(i, results.First());
            }

            //WE NOW HAVE AN ORDERED LIST OF KNOWN AND UNKNOWN AGGREGATE PHRASEEDITS.
            //WE NEED TO FIND, AND KEEP IN RELATIVE ORDER, ONLY THE UNKNOWN PHRASEEDITS.
            //EACH PHRASE EDIT IS THE SAME INDEX AS ITS PHRASETEXT COUNTERPART.

            //WE NEED TO FIND THE COUNT OF UNKNOWN TEXTS FIRST, TO INCREMENT OUR COUNTER FOR ASYNC FUNCTIONALITY.
            int unknownCount = 0;
            for (int i = 0; i < AggregatePhraseTexts.Count; i++)
            {
                if (_AbortIsFlagged)
                {
                    return;
                }

                var phraseText = AggregatePhraseTexts[i];
                if (!IsPhraseKnown(phraseText))
                {
                    unknownCount++;
                }
            }

            //UNKNOWNRELATIVEORDER: UNKNOWN IN THAT OUR PHRASE IS UNKNOWN.  RELATIVE ORDER MEANS
            //THE ORDER/POSITION OF THIS PHRASE RELATIVE TO THE OTHER _UNKNOWN_ PHRASES.
            var unknownRelativeOrder = -1;
            int initializedCount     = 0;
            for (int i = 0; i < AggregatePhraseTexts.Count; i++)
            {
                if (_AbortIsFlagged)
                {
                    return;
                }

                var phraseText = AggregatePhraseTexts[i];
                if (IsPhraseKnown(phraseText))
                {
                    continue;
                }

                //PHRASE IS UNKNOWN, SO INC OUR RELATIVE ORDER AND ADD THE STUDIER TO STUDIERS, INITIALIZING EACH STUDIER.
                unknownRelativeOrder++;
                var studier = new DefaultPhraseMeaningStudier();
                #region Thinking (try..)
                var targetId3 = Guid.NewGuid();
                History.Events.ThinkingAboutTargetEvent.Publish(targetId3);
                try
                {
                    #endregion
                    await studier.InitializeForNewStudySessionAsync(unknownPhraseEdits[i]);

                    #region (...finally) Thinked
                }
                finally
                {
                    History.Events.ThinkedAboutTargetEvent.Publish(targetId3);
                }
                #endregion
                if (_AbortIsFlagged)
                {
                    return;
                }

                _Studiers.Add(unknownRelativeOrder, studier);
                initializedCount++;
                //IF WE HAVE INITIALIZED ALL OF OUR UNKNOWN PHRASES, THEN WE ARE DONE AND CAN CALL CALLBACK.
                if (initializedCount == unknownCount)
                {
                    return;
                }
            }

            //THIS LINE IS ENTIRELY KNOWN, SO INITIALIZE A NEW STUDIER WITH THE ENTIRE LINE.
            if (unknownCount == 0)
            {
                var studier = new DefaultPhraseMeaningStudier();

                #region Thinking (try..)
                var targetId4 = Guid.NewGuid();
                History.Events.ThinkingAboutTargetEvent.Publish(targetId4);
                try
                {
                    #endregion
                    await studier.InitializeForNewStudySessionAsync(_Target.Phrase);

                    #region (...finally) Thinked
                }
                finally
                {
                    History.Events.ThinkedAboutTargetEvent.Publish(targetId4);
                }
                #endregion
                _Studiers.Add(0, studier);
                return;
            }
        }