public static bool doesConditionUseQuestion(XPathsPartEntry xppe, conditions conditions, condition c, string questionID) { //List<xpathsXpath> xpaths = ConditionsPartEntry.getXPathsUsedInCondition(c, xppe); List<xpathsXpath> xpaths = new List<xpathsXpath>(); c.listXPaths(xpaths, conditions, xppe.getXPaths()); foreach (xpathsXpath xpathObj in xpaths) { String xpathVal = xpathObj.dataBinding.xpath; if (xpathVal.StartsWith("/")) { // simple //System.out.println("question " + xpathObj.getQuestionID() // + " is in use via boolean condition " + conditionId); if (xpathObj.questionID.Equals(questionID)) { return true; } } else if (xpathVal.Contains("position")) { continue; } else { //System.out.println(xpathVal); String qid = xpathVal.Substring( xpathVal.LastIndexOf("@id") + 5); // System.out.println("Got qid: " + qid); qid = qid.Substring(0, qid.IndexOf("'")); // System.out.println("Got qid: " + qid); //System.out.println("question " + qid // + " is in use via condition " + conditionId); if (qid.Equals(questionID)) { return true; } } } return false; }
/// <summary> /// Allocate the condition an ID, and add it /// </summary> /// <param name="condition"></param> public void add(condition condition, string suggestedId) { //Dictionary<string, string> conditionsById = new Dictionary<string, string>(); //foreach (condition xx in conditions.condition) //{ // conditionsById.Add(xx.id, ""); //} //condition.id = IdGenerator.generateIdForXPath(conditionsById, null, null, suggestedId); condition.id = IdHelper.GenerateShortID(5); conditions.condition.Add(condition); save(); log.Debug("Condition written!"); }
public FormConditionBuilder(Word.ContentControl cc, ConditionsPartEntry cpe, condition existingCondition) { InitializeComponent(); // NET 4 way; see http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.extensions.aspx FabDocxState fabDocxState = (FabDocxState)Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument).Tag; // NET 3.5 way, which requires using Microsoft.Office.Tools.Word.Extensions //FabDocxState fabDocxState = (FabDocxState)Globals.ThisAddIn.Application.ActiveDocument.GetVstoObject(Globals.Factory).Tag; this.model = fabDocxState.model; xppe = new XPathsPartEntry(model); this.cc = cc; this.cpe = cpe; this.existingCondition = existingCondition; this.questionsPart = model.questionsPart; questionnaire qtmp = new questionnaire(); questionnaire.Deserialize(questionsPart.XML, out qtmp); questionnaire = qtmp; conditions ctmp = new conditions(); conditions.Deserialize(model.conditionsPart.XML, out ctmp); conditions = ctmp; log.Debug("conditions: " + conditions.Serialize()); this.listBoxGovernor.Items.Add("all"); this.listBoxGovernor.Items.Add("any"); this.listBoxGovernor.Items.Add("none"); this.listBoxGovernor.SelectedItem = "all"; rowHelper = new Helpers.ConditionsFormRowHelper(model, xppe, questionnaire, cc, this); rowHelper.init(this.dataGridView); DataGridViewRow row = this.dataGridView.Rows[0]; rowHelper.populateRow(row, null, null); }
public static bool LoadFromFile(string fileName, out condition obj) { System.Exception exception = null; return LoadFromFile(fileName, out obj, out exception); }
/// <summary> /// Deserializes xml markup from file into an condition object /// </summary> /// <param name="fileName">string xml file to load and deserialize</param> /// <param name="obj">Output condition object</param> /// <param name="exception">output Exception value if deserialize failed</param> /// <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns> public static bool LoadFromFile(string fileName, out condition obj, out System.Exception exception) { exception = null; obj = default(condition); try { obj = LoadFromFile(fileName); return true; } catch (System.Exception ex) { exception = ex; return false; } }
public static bool Deserialize(string xml, out condition obj) { System.Exception exception = null; return Deserialize(xml, out obj, out exception); }
/// <summary> /// Deserializes workflow markup into an condition object /// </summary> /// <param name="xml">string workflow markup to deserialize</param> /// <param name="obj">Output condition object</param> /// <param name="exception">output Exception value if deserialize failed</param> /// <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns> public static bool Deserialize(string xml, out condition obj, out System.Exception exception) { exception = null; obj = default(condition); try { obj = Deserialize(xml); return true; } catch (System.Exception ex) { exception = ex; return false; } }
public FormCondition(Word.ContentControl cc, ConditionsPartEntry cpe, condition existingCondition) { InitializeComponent(); // NET 4 way; see http://msdn.microsoft.com/en-us/library/microsoft.office.tools.word.extensions.aspx FabDocxState fabDocxState = (FabDocxState)Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument).Tag; // NET 3.5 way, which requires using Microsoft.Office.Tools.Word.Extensions //FabDocxState fabDocxState = (FabDocxState)Globals.ThisAddIn.Application.ActiveDocument.GetVstoObject(Globals.Factory).Tag; this.model = fabDocxState.model; xppe = new XPathsPartEntry(model); this.cc = cc; this.cpe = cpe; this.existingCondition = existingCondition; this.questionsPart = model.questionsPart; questionnaire = new questionnaire(); questionnaire.Deserialize(questionsPart.XML, out questionnaire); questionListHelper = new Helpers.QuestionListHelperForConditionsForm(model, xppe, questionnaire, cc); questionListHelper.listBoxTypeFilter = listBoxTypeFilter; questionListHelper.listBoxQuestions = listBoxQuestions; questionListHelper.checkBoxScope = checkBoxScope; questionListHelper.comboBoxValues = comboBoxValues; questionListHelper.listBoxPredicate = listBoxPredicate; this.listBoxQuestions.SelectedIndexChanged += new System.EventHandler(questionListHelper.listBoxQuestions_SelectedIndexChanged); this.listBoxTypeFilter.SelectedIndexChanged += new System.EventHandler(questionListHelper.listBoxTypeFilter_SelectedIndexChanged); question existingQuestion = null; string matchResponse = null; if (existingCondition != null) { // Use the question associated with it, to pre-select // the correct entries in the dialog. // Re-label the window, so user can see what the condition was about this.Text = "Editing Condition: " + cc.Title; //List<xpathsXpath> xpaths = ConditionsPartEntry.getXPathsUsedInCondition(existingCondition, xppe); List<xpathsXpath> xpaths = new List<xpathsXpath>(); existingCondition.listXPaths(xpaths, cpe.conditions, xppe.getXPaths()); if (xpaths.Count > 1) { // TODO: use complex conditions editor } xpathsXpath xpathObj = xpaths[0]; String xpathVal = xpathObj.dataBinding.xpath; if (xpathVal.StartsWith("/")) { // simple //System.out.println("question " + xpathObj.getQuestionID() // + " is in use via boolean condition " + conditionId); existingQuestion = this.questionnaire.getQuestion(xpathObj.questionID); matchResponse = xpathVal; } else if (xpathVal.Contains("position")) { // TODO } else { //System.out.println(xpathVal); String qid = xpathVal.Substring( xpathVal.LastIndexOf("@id") + 5); // System.out.println("Got qid: " + qid); qid = qid.Substring(0, qid.IndexOf("'")); // System.out.println("Got qid: " + qid); //System.out.println("question " + qid // + " is in use via condition " + conditionId); existingQuestion = this.questionnaire.getQuestion(qid); matchResponse = xpathVal; } } questionListHelper.populateTypeFilter(true); if (existingQuestion == null) { // for init, populate with all questions questionListHelper.populateQuestions(null); } else { // Just show the existing question listBoxQuestions.Items.Add(existingQuestion); } if (this.listBoxQuestions.Items.Count == 0) // Never happens if in a repeat, and nor do we want it to, since user might just want to use "repeat pos" stuff { // Try including out of scope this.checkBoxScope.Checked = true; questionListHelper.populateQuestions(null); if (this.listBoxQuestions.Items.Count == 0) { MessageBox.Show("You can't define a condition until you have set up at least one question. Let's do that now. "); FormQA formQA = new FormQA(cc, false); formQA.ShowDialog(); formQA.Dispose(); // Refresh these xppe = new XPathsPartEntry(model); questionnaire.Deserialize(questionsPart.XML, out questionnaire); questionListHelper.filterAction(); return; } } // value question q; if (existingQuestion == null) { // for init, populate with all questions q = (question)this.listBoxQuestions.Items[0]; } else { q = existingQuestion; } this.listBoxQuestions.SelectedItem = q; if (q.response.Item is responseFixed) { questionListHelper.populateValues((responseFixed)q.response.Item, matchResponse); } // predicate = questionListHelper.populatePredicates(q); // TODO: set this correctly in editing mode }
/// <summary> /// Add the condition to the conditions part. /// </summary> /// <param name="model"></param> /// <param name="cxpId"></param> /// <param name="strXPath"></param> /// <param name="prefixMappings"></param> public condition setup(xpathsXpath xpath) { condition result = null; ////////////////////////// // Second, create and add the condition // If the Condition is already defined in our Condition part, don't do it again. // Also need this for ID generation. Dictionary<string, string> conditionsById = new Dictionary<string, string>(); foreach (condition xx in conditions.condition) { conditionsById.Add(xx.id, ""); if (xx.Item is xpathref) { xpathref ex = (xpathref)xx.Item; if (ex.id.Equals(xpath.id)) { result = xx; log.Info("This Condition is already setup, with ID: " + xx.id); break; } } } if (result == null) // not already defined { // Add the new condition result = new condition(); //result.id = IdGenerator.generateIdForXPath(conditionsById, null, null, xpath.dataBinding.xpath); result.id = IdHelper.GenerateShortID(5); xpathref xpathref = new xpathref(); xpathref.id = xpath.id; result.Item = xpathref; conditions.condition.Add(result); // Save the conditions in docx string ser = conditions.Serialize(); log.Info(ser); CustomXmlUtilities.replaceXmlDoc(model.conditionsPart, ser); } // Set this conditionId = result.id; log.Debug("Condition written!"); return result; }
private void setTag(Word.ContentControl cc, condition result) { TagData td = new TagData(""); td.set("od:condition", result.id); cc.Tag = td.asQueryString(); cc.SetPlaceholderText(null, null, "Type the text for when this condition is satisfied."); // that'll only be displayed if the cc is not being wrapped around existing content :-) log.Info("Created condition " + result.Serialize()); }
private void buildCondition() { ConditionsPartEntry cpe = new ConditionsPartEntry(model); TagData td; if (this.dataGridView.Rows.Count == 2 // auto last row && !this.listBoxGovernor.SelectedItem.ToString().Equals("none") ) // none handled separately { // a simple condition if (this.dataGridView.Rows[0].Cells["Questions"].Value is condition) { // this is just condition re-use! condition cReused = (condition)this.dataGridView.Rows[0].Cells["Questions"].Value; setTag(cc, cReused); cc.Title = cReused.description; // that'll do for now return; } // Usual case Pairing pair = buildXPathRef(this.dataGridView.Rows[0]); cc.Title = restrict64chars(pair.titleText); if (pair.xpathEntry.dataBinding.xpath.Contains("position()")) { // special case. TODO: make this a normal condition! // since this approach won't work if it is in complex condition td = new TagData(""); td.set("od:RptPosCon", pair.xpathEntry.id); cc.Tag = td.asQueryString(); cc.SetPlaceholderText(null, null, "Type the text that'll appear between repeated items."); // that'll only be displayed if the cc is not being wrapped around existing content :-) return; } condition result = cpe.setup(pair.xpathEntry); result.name = this.textBoxName.Text; if (string.IsNullOrWhiteSpace(this.textBoxDescription.Text)) { result.description = pair.titleText; } else { result.description = this.textBoxDescription.Text; } cpe.save(); setTag(cc, result); return; } // multi-row int last = this.dataGridView.Rows.Count - 1; condition outer = new condition(); cc.Title = null; if (this.listBoxGovernor.SelectedItem.ToString().Equals("all")) { // = and and and = new and(); outer.Item = and; foreach (DataGridViewRow row in this.dataGridView.Rows) { // Last row is added automatically if (row == this.dataGridView.Rows[last]) continue; if (row.Cells["Questions"].Value is condition) { // this is just condition re-use! condition cReused = (condition)row.Cells["Questions"].Value; if (cc.Title == null) { cc.Title = this.restrict64chars(cReused.description); // that'll do for now } else { cc.Title = this.restrict64chars(cc.Title + " and " + cReused.description); // that'll do for now } conditionref conditionref = new conditionref(); conditionref.id = cReused.id; and.Items.Add(conditionref); } else { // xpathref Pairing pair = buildXPathRef(row); if (cc.Title == null) { cc.Title = this.restrict64chars(pair.titleText); } else { cc.Title = this.restrict64chars(cc.Title + " and " + pair.titleText); } xpathref xpathref = new xpathref(); xpathref.id = pair.xpathEntry.id; and.Items.Add(xpathref); } } outer.name = this.textBoxName.Text; if (string.IsNullOrWhiteSpace(this.textBoxDescription.Text)) { outer.description = cc.Title; } else { outer.description = this.textBoxDescription.Text; } cpe.add(outer, null); cpe.save(); setTag(cc, outer); return; } if (this.listBoxGovernor.SelectedItem.ToString().Equals("any") ) { // = or or or = new or(); outer.Item = or; foreach (DataGridViewRow row in this.dataGridView.Rows) { // Last row is added automatically if (row == this.dataGridView.Rows[last]) continue; if (row.Cells["Questions"].Value is condition) { // this is just condition re-use! condition cReused = (condition)row.Cells["Questions"].Value; if (cc.Title == null) { cc.Title = this.restrict64chars(cReused.description); // that'll do for now } else { cc.Title = this.restrict64chars(cc.Title + " and " + cReused.description); // that'll do for now } conditionref conditionref = new conditionref(); conditionref.id = cReused.id; or.Items.Add(conditionref); } else { Pairing pair = buildXPathRef(row); if (cc.Title == null) { cc.Title = this.restrict64chars(pair.titleText); } else { cc.Title = this.restrict64chars(cc.Title + " or " + pair.titleText); } xpathref xpathref = new xpathref(); xpathref.id = pair.xpathEntry.id; or.Items.Add(xpathref); } } outer.name = this.textBoxName.Text; if (string.IsNullOrWhiteSpace(this.textBoxDescription.Text)) { outer.description = cc.Title; } else { outer.description = this.textBoxDescription.Text; } cpe.add(outer, null); cpe.save(); setTag(cc, outer); return; } if (this.listBoxGovernor.SelectedItem.ToString().Equals("none")) { // none: not(A || B) = !A && !B not not = new not(); outer.Item = not; or or = new or(); not.Item = or; cc.Title = "NONE OF "; foreach (DataGridViewRow row in this.dataGridView.Rows) { // Last row is added automatically if (row == this.dataGridView.Rows[last]) continue; if (row.Cells["Questions"].Value is condition) { // this is just condition re-use! condition cReused = (condition)row.Cells["Questions"].Value; if (cc.Title == null) { cc.Title = this.restrict64chars(cReused.description); // that'll do for now } else { cc.Title = this.restrict64chars(cc.Title + " and " + cReused.description); // that'll do for now } conditionref conditionref = new conditionref(); conditionref.id = cReused.id; or.Items.Add(conditionref); } else { Pairing pair = buildXPathRef(row); if (cc.Title.Equals("NONE OF ")) { cc.Title = this.restrict64chars(cc.Title + pair.titleText); } else { cc.Title = this.restrict64chars(cc.Title + " or " + pair.titleText); } xpathref xpathref = new xpathref(); xpathref.id = pair.xpathEntry.id; or.Items.Add(xpathref); } } outer.name = this.textBoxName.Text; if (string.IsNullOrWhiteSpace(this.textBoxDescription.Text)) { outer.description = cc.Title; } else { outer.description = this.textBoxDescription.Text; } cpe.add(outer, null); cpe.save(); setTag(cc, outer); return; } //// Make sure this question is allowed here //// ie the it is top level or in a common repeat ancestor. //// We do this last, so this cc has od:condition on it, //// in which case we can re-use existing code to do the check //// TODO: when we support and/or, will need to do this //// for each variable. //ContentControlNewConditionCheck variableRelocator = new ContentControlNewConditionCheck(); //variableRelocator.checkAnswerAncestry(xpathExisting.id); }