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;
        }
Example #2
0
        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);
        }
Example #5
0
        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();
                    }
                }
            }
        }