public InsertScriptureForm() { log.Info("Loading InsertScriptureForm"); InitializeComponent(); var registryKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\WorshipHelper"); var lastTemplate = registryKey.GetValue("LastScriptureTemplate") as string; var lastBible = registryKey.GetValue("LastBibleTranslation") as string; // Get a list of available templates, populate list and set initial selection log.Debug("Loading scripture templates"); var installedTemplateFiles = Directory.GetFiles($@"{ThisAddIn.appDataPath}\Templates", "*.pptx"); Directory.CreateDirectory($@"{ThisAddIn.userDataPath}\UserTemplates\Scripture"); var userTemplateFiles = Directory.GetFiles($@"{ThisAddIn.userDataPath}\UserTemplates\Scripture", "*.pptx"); foreach (var file in installedTemplateFiles.Concat(userTemplateFiles)) { var template = new ScriptureTemplate(file); cmbTemplate.Items.Add(template); if (template.name == lastTemplate) { cmbTemplate.SelectedItem = template; } } if (cmbTemplate.SelectedItem == null) { cmbTemplate.SelectedIndex = 0; } // Get a list of installed bibles, populate list and set initial selection log.Debug("Loading bibles"); var installedBibleFiles = Directory.GetFiles($@"{ThisAddIn.appDataPath}\Bibles", "*.xmm"); foreach (var file in installedBibleFiles) { var bibleName = file.Split(new char[] { '\\' }).Last().Replace(".xmm", ""); cmbTranslation.Items.Add(bibleName); if (bibleName == lastBible) { cmbTranslation.SelectedItem = bibleName; } } if (cmbTranslation.SelectedItem == null) { cmbTranslation.SelectedIndex = 0; } // Initialise so that we can populate the books log.Debug($"Loading default bible ({cmbTranslation.SelectedItem})"); bible = OpenSongBibleReader.LoadTranslation(cmbTranslation.SelectedItem as string); var source = new AutoCompleteStringCollection(); log.Debug("Adding books"); source.AddRange(bible.books.Select(book => book.name).ToArray()); txtBook.AutoCompleteMode = AutoCompleteMode.SuggestAppend; txtBook.AutoCompleteSource = AutoCompleteSource.CustomSource; txtBook.AutoCompleteCustomSource = source; }
public void addScripture(ScriptureTemplate template, Bible bible, string bookName, int chapterNum, int verseNumStart, int verseNumEnd) { log.Debug($"Inserting scripture from {bookName} {chapterNum}:{verseNumStart}-{verseNumEnd} ({bible.name}) using template {template.name}"); var verseCount = verseNumEnd - verseNumStart + 1; Application app = Globals.ThisAddIn.Application; // Copy the template from the template presentation, and close it Presentation templatePresentation = app.Presentations.Open(template.path, msoTrue, msoFalse, msoFalse); var currentSlide = newSlideFromTemplate(templatePresentation); templatePresentation.Close(); var objBodyTextBox = currentSlide.Shapes[2]; var objDescTextBox = currentSlide.Shapes[3]; var originalFontSize = objBodyTextBox.TextFrame.TextRange.Font.Size; var translation = bible.name; var chapter = bible.books.Where(item => item.name == bookName).First().chapters.Where(item => item.number == chapterNum).First(); var verseList = chapter.verses.Where(verse => verse.number >= verseNumStart && verse.number <= verseNumEnd).OrderBy(verse => verse.number).ToList(); var reference = $"{bookName} {chapterNum}:{verseNumStart}-{verseNumEnd} ({translation})"; objBodyTextBox.TextFrame.TextRange.Text = ""; objDescTextBox.TextFrame.TextRange.Text = reference; var startSlideIndex = currentSlide.SlideIndex; var numSlidesAdded = 0; for (int i = 0; i < verseCount; i++) { log.Debug($"Adding verse {verseList[i].number}"); var originalText = objBodyTextBox.TextFrame.TextRange.Text; var verseText = "$" + verseList[i].number + "$ " + verseList[i].text + " "; objBodyTextBox.TextFrame.TextRange.Text = objBodyTextBox.TextFrame.TextRange.Text + verseText; if (objBodyTextBox.Height > maxHeight) { if (originalText == "") { // The verse is so long it cannot fit on the slide - make it smaller while (objBodyTextBox.Height > maxHeight) { objBodyTextBox.TextFrame.TextRange.Font.Size -= 1; } } else { log.Debug($"Adding new slide"); // We have overshot the space available on our slide, so *undo* the extra text insertion objBodyTextBox.TextFrame.TextRange.Text = originalText; // ... and move to a new slide currentSlide = currentSlide.Duplicate()[1]; numSlidesAdded++; objBodyTextBox = currentSlide.Shapes[2]; objDescTextBox = currentSlide.Shapes[3]; objBodyTextBox.TextFrame.TextRange.Font.Size = originalFontSize; objBodyTextBox.TextFrame.TextRange.Text = ""; objDescTextBox.TextFrame.TextRange.Text = reference; i--; } } } var endSlideIndex = startSlideIndex + numSlidesAdded; // Find the verse numbers (prefixed with a $) and superscript them, and remove the $ for (int slideIndex = startSlideIndex; slideIndex <= endSlideIndex; slideIndex++) { currentSlide = app.ActivePresentation.Slides[slideIndex]; objBodyTextBox = currentSlide.Shapes[2]; foreach (Verse verse in verseList) { string toFind = "$" + verse.number + "$"; int verseIndex = objBodyTextBox.TextFrame.TextRange.Text.IndexOf(toFind); if (verseIndex > -1) { objBodyTextBox.TextFrame.TextRange.Characters(verseIndex + 1, toFind.Length).Font.Superscript = msoTrue; objBodyTextBox.TextFrame.TextRange.Characters(verseIndex + 1, 1).Delete(); objBodyTextBox.TextFrame.TextRange.Characters(verseIndex + toFind.Length - 1, 1).Delete(); } } } }