//Handles a click on File->Open private void openFileClick(object sender, RoutedEventArgs e) { if(IsOpened) { var openChoice = MessageBox.Show("Are you sure you want to open a new file? Any unsaved changes to the current file will be lost!", "Open a file", MessageBoxButton.OKCancel); if(openChoice == MessageBoxResult.Cancel) { return; } } OpenFileDialog openDialog = new OpenFileDialog(); openDialog.Filter = "BibTeX files (*.bib)|*.bib|All files (*.*)|*.*"; //http://www.wpf-tutorial.com/dialogs/the-openfiledialog/ openDialog.ShowDialog(); if(openDialog.FileName == "") { return; } //https://msdn.microsoft.com/en-us/library/aa984409(v=vs.71).aspx FileName gets set if the user clicks Cancel, too. try { using (StreamReader openFile = new StreamReader(openDialog.FileName)) //As per lecture slides { BibEntity.entityList.Clear(); //Clear the list, because we're commited to opening a new file now string[] itemArray = openFile.ReadToEnd().Split(new char[] {'@'}, StringSplitOptions.RemoveEmptyEntries); foreach (string item in itemArray) { string entityString = Regex.Match(item, "(BOOK|MASTERSTHESIS|PHDTHESIS|ARTICLE)").Groups[1].Value; string itemTitle = Regex.Match(item, @"title\s*=\s*{(.+)}").Groups[1].Value; //Wanted to write a regex that would catch all Unicode chars (. doesn't) except '}', but I'm not sure if that's possible string itemAuthor = Regex.Match(item, @"author\s*=\s*{(.+)}").Groups[1].Value; int itemYear; try { itemYear = Int32.Parse(Regex.Match(item, @"year\s*=\s*{(.+)}").Groups[1].Value); } catch (Exception exc) { MessageBox.Show("Invalid year! Item \"" + itemTitle + "\" not parsed! " + exc.Message); continue; } DateTime itemEntryDate; try { itemEntryDate = DateTime.Parse(Regex.Match(item, @"timestamp\s*=\s*{(.+)}").Groups[1].Value); } //https://msdn.microsoft.com/en-us/library/1k1skd40(v=vs.110).aspx catch(Exception exc) { MessageBox.Show("Something went wrong! Item \"" + itemTitle + "\" not parsed! " + exc.Message); continue; } string itemUser = Regex.Match(item, @"owner\s*=\s*{(.+)}").Groups[1].Value; BibEntity itemEntity; switch(entityString) { case "BOOK": string itemPublisher = Regex.Match(item, @"publisher\s*=\s*{(.+)}").Groups[1].Value; string itemPublisherAddr = Regex.Match(item, @"address\s*=\s*{(.+)}").Groups[1].Value; itemEntity = new Book(itemTitle, itemAuthor, itemYear, itemPublisher, itemPublisherAddr, EntityType.BOOK, itemEntryDate); itemEntity.User = itemUser; BibEntity.entityList.Add(itemEntity); break; case "MASTERSTHESIS": string itemSchool = Regex.Match(item, @"school\s*=\s*{(.+)}").Groups[1].Value; itemEntity = new Thesis(itemTitle, itemAuthor, itemYear, ThesisType.MASTERSTHESIS, itemSchool, EntityType.THESIS, itemEntryDate); itemEntity.User = itemUser; BibEntity.entityList.Add(itemEntity); break; case "PHDTHESIS": itemSchool = Regex.Match(item, @"school\s*=\s*{(.+)}").Groups[1].Value; itemEntity = new Thesis(itemTitle, itemAuthor, itemYear, ThesisType.PHDTHESIS, itemSchool, EntityType.THESIS, itemEntryDate); itemEntity.User = itemUser; BibEntity.entityList.Add(itemEntity); break; case "ARTICLE": string itemJournal = Regex.Match(item, @"journal\s*=\s*{(.+)}").Groups[1].Value; int itemVolume; try { itemVolume = Int32.Parse(Regex.Match(item, @"volume\s*=\s*{(.+)}").Groups[1].Value); } catch(Exception exc) { MessageBox.Show("Invalid volume! Item \"" + itemTitle + "\" not parsed! " + exc.Message); continue; } itemEntity = new Article(itemTitle, itemAuthor, itemYear, itemJournal, itemVolume, EntityType.ARTICLE, itemEntryDate); itemEntity.User = itemUser; BibEntity.entityList.Add(itemEntity); break; default: //In case of an unparsable entity type MessageBox.Show("Unknown entity type! Item \"" + itemTitle + "\" not parsed!"); break; } } } entryList.Items.Refresh(); IsOpened = true; setControls(true); this.Title = WindowTitle + " (" + openDialog.FileName + ")"; } catch(Exception exc) { MessageBox.Show("Something went wrong! " + exc.Message); return; } }
//Handles a click on the OK button private void btnOKHandle(object sender, RoutedEventArgs e) { if(validateFields()) { if (IsNew) { BibEntity newEntity; switch (entryType) { case EntityType.BOOK: newEntity = new Book(titleField.Text, authorField.Text, parsedYear, publisherField.Text, publisherAddrField.Text, EntityType.BOOK, new DateTime(System.DateTime.Now.Year, System.DateTime.Now.Month, System.DateTime.Now.Day)); BibEntity.entityList.Add(newEntity); break; case EntityType.THESIS: newEntity = new Thesis(titleField.Text, authorField.Text, parsedYear, //v--- I love this cast within a cast (ThesisType)((ComboBoxItem)thesisTypeBox.SelectedItem).Tag, schoolField.Text, EntityType.THESIS, new DateTime(System.DateTime.Now.Year, System.DateTime.Now.Month, System.DateTime.Now.Day)); BibEntity.entityList.Add(newEntity); break; case EntityType.ARTICLE: newEntity = new Article(titleField.Text, authorField.Text, parsedYear, journalField.Text, parsedVolume, EntityType.ARTICLE, new DateTime(System.DateTime.Now.Year, System.DateTime.Now.Month, System.DateTime.Now.Day)); BibEntity.entityList.Add(newEntity); break; } } else { editEntity.Title = titleField.Text; editEntity.Authors = new Author(authorField.Text); editEntity.Year = parsedYear; switch(entryType) { case EntityType.BOOK: editEntity.Publisher = publisherField.Text; editEntity.PublisherAddr = publisherAddrField.Text; break; case EntityType.THESIS: editEntity.ThesisEntityType = (ThesisType)((ComboBoxItem)thesisTypeBox.SelectedItem).Tag; //This cast is so awesome editEntity.School = schoolField.Text; break; case EntityType.ARTICLE: editEntity.Journal = journalField.Text; editEntity.Volume = parsedVolume; break; } } this.Close(); } }