/// Je kunt er voor kiezen dat een volgende item gewoon niet aangekondigd wordt. Dat gaat
 /// via 'TonenInVolgende'.
 public LiedFormatResult Volgende(ILiturgieRegel volgende)
 {
     // Alleen volgende tonen als volgende er is
     if (volgende != null && volgende.TonenInVolgende)
         return ToonWaarNodigMetVerzen(volgende);
     return null;
 }
 private static LiedFormatResult ToonMetVerzenEnEersteLos(ILiturgieRegel regel, ILiturgieContent vanafDeelHint)
 {
     var result = new LiedFormatResult()
     {
         Naam = regel.Display.Naam
     };
     if (!string.IsNullOrWhiteSpace(regel.Display.SubNaam))
         result.SubNaam = regel.Display.SubNaam;
     if (regel.Content == null)
         result.Verzen = LiedVerzen(regel.Display, true);
     else
     {
         var vanafDeel = vanafDeelHint ?? regel.Content.FirstOrDefault();  // Bij een deel hint tonen we alleen nog de huidige en komende versen
         var gebruikDeelRegels = regel.Content.SkipWhile(r => r != vanafDeel);
         result.Verzen = LiedVerzen(regel.Display, true, gebruikDeelRegels);
     }
     return result;
 }
            private void ToevoegenSlides(ILiturgieRegel regel, ILiturgieContent inhoud, ILiturgieRegel volgende)
            {
                //open de presentatie met de sheets erin
                var presentatie = OpenPps(inhoud.Inhoud);
                //voor elke slide in de presentatie
                var slides = presentatie.AlleSlides().ToList();
                foreach (var shape in slides.SelectMany(s => s.Shapes()).ToList())
                {
                    var textbox = shape as IMppShapeTextbox;
                    var table = shape as IMppShapeTable;

                    if (textbox != null)
                    {
                        var text = textbox.Text;
                        //als de template de tekst bevat "Voorganger: " moet daar de Voorgangersnaam achter komen
                        if (text.Equals("<Voorganger:>"))
                            textbox.Text = _buildDefaults.LabelVoorganger + _buildSettings.Voorganger;
                        //als de template de tekst bevat "Collecte: " moet daar de collectedoel achter komen
                        else if (text.Equals("<Collecte:>"))
                            textbox.Text = _buildDefaults.LabelCollecte + _buildSettings.Collecte1;
                        //als de template de tekst bevat "1e Collecte: " moet daar de 1e collecte achter komen
                        else if (text.Equals("<1e Collecte:>"))
                            textbox.Text = _buildDefaults.LabelCollecte1 + _buildSettings.Collecte1;
                        //als de template de tekst bevat "2e Collecte: " moet daar de 2e collecte achter komen
                        else if (text.Equals("<2e Collecte:>"))
                            textbox.Text = _buildDefaults.LabelCollecte2 + _buildSettings.Collecte2;
                        //als de template de tekst bevat "Volgende" moet daar _altijd_ de Liturgieregel van de volgende sheet komen
                        //(omdat het hier handmatig bepaald wordt door degene die de slides gemaakt heeft)
                        else if (text.Equals("<Volgende>"))
                        {
                            var display = _liedFormatter.Volgende(volgende);
                            textbox.Text = display != null ? $"{_buildDefaults.LabelVolgende} {display.Display}" : string.Empty;
                        }
                        //als de template de tekst bevat "Volgende" moet daar de te lezen schriftgedeeltes komen
                        else if (text.Equals("<Lezen>"))
                            textbox.Text = _buildDefaults.LabelLezen + _buildSettings.Lezen;
                        else if (text.Equals("<Tekst>"))
                            textbox.Text = _buildDefaults.LabelTekst + _buildSettings.Tekst;
                        else if (text.Equals("<Tekst_Onder>"))
                            textbox.Text = _buildSettings.Tekst;
                    }
                    else if (table != null)
                    {
                        if (table.GetTitel().Equals("<Liturgie>"))
                            VulLiturgieTabel(table, _mppFactory, _liedFormatter, _liturgie, _buildSettings.Lezen, _buildSettings.Tekst, _buildDefaults.LabelLiturgieLezen, _buildDefaults.LabelLiturgieTekst, _buildDefaults.LabelLiturgie);
                    }
                }
                //voeg de slides in in het grote geheel
                _slidesGemist += _presentatie.SlidesKopieNaarPresentatie(slides);
                //sluit de geopende presentatie weer af
                presentatie.Dispose();
            }
            private void InvullenTekstOpTemplate(ILiturgieRegel regel, ILiturgieContent inhoud, ILiturgieRegel volgende)
            {
                var tekstOmTeRenderen = inhoud.Inhoud;
                var tekstOmTeRenderenLijst = new List<string>();
                // knip de te renderen tekst in stukken (zodat we van tevoren het aantal weten)
                while (!string.IsNullOrWhiteSpace(tekstOmTeRenderen))
                {
                    // plaats zo veel mogelijk tekst op de slide totdat het niet meer past, krijg de restjes terug
                    var uitzoeken = InvullenLiedTekst(tekstOmTeRenderen);
                    tekstOmTeRenderenLijst.Add(uitzoeken.Invullen);
                    tekstOmTeRenderen = uitzoeken.Over;
                }

                //zolang er nog iets is in te voegen in sheets
                foreach (var tekst in tekstOmTeRenderenLijst)
                {
                    //regel de template om het lied op af te beelden
                    var presentatie = OpenPps(_dependentFileList.FullTemplateLied);
                    var slide = presentatie.EersteSlide();  //alleen eerste slide gebruiken we
                                                            //voor elk object op de slides (we zoeken naar de tekst die vervangen moet worden in de template)
                    foreach (var shape in slide.Shapes().Where(s => s is IMppShapeTextbox).Cast<IMppShapeTextbox>())
                    {
                        var text = shape.Text;
                        //als de template de tekst bevat "Liturgieregel" moet daar de liturgieregel komen
                        if (text.Equals("<Liturgieregel>"))
                            shape.Text = _liedFormatter.Huidig(regel, inhoud).Display;
                        //als de template de tekst bevat "Inhoud" moet daar de inhoud van het vers komen
                        else if (text.Equals("<Inhoud>"))
                            shape.Text = tekst;
                        //als de template de tekst bevat "Volgende" moet daar de Liturgieregel van de volgende sheet komen
                        else if (text.Equals("<Volgende>"))
                        {
                            //we moeten dan wel al op de laatste slide zitten ('InvullenVolgende' is wel al intelligent maar in het geval van 1
                            //lange tekst over meerdere dia's kan 'InvullenVolgende' niet de juiste keuze maken)
                            var display = IsLaatsteSlide(tekstOmTeRenderenLijst, tekst, regel, inhoud) ? _liedFormatter.Volgende(volgende) : null;
                            shape.Text = display != null ? $"{_buildDefaults.LabelVolgende} {display.Display}" : string.Empty;
                        }
                    }
                    //voeg slide in in het grote geheel
                    _slidesGemist += _presentatie.SlidesKopieNaarPresentatie(new List<IMppSlide> { slide });
                    //sluit de template weer af
                    presentatie.Dispose();
                }
            }
 /// Een 'volgende' tekst is alleen relevant om te tonen op de laatste pagina binnen een item voordat 
 /// een nieuw item komt.
 /// Je kunt er echter ook voor kiezen dat een volgende item gewoon niet aangekondigd wordt. Dat gaat
 /// via 'TonenInVolgende'.
 protected static bool IsLaatsteSlide(IEnumerable<string> tekstOmTeRenderen, string huidigeTekst, ILiturgieRegel regel, ILiturgieContent deel)
 {
     return tekstOmTeRenderen.Last() == huidigeTekst && regel.Content.Last() == deel;
 }
            public IVerwerkResultaat Verwerk(ILiturgieRegel regel, ILiturgieRegel volgende)
            {
                // Per onderdeel in de regel moet een sheet komen
                foreach (var inhoud in regel.Content)
                {
                    if (inhoud.InhoudType == InhoudType.Tekst)
                        InvullenTekstOpTemplate(regel, inhoud, volgende);
                    else
                        ToevoegenSlides(regel, inhoud, volgende);
                }

                return new VerwerkResultaat()
                {
                    SlidesGemist = _slidesGemist
                };
            }
 /// <summary>
 /// Uitzoeken wat de volgende is
 /// </summary>
 private static ILiturgieRegel Volgende(IEnumerable<ILiturgieRegel> volledigeLiturgie, ILiturgieRegel huidig)
 {
     var lijst = volledigeLiturgie.ToList();
     var huidigeItemIndex = lijst.IndexOf(huidig);
     return lijst.Skip(huidigeItemIndex + 1).FirstOrDefault();
 }
 public LiedFormatResult Liturgie(ILiturgieRegel regel)
 {
     return ToonWaarNodigMetVerzen(regel);
 }
 public LiedFormatResult Huidig(ILiturgieRegel regel, ILiturgieContent vanafDeel)
 {
     return ToonMetVerzenEnEersteLos(regel, vanafDeel);
 }
 private static LiedFormatResult ToonWaarNodigMetVerzen(ILiturgieRegel regel)
 {
     var result = new LiedFormatResult()
     {
         Naam = regel.Display.NaamOverzicht
     };
     if (!string.IsNullOrWhiteSpace(regel.Display.SubNaam))
         result.SubNaam = regel.Display.SubNaam;
     result.Verzen = LiedVerzen(regel.Display, false, regel.Content);
     return result;
 }
            private void InvullenTekstOpTemplate(ILiturgieRegel regel, ILiturgieRegel volgende)
            {
                var lengteBerekenaar = new LengteBerekenaar(34, "Verdana", 32);
                var tekstPerSlide = OpdelenPerSlide(TekstOpknippen(regel.Content), _buildDefaults.RegelsPerBijbeltekstSlide, lengteBerekenaar);

                //zolang er nog iets is in te voegen in sheets
                foreach (var tekst in tekstPerSlide)
                {
                    //regel de template om de bijbeltekst op af te beelden
                    var presentatie = OpenPps(_dependentFileList.FullTemplateBijbeltekst);
                    var slide = presentatie.EersteSlide();  //alleen eerste slide gebruiken we
                                                            //voor elk object op de slides (we zoeken naar de tekst die vervangen moet worden in de template)
                    foreach (var shape in slide.Shapes().Where(s => s is IMppShapeTextbox).Cast<IMppShapeTextbox>())
                    {
                        var text = shape.Text;
                        //als de template de tekst bevat "Liturgieregel" moet daar de liturgieregel komen
                        if (text.Equals("<Liturgieregel>"))
                            shape.Text = _liedFormatter.Huidig(regel, null).Display;
                        //als de template de tekst bevat "Inhoud" moet daar de inhoud van het vers komen
                        else if (text.Equals("<Inhoud>"))
                            shape.Text = tekst.ToString();
                        //als de template de tekst bevat "Volgende" moet daar de Liturgieregel van de volgende sheet komen
                        else if (text.Equals("<Volgende>"))
                        {
                            //we moeten dan wel al op de laatste slide zitten ('InvullenVolgende' is wel al intelligent maar in het geval van 1
                            //lange tekst over meerdere dia's kan 'InvullenVolgende' niet de juiste keuze maken)
                            var display = tekstPerSlide.Last() == tekst ? _liedFormatter.Volgende(volgende) : null;
                            shape.Text = display != null ? $"{_buildDefaults.LabelVolgende} {display.Display}" : string.Empty;
                        }
                    }
                    //voeg slide in in het grote geheel
                    _slidesGemist += _presentatie.SlidesKopieNaarPresentatie(new List<IMppSlide> { slide });
                    //sluit de template weer af
                    presentatie.Dispose();
                }
            }
            public IVerwerkResultaat Verwerk(ILiturgieRegel regel, ILiturgieRegel volgende)
            {
                InvullenTekstOpTemplate(regel, volgende);

                return new VerwerkResultaat()
                {
                    SlidesGemist = _slidesGemist
                };
            }