public string GetStory(string strLanguage) { //Little bit of data required for following steps XmlDocument xmlDoc = _objCharacter.LoadData("lifemodules.xml", strLanguage); XPathNavigator xdoc = _objCharacter.LoadDataXPath("lifemodules.xml", strLanguage); //Generate list of all life modules (xml, we don't save required data to quality) this character has List <XmlNode> modules = new List <XmlNode>(10); foreach (Quality quality in _objCharacter.Qualities) { if (quality.Type == QualityType.LifeModule) { modules.Add(Quality.GetNodeOverrideable(quality.SourceIDString, xmlDoc)); } } //Sort the list (Crude way, but have to do) for (int i = 0; i < modules.Count; i++) { string stageName = xdoc.SelectSingleNode("chummer/stages/stage[@order = " + (i <= 4 ? (i + 1).ToString(GlobalOptions.InvariantCultureInfo).CleanXPath() : "\"5\"") + "]")?.Value; int j; for (j = i; j < modules.Count; j++) { if (modules[j]["stage"]?.InnerText == stageName) { break; } } if (j != i && j < modules.Count) { XmlNode tmp = modules[i]; modules[i] = modules[j]; modules[j] = tmp; } } string[] story = new string[modules.Count]; object storyLock = new object(); XPathNavigator xmlBaseMacrosNode = xdoc.SelectSingleNode("/chummer/storybuilder/macros"); //Actually "write" the story Parallel.For(0, modules.Count, i => { XmlNode objStoryModule = modules[i]; StringBuilder sbdModuleString = new StringBuilder(); Write(sbdModuleString, objStoryModule["story"]?.InnerText ?? string.Empty, 5, xmlBaseMacrosNode); lock (storyLock) story[i] = sbdModuleString.ToString(); }); return(string.Join(Environment.NewLine + Environment.NewLine, story)); }
private async void treModules_AfterSelect(object sender, TreeViewEventArgs e) { bool blnSelectAble; if (e.Node.Nodes.Count == 0) { blnSelectAble = true; } else { //Select any node that have an id node equal to tag string selectString = "//*[id = " + e.Node.Tag.ToString().CleanXPath() + "]/selectable"; XmlNode node = _xmlDocument.SelectSingleNode(selectString); //if it contains >selectable>True</selectable>, yes or </selectable> //set button to selectable, otherwise not blnSelectAble = (node != null && (node.InnerText == bool.TrueString || node.OuterXml.EndsWith("/>", StringComparison.Ordinal))); } _strSelectedId = (string)e.Node.Tag; XmlNode xmlSelectedNodeInfo = Quality.GetNodeOverrideable(_strSelectedId, await _objCharacter.LoadDataAsync("lifemodules.xml")); if (xmlSelectedNodeInfo != null) { await cmdOK.DoThreadSafeAsync(x => x.Enabled = blnSelectAble); await cmdOKAdd.DoThreadSafeAsync(x => x.Enabled = blnSelectAble); await lblBP.DoThreadSafeAsync(x => x.Text = xmlSelectedNodeInfo["karma"]?.InnerText ?? string.Empty); string strSpace = await LanguageManager.GetStringAsync("String_Space"); await lblSource.DoThreadSafeAsync(x => x.Text = xmlSelectedNodeInfo["source"]?.InnerText ?? string.Empty + strSpace + xmlSelectedNodeInfo["page"]?.InnerText); await lblStage.DoThreadSafeAsync(x => x.Text = xmlSelectedNodeInfo["stage"]?.InnerText ?? string.Empty); } else { string strError = await LanguageManager.GetStringAsync("String_Error"); await lblBP.DoThreadSafeAsync(x => x.Text = strError); await lblStage.DoThreadSafeAsync(x => x.Text = strError); await lblSource.DoThreadSafeAsync(x => x.Text = strError); await cmdOK.DoThreadSafeAsync(x => x.Enabled = false); await cmdOKAdd.DoThreadSafeAsync(x => x.Enabled = false); } }
public string GetStory(string strLanguage) { //Little bit of data required for following steps XmlDocument xdoc = XmlManager.Load("lifemodules.xml", strLanguage); //Generate list of all life modules (xml, we don't save required data to quality) this character has List <XmlNode> modules = new List <XmlNode>(); foreach (Quality quality in _objCharacter.Qualities) { if (quality.Type == QualityType.LifeModule) { modules.Add(Quality.GetNodeOverrideable(quality.QualityId, xdoc)); } } //Sort the list (Crude way, but have to do) for (int i = 0; i < modules.Count; i++) { string stageName = xdoc.SelectSingleNode(i <= 4 ? "chummer/stages/stage[@order = \"" + (i + 1).ToString() + "\"]" : "chummer/stages/stage[@order = \"5\"]")?.InnerText; int j; for (j = i; j < modules.Count; j++) { if (modules[j]["stage"] != null && modules[j]["stage"].InnerText == stageName) { break; } } if (j != i && j < modules.Count) { XmlNode tmp = modules[i]; modules[i] = modules[j]; modules[j] = tmp; } } string[] story = new string[modules.Count]; object storyLock = new object(); //Actually "write" the story Parallel.For(0, modules.Count, i => { XmlNode objStoryModule = modules[i]; StringBuilder objModuleString = new StringBuilder(); Write(objModuleString, objStoryModule["story"]?.InnerText ?? string.Empty, 5, xdoc); lock (storyLock) story[i] = objModuleString.ToString(); }); return(string.Join(Environment.NewLine + Environment.NewLine, story)); }
public async ValueTask <string> GetStory(string strLanguage) { //Little bit of data required for following steps XmlDocument xmlDoc = await _objCharacter.LoadDataAsync("lifemodules.xml", strLanguage); XPathNavigator xdoc = await _objCharacter.LoadDataXPathAsync("lifemodules.xml", strLanguage); //Generate list of all life modules (xml, we don't save required data to quality) this character has List <XmlNode> modules = new List <XmlNode>(10); foreach (Quality quality in _objCharacter.Qualities) { if (quality.Type == QualityType.LifeModule) { modules.Add(Quality.GetNodeOverrideable(quality.SourceIDString, xmlDoc)); } } //Sort the list (Crude way, but have to do) for (int i = 0; i < modules.Count; i++) { string stageName = xdoc.SelectSingleNode("chummer/stages/stage[@order = " + (i <= 4 ? (i + 1).ToString(GlobalSettings.InvariantCultureInfo).CleanXPath() : "\"5\"") + ']')?.Value; int j; for (j = i; j < modules.Count; j++) { if (modules[j]["stage"]?.InnerText == stageName) { break; } } if (j != i && j < modules.Count) { (modules[i], modules[j]) = (modules[j], modules[i]); } } string[] story = new string[modules.Count]; XPathNavigator xmlBaseMacrosNode = xdoc.SelectSingleNodeAndCacheExpression("/chummer/storybuilder/macros"); //Actually "write" the story await Task.Run(() => Parallel.For(0, modules.Count, i => { using (new FetchSafelyFromPool <StringBuilder>(Utils.StringBuilderPool, out StringBuilder sbdTemp)) { story[i] = Write(sbdTemp, modules[i]["story"]?.InnerText ?? string.Empty, 5, xmlBaseMacrosNode).ToString(); } }));
private void treModules_AfterSelect(object sender, TreeViewEventArgs e) { bool blnSelectAble; if (e.Node.Nodes.Count == 0) { blnSelectAble = true; } else { //Select any node that have an id node equal to tag String selectString = "//*[id = \"" + e.Node.Tag + "\"]/selectable"; XmlNode node = _xmlDocument.SelectSingleNode(selectString); //if it contains >selectable>true</selectable>, yes or </selectable> //set button to selectable, otherwise not blnSelectAble = (node != null && (node.InnerText == "true" || node.InnerText == "yes" || node.OuterXml.EndsWith("/>"))); } _selectedId = (string)e.Node.Tag; XmlNode selectedNodeInfo = Quality.GetNodeOverrideable(_selectedId); if (selectedNodeInfo != null) { cmdOK.Enabled = blnSelectAble; cmdOKAdd.Enabled = blnSelectAble; lblBP.Text = selectedNodeInfo["karma"] != null ? selectedNodeInfo["karma"].InnerText : string.Empty; lblSource.Text = (selectedNodeInfo["source"] != null ? selectedNodeInfo["source"].InnerText : string.Empty) + " " + (selectedNodeInfo["page"] != null ? selectedNodeInfo["page"].InnerText : string.Empty); lblStage.Text = selectedNodeInfo["stage"] != null ? selectedNodeInfo["stage"].InnerText : string.Empty; } else { lblBP.Text = "ERROR"; lblStage.Text = "ERROR"; lblSource.Text = "ERROR"; cmdOK.Enabled = false; cmdOKAdd.Enabled = false; } }
private void treModules_AfterSelect(object sender, TreeViewEventArgs e) { bool blnSelectAble; if (e.Node.Nodes.Count == 0) { blnSelectAble = true; } else { //Select any node that have an id node equal to tag string selectString = "//*[id = \"" + e.Node.Tag + "\"]/selectable"; XmlNode node = _xmlDocument.SelectSingleNode(selectString); //if it contains >selectable>True</selectable>, yes or </selectable> //set button to selectable, otherwise not blnSelectAble = (node != null && (node.InnerText == bool.TrueString || node.OuterXml.EndsWith("/>"))); } _selectedId = (string)e.Node.Tag; XmlNode selectedNodeInfo = Quality.GetNodeOverrideable(_selectedId, XmlManager.Load("lifemodules.xml", GlobalOptions.Language)); if (selectedNodeInfo != null) { cmdOK.Enabled = blnSelectAble; cmdOKAdd.Enabled = blnSelectAble; lblBP.Text = selectedNodeInfo["karma"]?.InnerText ?? string.Empty; lblSource.Text = selectedNodeInfo["source"]?.InnerText ?? string.Empty + ' ' + selectedNodeInfo["page"]?.InnerText; lblStage.Text = selectedNodeInfo["stage"]?.InnerText ?? string.Empty; } else { lblBP.Text = LanguageManager.GetString("String_Error", GlobalOptions.Language); lblStage.Text = LanguageManager.GetString("String_Error", GlobalOptions.Language); lblSource.Text = LanguageManager.GetString("String_Error", GlobalOptions.Language); cmdOK.Enabled = false; cmdOKAdd.Enabled = false; } }
public String GetStory() { //Little bit of data required for following steps XmlDocument xdoc = XmlManager.Instance.Load("lifemodules.xml"); if (xdoc != null) { //Generate list of all life modules (xml, we don't save required data to quality) this character has List <XmlNode> modules = new List <XmlNode>(); foreach (Quality quality in _objCharacter.Qualities) { if (quality.Type == QualityType.LifeModule) { modules.Add(Quality.GetNodeOverrideable(quality.QualityId)); } } //Sort the list (Crude way, but have to do) for (int i = 0; i < modules.Count; i++) { String stageName = string.Empty; if (i <= 4) { stageName = xdoc.SelectSingleNode("chummer/stages/stage[@order = \"" + (i + 1) + "\"]").InnerText; } else { stageName = xdoc.SelectSingleNode("chummer/stages/stage[@order = \"" + 5 + "\"]").InnerText; } int j; for (j = i; j < modules.Count; j++) { if (modules[j]["stage"] != null && modules[j]["stage"].InnerText == stageName) { break; } } if (j != i && j < modules.Count) { XmlNode tmp = modules[i]; modules[i] = modules[j]; modules[j] = tmp; } } StringBuilder story = new StringBuilder(); //Acctualy "write" the story foreach (XmlNode module in modules) { if (module["story"] != null) { Write(story, module["story"].InnerText, 5); story.Append(Environment.NewLine); story.Append(Environment.NewLine); } } return(story.ToString()); } return(string.Empty); }