/// <summary> /// Occurs after a new custom XMl part is loaded into the document /// Useful for updating the Navigator /// </summary> /// <param name="NewPart"></param> private void OnPartAfterLoad(CustomXMLPart NewPart) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; try { var converter = new CMLConverter(); //get the chemistry var chemModel = converter.Import(NewPart.XML); //find out which content control macthes the custom XML part try { // ReSharper disable once InconsistentNaming var matchingCC = (from ContentControl cc in _doc.ContentControls orderby cc.Range.Start where CustomXmlPartHelper.GuidFromTag(cc?.Tag) == CustomXmlPartHelper.GetCmlId(NewPart) select cc).First(); //get the ordinal position of the content control int start = 0; foreach (ContentControl cc in _doc.ContentControls) { if (cc.ID == matchingCC.ID) { break; } start += 1; } //insert the new navigator item at the ordinal position var newNavItem = new NavigatorItem() { CMLId = matchingCC?.Tag, ChemicalStructure = NewPart.XML, XMLPart = NewPart, Name = chemModel.ConciseFormula }; try { NavigatorItems.Insert(start, newNavItem); } catch (ArgumentOutOfRangeException) //can happen when there are more content controls than navigator items { //so simply insert the new navigator item at the end NavigatorItems.Add(newNavItem); } } catch (InvalidOperationException) { //sequence contains no elements - thrown on close //just ignore } } catch (Exception ex) { new ReportError(Globals.Chem4WordV3.Telemetry, Globals.Chem4WordV3.WordTopLeft, module, ex).ShowDialog(); } }
/// <summary> /// handles deletion of an XML Part...removes the corresponding navigator item /// </summary> /// <param name="OldPart">The custom XML part that gets deleted</param> private void OnPartBeforeDelete(CustomXMLPart OldPart) { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; try { var oldPart = NavigatorItems.FirstOrDefault(ni => CustomXmlPartHelper.GetCmlId(ni.XMLPart) == CustomXmlPartHelper.GetCmlId(OldPart)); NavigatorItems.Remove(oldPart); } catch (Exception ex) { new ReportError(Globals.Chem4WordV3.Telemetry, Globals.Chem4WordV3.WordTopLeft, module, ex).ShowDialog(); } }
/// <summary> /// Loads up the model initially from the document /// </summary> private void LoadModel() { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; try { var converter = new CMLConverter(); if (NavigatorItems.Any()) { NavigatorItems.Clear(); } if (_doc != null) { Dictionary <string, int> added = new Dictionary <string, int>(); var navItems = from ContentControl ccs in _doc.ContentControls join CustomXMLPart part in _parts on CustomXmlPartHelper.GuidFromTag(ccs?.Tag) equals CustomXmlPartHelper.GetCmlId(part) orderby ccs.Range.Start let chemModel = converter.Import(part.XML) select new NavigatorItem { CMLId = ccs?.Tag, ChemicalStructure = part.XML, XMLPart = part, Name = chemModel.ConciseFormula }; foreach (NavigatorItem navigatorItem in navItems) { string guid = CustomXmlPartHelper.GuidFromTag(navigatorItem.CMLId); if (!string.IsNullOrEmpty(guid)) { if (!added.ContainsKey(guid)) { NavigatorItems.Add(navigatorItem); added.Add(guid, 1); } } } Debug.WriteLine("Number of items loaded = {0}", NavigatorItems.Count); } } catch (Exception ex) { using (var form = new ReportError(Globals.Chem4WordV3.Telemetry, Globals.Chem4WordV3.WordTopLeft, module, ex)) { form.ShowDialog(); } } }
private void NextControl() { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; NavigatorItem ni = DataContext as NavigatorItem; var currentSelPoint = ActiveDocument.ActiveWindow.Selection; try { var linkedControls = from Word.ContentControl cc in ActiveDocument.ContentControls orderby cc.Range.Start where CustomXmlPartHelper.GuidFromTag(cc?.Tag) == CustomXmlPartHelper.GetCmlId(ni.XMLPart) select cc; // Grab current selection point int current = currentSelPoint.Range.End; foreach (Word.ContentControl cc in linkedControls) { if (cc.Range.Start > current) { cc.Range.Select(); ActiveDocument.ActiveWindow.ScrollIntoView(cc.Range); return; } } // Rewind to Start of document current = 0; foreach (Word.ContentControl cc in linkedControls) { if (cc.Range.Start > current) { cc.Range.Select(); ActiveDocument.ActiveWindow.ScrollIntoView(cc.Range); return; } } } catch (NullReferenceException ex) { using (var form = new ReportError(Globals.Chem4WordV3.Telemetry, Globals.Chem4WordV3.WordTopLeft, module, ex)) { form.ShowDialog(); } } }
private static void CreateParts(WordprocessingDocument document, GenerationData data) { //ExtendedFilePropertiesPart extendedFilePropertiesPart1 = document.AddNewPart<ExtendedFilePropertiesPart>("rId3"); //ExtendedFilePropertiesPartHelper.GenerateExtendedFilePropertiesPart1Content(extendedFilePropertiesPart1); var mainDocumentPart1 = document.AddMainDocumentPart(); MainDocumentPartHelper.GenerateMainDocumentPart1Content(mainDocumentPart1, data); var endnotesPart1 = mainDocumentPart1.AddNewPart <EndnotesPart>("rId8"); EndnotesPartHelper.GenerateEndnotesPart1Content(endnotesPart1); var footerPart1 = mainDocumentPart1.AddNewPart <FooterPart>("rId13"); FooterPartHelper.GenerateFooterPart1Content(footerPart1, data); var customXmlPart1 = mainDocumentPart1.AddNewPart <CustomXmlPart>("application/xml", "rId3"); CustomXmlPartHelper.GenerateCustomXmlPart1Content(customXmlPart1); var customXmlPropertiesPart1 = customXmlPart1.AddNewPart <CustomXmlPropertiesPart>("rId1"); CustomXmlPartHelper.GenerateCustomXmlPropertiesPart1Content(customXmlPropertiesPart1); var footnotesPart1 = mainDocumentPart1.AddNewPart <FootnotesPart>("rId7"); FootnotesPartHelper.GenerateFootnotesPart1Content(footnotesPart1); var headerPart1 = mainDocumentPart1.AddNewPart <HeaderPart>("rId12"); HeaderPartHelper.GenerateHeaderPart1Content(headerPart1, data); var customXmlPart2 = mainDocumentPart1.AddNewPart <CustomXmlPart>("application/xml", "rId2"); CustomXmlPartHelper.GenerateCustomXmlPart2Content(customXmlPart2); var customXmlPropertiesPart2 = customXmlPart2.AddNewPart <CustomXmlPropertiesPart>("rId1"); CustomXmlPartHelper.GenerateCustomXmlPropertiesPart2Content(customXmlPropertiesPart2); var numberingDefinitionsPart1 = mainDocumentPart1.AddNewPart <NumberingDefinitionsPart>("rId20"); NumberingDefinitionsPartHelper.GenerateNumberingDefinitionsPart1Content(numberingDefinitionsPart1); var themePart1 = mainDocumentPart1.AddNewPart <ThemePart>("rId16"); ThemePartHelper.GenerateThemePart1Content(themePart1); var customXmlPart3 = mainDocumentPart1.AddNewPart <CustomXmlPart>("application/xml", "rId1"); CustomXmlPartHelper.GenerateCustomXmlPart3Content(customXmlPart3); var customXmlPropertiesPart3 = customXmlPart3.AddNewPart <CustomXmlPropertiesPart>("rId1"); CustomXmlPartHelper.GenerateCustomXmlPropertiesPart3Content(customXmlPropertiesPart3); var webSettingsPart1 = mainDocumentPart1.AddNewPart <WebSettingsPart>("rId6"); WebSettingsPartHelper.GenerateWebSettingsPart1Content(webSettingsPart1); var imagePart1 = mainDocumentPart1.AddNewPart <ImagePart>("image/png", "rId11"); ImagePartHelper.GenerateImagePart1Content(imagePart1); var documentSettingsPart1 = mainDocumentPart1.AddNewPart <DocumentSettingsPart>("rId5"); DocumentSettingsPartHelper.GenerateDocumentSettingsPart1Content(documentSettingsPart1); var fontTablePart1 = mainDocumentPart1.AddNewPart <FontTablePart>("rId15"); FontTablePartHelper.GenerateFontTablePart1Content(fontTablePart1); var imagePart2 = mainDocumentPart1.AddNewPart <ImagePart>("image/png", "rId10"); ImagePartHelper.GenerateImagePart2Content(imagePart2); var styleDefinitionsPart1 = mainDocumentPart1.AddNewPart <StyleDefinitionsPart>("rId4"); StyleDefinitionsPartHelper.GenerateStyleDefinitionsPart1Content(styleDefinitionsPart1); var imagePart3 = mainDocumentPart1.AddNewPart <ImagePart>("image/jpeg", "rId9"); ImagePartHelper.GenerateImagePart3Content(imagePart3); // Profile picture if (data.Personal.ProfilePictureContent != null && data.Personal.ProfilePictureType != null) { var imagePart4 = mainDocumentPart1.AddNewPart <ImagePart>(data.Personal.ProfilePictureType, "rId30"); ImagePartHelper.GenerateProfileImageContent(imagePart4, data.Personal.ProfilePictureContent); } var headerPart2 = mainDocumentPart1.AddNewPart <HeaderPart>("rId14"); HeaderPartHelper.GenerateHeaderPart2Content(headerPart2); var customFilePropertiesPart1 = document.AddNewPart <CustomFilePropertiesPart>("rId4"); CustomFilePropertiesPartHelper.GenerateCustomFilePropertiesPart1Content(customFilePropertiesPart1); SetPackageProperties(document, data); }