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 Bible load(String fileName) { var xml = XDocument.Load(fileName); var bible = new Bible(); var bookElements = from item in xml.Descendants("b") select item; foreach (XElement bookElement in bookElements) { var book = new Book(); book.name = bookElement.Attribute("n").Value; bible.books.Add(book); var chapterElements = from item in bookElement.Descendants("c") select item; foreach (XElement chapterElement in chapterElements) { var chapter = new Chapter(); chapter.number = Int32.Parse(chapterElement.Attribute("n").Value); book.chapters.Add(chapter); var verseElements = from item in chapterElement.Descendants("v") select item; foreach (XElement verseElement in verseElements) { var verse = new Verse(); verse.number = Int32.Parse(verseElement.Attribute("n").Value); verse.text = verseElement.Value; chapter.verses.Add(verse); } } } return(bible); }
public static ScriptureReference parse(Bible bible, String bookName, String reference) { var scriptureReference = new ScriptureReference(); var book = bible.books.Find(bookItem => bookItem.name.ToLower() == bookName.ToLower()); if (book == null) { throw new Exception("Book does not exist"); } var referenceParts = reference.Split(new char[] { ':', '-' }); scriptureReference.bookName = book.name; scriptureReference.chapterNum = Int32.Parse(referenceParts[0]); var chapter = book.chapters.Find(chapterItem => chapterItem.number == scriptureReference.chapterNum); if (chapter == null) { throw new Exception("Chapter does not exist"); } if (referenceParts.Length > 2) { scriptureReference.verseNumStart = Int32.Parse(referenceParts[1]); scriptureReference.verseNumEnd = Int32.Parse(referenceParts[2]); } else if (referenceParts.Length > 1) { scriptureReference.verseNumStart = Int32.Parse(referenceParts[1]); scriptureReference.verseNumEnd = scriptureReference.verseNumStart; } else { // No verses were specified, so use the whole range scriptureReference.verseNumStart = 1; scriptureReference.verseNumEnd = chapter.verses.Last().number; } if (scriptureReference.verseNumEnd < scriptureReference.verseNumStart) { throw new Exception("Verse range end is before start"); } if (scriptureReference.verseNumStart < chapter.verses.First().number) { throw new Exception("Verse range is before beginning of chapter"); } if (scriptureReference.verseNumEnd > chapter.verses.Last().number) { throw new Exception("Verse range goes past end of chapter"); } return(scriptureReference); }
private void cmbTranslation_SelectionChangeCommitted(object sender, EventArgs e) { var box = (sender as ComboBox); var translationName = box.SelectedItem as string; log.Info($"Selecting translation: {translationName}"); bible = OpenSongBibleReader.LoadTranslation(translationName); var registryKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\WorshipHelper"); registryKey.SetValue("LastBibleTranslation", translationName); }
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(); } } } }