/// <summary> /// get the controls that belong to the toolstrip /// </summary> public override void ProcessChildren(TFormWriter writer, TControlDef container) { // add all the children // TODO add Container elements in statusbar if (container.controlName.StartsWith("stb")) { return; } List <XmlNode> childrenlist; if (TYml2Xml.GetChild(container.xmlNode, "Controls") != null) { // this is for generated toolbar, eg. for the PrintPreviewControl StringCollection childrenNames = TYml2Xml.GetElements(container.xmlNode, "Controls"); childrenlist = new List <XmlNode>(); foreach (string name in childrenNames) { childrenlist.Add(container.xmlNode.OwnerDocument.CreateElement(name)); } } else { // usually, the toolbar buttons are direct children of the toolbar control childrenlist = TYml2Xml.GetChildren(container.xmlNode, true); } //Console.WriteLine("Container: " + container.controlName); foreach (XmlNode child in childrenlist) { // Console.WriteLine("Child: " + child.Name); /* Get unique name if we need it * at the moment we need it only for menu separators */ String UniqueChildName = child.Name; TControlDef ControlDefChild = container.FCodeStorage.GetControl(child.Name); if (ControlDefChild == null) { UniqueChildName = TYml2Xml.GetAttribute(child, "UniqueName"); ControlDefChild = container.FCodeStorage.GetControl(UniqueChildName); } container.Children.Add(ControlDefChild); if (ControlDefChild != null) { IControlGenerator ctrlGenerator = writer.FindControlGenerator(ControlDefChild); // add control itself if (ctrlGenerator != null) { ctrlGenerator.GenerateControl(writer, ControlDefChild); } } } }
/// <summary>write the code for the designer file where the properties of the control are written</summary> public override ProcessTemplate SetControlProperties(TFormWriter writer, TControlDef ctrl) { ProcessTemplate ctrlSnippet = base.SetControlProperties(writer, ctrl); if (ctrlSnippet.FTemplateCode.Contains("{#REDIRECTONSUCCESS}")) { ProcessTemplate redirectSnippet = writer.FTemplate.GetSnippet("REDIRECTONSUCCESS"); ctrlSnippet.SetCodelet("REDIRECTONSUCCESS", redirectSnippet.FTemplateCode.ToString()); } if (ctrl.HasAttribute("AjaxRequestUrl")) { ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "VALIDATIONERRORTITLE", ctrl, ctrl.GetAttribute("ValidationErrorTitle")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "VALIDATIONERRORMESSAGE", ctrl, ctrl.GetAttribute("ValidationErrorMessage")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "SENDINGDATATITLE", ctrl, ctrl.GetAttribute("SendingMessageTitle")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "SENDINGDATAMESSAGE", ctrl, ctrl.GetAttribute("SendingMessage")); if (ctrl.HasAttribute("SuccessMessage")) { ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "REQUESTSUCCESSTITLE", ctrl, ctrl.GetAttribute("SuccessMessageTitle")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "REQUESTSUCCESSMESSAGE", ctrl, ctrl.GetAttribute("SuccessMessage")); } ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "REQUESTFAILURETITLE", ctrl, ctrl.GetAttribute("FailureMessageTitle")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "REQUESTFAILUREMESSAGE", ctrl, ctrl.GetAttribute("FailureMessage")); } ctrlSnippet.SetCodelet("REQUESTURL", ctrl.GetAttribute("AjaxRequestUrl")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "REDIRECTURLONSUCCESS", ctrl, ctrl.GetAttribute("RedirectURLOnSuccess")); if (ctrl.GetAttribute("DownloadOnSuccess").StartsWith("jsonData")) { ctrlSnippet.SetCodelet("REDIRECTDOWNLOAD", ctrl.GetAttribute("DownloadOnSuccess")); } ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "REDIRECTURLONCANCEL", ctrl, ctrl.GetAttribute("RedirectURLOnCancel")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "CANCELQUESTIONTITLE", ctrl, ctrl.GetAttribute("CancelQuestionTitle")); ((TExtJsFormsWriter)writer).AddResourceString(ctrlSnippet, "CANCELQUESTIONMESSAGE", ctrl, ctrl.GetAttribute("CancelQuestionMessage")); XmlNode AjaxParametersNode = TYml2Xml.GetChild(ctrl.xmlNode, "AjaxRequestParameters"); if (AjaxParametersNode != null) { string ParameterString = String.Empty; foreach (XmlAttribute attr in AjaxParametersNode.Attributes) { if (!attr.Name.Equals("depth")) { ParameterString += attr.Name + ": '" + attr.Value + "', "; } } ctrlSnippet.SetCodelet("REQUESTPARAMETERS", ParameterString); writer.FTemplate.SetCodelet("REQUESTPARAMETERS", "true"); } return(ctrlSnippet); }
/// <summary>write the code for the designer file where the properties of the control are written</summary> public override ProcessTemplate SetControlProperties(TFormWriter writer, TControlDef ctrl) { base.SetControlProperties(writer, ctrl); if (TYml2Xml.HasAttribute(ctrl.xmlNode, "SelectedRowActivates")) { // TODO: this function needs to be called by the manual code at the moment when eg a search finishes // TODO: call "Activate" + TYml2Xml.GetAttribute(ctrl.xmlNode, "SelectedRowActivates") } StringCollection Columns = TYml2Xml.GetElements(ctrl.xmlNode, "Columns"); if (Columns.Count > 0) { writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".Columns.Clear();" + Environment.NewLine); foreach (string ColumnFieldName in Columns) { bool IsDetailNotMaster; TTableField field = null; // customfield, eg. UC_GLTransactions, ATransaction.DateEntered and ATransaction.AnalysisAttributes // there needs to be a list of CustomColumns XmlNode CustomColumnsNode = TYml2Xml.GetChild(ctrl.xmlNode, "CustomColumns"); XmlNode CustomColumnNode = null; if (CustomColumnsNode != null) { CustomColumnNode = TYml2Xml.GetChild(CustomColumnsNode, ColumnFieldName); } if (CustomColumnNode != null) { //string ColumnType = "System.String"; /* TODO DateTime (tracker: #58) * if (TYml2Xml.GetAttribute(CustomColumnNode, "Type") == "System.DateTime") * { * ColumnType = "DateTime"; * } */ // TODO: different behaviour for double??? if (TYml2Xml.GetAttribute(CustomColumnNode, "Type") == "Boolean") { //ColumnType = "CheckBox"; } writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".Columns.Add(" + "FMainDS." + ctrl.GetAttribute("TableName") + ".Get" + ColumnFieldName + "DBName(), \"" + TYml2Xml.GetAttribute(CustomColumnNode, "Label") + "\");" + Environment.NewLine); } else if (ctrl.HasAttribute("TableName")) { field = TDataBinding.GetTableField(null, ctrl.GetAttribute("TableName") + "." + ColumnFieldName, out IsDetailNotMaster, true); } else { field = TDataBinding.GetTableField(null, ColumnFieldName, out IsDetailNotMaster, true); } if (field != null) { //string ColumnType = "System.String"; /* TODO DateTime (tracker: #58) * if (field.GetDotNetType() == "System.DateTime") * { * ColumnType = "DateTime"; * } */ // TODO: different behaviour for double??? if (field.GetDotNetType() == "Boolean") { //ColumnType = "CheckBox"; } writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".Columns.Add(" + TTable.NiceTableName(field.strTableName) + "Table.Get" + TTable.NiceFieldName(field.strName) + "DBName(), \"" + field.strLabel + "\");" + Environment.NewLine); } } } if (ctrl.HasAttribute("ActionLeavingRow")) { AssignEventHandlerToControl(writer, ctrl, "Selection.FocusRowLeaving", "SourceGrid.RowCancelEventHandler", ctrl.GetAttribute("ActionLeavingRow")); } if (ctrl.HasAttribute("ActionFocusRow")) { // TODO AssignEventHandlerToControl(writer, ctrl, "Selection.FocusRowEntered", "SourceGrid.RowEventHandler", // ctrl.GetAttribute("ActionFocusRow")); } if ((ctrl.controlName == "grdDetails") && FCodeStorage.HasAttribute("DetailTable")) { writer.Template.AddToCodelet("SHOWDATA", ""); if (ctrl.HasAttribute("SortOrder")) { // SortOrder is comma separated and has DESC or ASC after the column name string SortOrder = ctrl.GetAttribute("SortOrder"); foreach (string SortOrderPart in SortOrder.Split(',')) { bool temp; TTableField field = null; if ((SortOrderPart.Split(' ')[0].IndexOf(".") == -1) && ctrl.HasAttribute("TableName")) { field = TDataBinding.GetTableField(null, ctrl.GetAttribute("TableName") + "." + SortOrderPart.Split( ' ')[0], out temp, true); } else { field = TDataBinding.GetTableField( null, SortOrderPart.Split(' ')[0], out temp, true); } if (field != null) { SortOrder = SortOrder.Replace(SortOrderPart.Split(' ')[0], field.strName); } } writer.Template.AddToCodelet("GRIDSORT", SortOrder); } if (ctrl.HasAttribute("RowFilter")) { // this references a field in the table, and assumes there exists a local variable with the same name // eg. FBatchNumber in GL Journals string RowFilter = ctrl.GetAttribute("RowFilter"); String FilterString = "\""; foreach (string RowFilterPart in RowFilter.Split(',')) { bool temp; string columnName = TDataBinding.GetTableField( null, RowFilterPart, out temp, true).strName; if (FilterString.Length > 1) { FilterString += " + \" and "; } FilterString += columnName + " = \" + F" + TTable.NiceFieldName(columnName) + ".ToString()"; } writer.Template.AddToCodelet("GRIDFILTER", FilterString); } } return(writer.FTemplate); }
/// <summary>write the code for the designer file where the properties of the control are written</summary> public override ProcessTemplate SetControlProperties(TFormWriter writer, TControlDef ctrl) { if (!ctrl.HasAttribute("Width")) { ctrl.SetAttribute("Width", FDefaultWidth.ToString()); } base.SetControlProperties(writer, ctrl); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".CancelEditingWithEscapeKey = false;" + Environment.NewLine); if (TYml2Xml.HasAttribute(ctrl.xmlNode, "SelectedRowActivates")) { // TODO: this function needs to be called by the manual code at the moment when eg a search finishes // TODO: call "Activate" + TYml2Xml.GetAttribute(ctrl.xmlNode, "SelectedRowActivates") } StringCollection Columns = TYml2Xml.GetElements(ctrl.xmlNode, "Columns"); if (Columns.Count > 0) { writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".Columns.Clear();" + Environment.NewLine); //This needs to come immediately after the Columns.Clear() and before the creation of the columns if (ctrl.HasAttribute("SortableHeaders")) { string trueOrFalse = ctrl.GetAttribute("SortableHeaders"); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".SortableHeaders = " + trueOrFalse + ";" + Environment.NewLine); } bool isFirstColumnVarchar = false; bool doneFirstColumn = false; foreach (string ColumnFieldName in Columns) { bool IsDetailNotMaster; TTableField field = null; string TableFieldTable; string ColumnFieldNameResolved; // customfield, eg. UC_GLTransactions, ATransaction.DateEntered and ATransaction.AnalysisAttributes // there needs to be a list of CustomColumns XmlNode CustomColumnsNode = TYml2Xml.GetChild(ctrl.xmlNode, "CustomColumns"); XmlNode CustomColumnNode = null; if (CustomColumnsNode != null) { CustomColumnNode = TYml2Xml.GetChild(CustomColumnsNode, ColumnFieldName); } if ((ctrl.controlName == "grdDetails") && FCodeStorage.HasAttribute("DetailTable")) { TableFieldTable = FCodeStorage.GetAttribute("DetailTable"); if (ColumnFieldName.StartsWith("Detail") && !IsLegitimateDetailFieldName(TableFieldTable, ColumnFieldName)) { ColumnFieldNameResolved = ColumnFieldName.Substring(6); // Drop 'Details' out of 'Details...' } else { ColumnFieldNameResolved = ColumnFieldName; } } else { TableFieldTable = ctrl.GetAttribute("TableName"); ColumnFieldNameResolved = ColumnFieldName; } if (CustomColumnNode != null) { TTableField tf = null; // if grd has no TableName property if ((TableFieldTable == "") && ColumnFieldNameResolved.Contains(".")) { int Period = ColumnFieldNameResolved.IndexOf("."); string TableName = ColumnFieldNameResolved.Remove(Period); string ColumnName = ColumnFieldNameResolved.Remove(0, TableName.Length + 1); AddColumnToGrid(writer, ctrl.controlName, TYml2Xml.GetAttribute(CustomColumnNode, "Type"), TYml2Xml.GetAttribute(CustomColumnNode, "Label"), TYml2Xml.GetAttribute(CustomColumnNode, "Tooltip"), TableName, ColumnName); tf = TDataBinding.GetTableField(null, TableName + "." + ColumnName, out IsDetailNotMaster, true); } else { AddColumnToGrid(writer, ctrl.controlName, TYml2Xml.GetAttribute(CustomColumnNode, "Type"), TYml2Xml.GetAttribute(CustomColumnNode, "Label"), TYml2Xml.GetAttribute(CustomColumnNode, "Tooltip"), TableFieldTable, ColumnFieldNameResolved); tf = TDataBinding.GetTableField(null, TableFieldTable + "." + ColumnFieldNameResolved, out IsDetailNotMaster, true); } if (!doneFirstColumn) { isFirstColumnVarchar = tf.strName.EndsWith("_c"); doneFirstColumn = true; } } else if (ctrl.HasAttribute("TableName")) { field = TDataBinding.GetTableField(null, ctrl.GetAttribute("TableName") + "." + ColumnFieldName, out IsDetailNotMaster, true); } else { field = TDataBinding.GetTableField(null, ColumnFieldName, out IsDetailNotMaster, true); } if (field != null) { AddColumnToGrid(writer, ctrl.controlName, field.iDecimals == 10 && field.iLength == 24 ? "Decimal" : field.GetDotNetType(), field.strLabel.Length > 0 ? field.strLabel : field.strName, String.Empty, TTable.NiceTableName(field.strTableName), TTable.NiceFieldName(field.strName)); if (!doneFirstColumn) { isFirstColumnVarchar = field.strName.EndsWith("_c"); doneFirstColumn = true; } } } if (FControlType == TYPE_DATA_GRID_NON_PAGED) { // Grid AutoFind definition (not allowed in paged grids) string autoFindStr = ctrl.controlName + ".AutoFindMode = TAutoFindModeEnum."; string mode = "NoAutoFind"; if (ctrl.HasAttribute("AutoFindMode")) { // Use the specified value in YAML mode = ctrl.GetAttribute("AutoFindMode"); TLogging.Log("Info: AutoFindMode (with columns) was set to " + mode + " from explicit YAML attribute: " + ctrl.controlName); } else if (isFirstColumnVarchar) { // We can use auto-find because we have a first column based on a varchar mode = "FirstCharacter"; TLogging.Log("Info: AutoFindMode (with columns) was set implicitly for: " + ctrl.controlName); } else { TLogging.Log("Info: AutoFindMode (with columns) was set to NoAutoFind for: " + ctrl.controlName); } writer.Template.AddToCodelet("INITMANUALCODE", autoFindStr + mode + ";" + Environment.NewLine); if (ctrl.HasAttribute("AutoFindColumn")) { string colNum = ctrl.GetAttribute("AutoFindColumn"); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".AutoFindColumn = " + colNum + ";" + Environment.NewLine); TLogging.Log("Info: AutoFindColumn was set to " + colNum + " for: " + ctrl.controlName); } if ((mode == "FirstCharacter") && !ctrl.HasAttribute("SortOrder")) { TLogging.Log("Info: AutoFind has been turned on for a grid with no YAML-defined sort order: (" + ctrl.controlName + "). You can remove this message by explicitly setting a SortOrder in the YAML file."); } } } else { //If no columns, but the user is able to add columns dynamically during the running of the form, then need this here. if (ctrl.HasAttribute("SortableHeaders")) { string trueOrFalse = ctrl.GetAttribute("SortableHeaders"); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".SortableHeaders = " + trueOrFalse + ";" + Environment.NewLine); } if (FControlType == TYPE_DATA_GRID_NON_PAGED) { // Grid AutoFind definition (not allowed in paged grids) string autoFindStr = ctrl.controlName + ".AutoFindMode = TAutoFindModeEnum."; string mode = "FirstCharacter"; if (ctrl.HasAttribute("AutoFindMode")) { // Use the specified value in YAML mode = ctrl.GetAttribute("AutoFindMode"); TLogging.Log("Info: AutoFindMode (without columns) was set to " + mode + " from explicit YAML attribute: " + ctrl.controlName); } else if (writer.FCodeStorage.ManualFileExistsAndContains(ctrl.controlName + ".AddTextColumn(")) { // We presume can use auto-find because we have a column (maybe the first) based on a varchar TLogging.Log("Info: AutoFindMode (without columns) was set implicitly for: " + ctrl.controlName); } else { mode = "NoAutoFind"; TLogging.Log("Info: AutoFindMode (without columns) was set to NoAutoFind for: " + ctrl.controlName); } writer.Template.AddToCodelet("INITMANUALCODE", autoFindStr + mode + ";" + Environment.NewLine); if (ctrl.HasAttribute("AutoFindColumn")) { string colNum = ctrl.GetAttribute("AutoFindColumn"); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".AutoFindColumn = " + colNum + ";" + Environment.NewLine); TLogging.Log("Info: AutoFindColumn was set to " + colNum + " for: " + ctrl.controlName); } } } if (ctrl.controlName != "grdDetails") { if (ctrl.HasAttribute("ActionLeavingRow")) { AssignEventHandlerToControl(writer, ctrl, "Selection.FocusRowLeaving", "SourceGrid.RowCancelEventHandler", ctrl.GetAttribute("ActionLeavingRow")); } if (ctrl.HasAttribute("ActionFocusRow")) { AssignEventHandlerToControl(writer, ctrl, "Selection.FocusRowEntered", "SourceGrid.RowEventHandler", ctrl.GetAttribute("ActionFocusRow")); } } if (ctrl.HasAttribute("ActionEnterKeyPressed")) { AssignEventHandlerToControl(writer, ctrl, "EnterKeyPressed", "TKeyPressedEventHandler", ctrl.GetAttribute("ActionEnterKeyPressed")); } if ((ctrl.controlName == "grdDetails") && FCodeStorage.HasAttribute("DetailTable")) { writer.Template.AddToCodelet("SHOWDATA", ""); if (ctrl.HasAttribute("SortOrder")) { // SortOrder is comma separated and has DESC or ASC after the column name string SortOrder = ctrl.GetAttribute("SortOrder"); foreach (string SortOrderPart in SortOrder.Split(',')) { bool temp; TTableField field = null; string columnNamePart = SortOrderPart.Split(' ')[0]; if ((columnNamePart.IndexOf(".") == -1) && ctrl.HasAttribute("TableName")) { field = TDataBinding.GetTableField(null, ctrl.GetAttribute("TableName") + "." + columnNamePart, out temp, true); } else { field = TDataBinding.GetTableField(null, columnNamePart, out temp, true); } if (field != null) { SortOrder = SortOrder.Replace(columnNamePart, field.strName); } } writer.Template.AddToCodelet("GRIDSORT", SortOrder); } if (ctrl.HasAttribute("RowFilter")) { // this references a field in the table, and assumes there exists a local variable with the same name // eg. FBatchNumber in GL Journals string RowFilter = ctrl.GetAttribute("RowFilter"); String FilterString = "\""; foreach (string RowFilterPart in RowFilter.Split(',')) { bool temp; string columnName = TDataBinding.GetTableField( null, RowFilterPart, out temp, true).strName; if (FilterString.Length > 1) { FilterString += " + \" and "; } FilterString += columnName + " = \" + F" + TTable.NiceFieldName(columnName) + ".ToString()"; } writer.Template.AddToCodelet("GRIDFILTER", FilterString); } } if (ctrl.controlName == "grdDetails") { if (ctrl.HasAttribute("EnableMultiSelection")) { writer.Template.SetCodelet("GRIDMULTISELECTION", String.Format("grdDetails.Selection.EnableMultiSelection = {0};{1}", ctrl.GetAttribute("EnableMultiSelection"), Environment.NewLine)); } else if (FCodeStorage.FControlList.ContainsKey("btnDelete")) { writer.Template.SetCodelet("GRIDMULTISELECTION", "grdDetails.Selection.EnableMultiSelection = true;" + Environment.NewLine); } } return(writer.FTemplate); }
/// <summary> /// get the radio buttons /// </summary> public override void ProcessChildren(TFormWriter writer, TControlDef ctrl) { StringCollection optionalValues = TYml2Xml.GetElements(TXMLParser.GetChild(ctrl.xmlNode, "OptionalValues")); string DefaultValue; if ((TYml2Xml.HasAttribute(ctrl.xmlNode, "NoDefaultValue") && ((TYml2Xml.GetAttribute(ctrl.xmlNode, "NoDefaultValue")) == "true"))) { DefaultValue = String.Empty; FNoDefaultValue = true; } else { DefaultValue = optionalValues[0]; } if (TYml2Xml.HasAttribute(ctrl.xmlNode, "DefaultValue")) { DefaultValue = TYml2Xml.GetAttribute(ctrl.xmlNode, "DefaultValue"); } else { // DefaultValue with = sign before control name for (int counter = 0; counter < optionalValues.Count; counter++) { if (optionalValues[counter].StartsWith("=")) { optionalValues[counter] = optionalValues[counter].Substring(1).Trim(); DefaultValue = optionalValues[counter]; } } } StringCollection optionalValuesLabels = TYml2Xml.GetElements(TYml2Xml.GetChild(ctrl.xmlNode, "LabelsForOptionalValues")); StringCollection optionalValuesConstants = TYml2Xml.GetElements(TYml2Xml.GetChild(ctrl.xmlNode, "OptionalValuesConstants")); // add the radiobuttons on the fly int count = 0; foreach (string optionalValue in optionalValues) { string radioButtonName = "rbt" + StringHelper.UpperCamelCase(optionalValue.Replace("'", "").Replace(" ", "_").Replace("&", ""), false, false); TControlDef newCtrl = writer.CodeStorage.FindOrCreateControl(radioButtonName, ctrl.controlName); newCtrl.Label = optionalValuesLabels.Count > 0 ? optionalValuesLabels[count] : optionalValue; if (StringHelper.IsSame(DefaultValue, optionalValue)) { newCtrl.SetAttribute("RadioChecked", "true"); FDefaultValueRadioButton = radioButtonName; } if (TYml2Xml.HasAttribute(ctrl.xmlNode, "SuppressChangeDetection")) { newCtrl.SetAttribute("SuppressChangeDetection", TYml2Xml.GetAttribute(ctrl.xmlNode, "SuppressChangeDetection")); } if (TYml2Xml.HasAttribute(ctrl.xmlNode, "OnChange")) { newCtrl.SetAttribute("OnChange", TYml2Xml.GetAttribute(ctrl.xmlNode, "OnChange")); } if (optionalValuesConstants.Count > count) { newCtrl.SetAttribute("ConstantValue", optionalValuesConstants[count]); } ctrl.Children.Add(newCtrl); count++; } base.ProcessChildren(writer, ctrl); }
/// <summary>write the code for the designer file where the properties of the control are written</summary> public override ProcessTemplate SetControlProperties(TFormWriter writer, TControlDef ctrl) { if (!ctrl.HasAttribute("Width")) { ctrl.SetAttribute("Width", FDefaultWidth.ToString()); } base.SetControlProperties(writer, ctrl); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".CancelEditingWithEscapeKey = false;" + Environment.NewLine); if (TYml2Xml.HasAttribute(ctrl.xmlNode, "SelectedRowActivates")) { // TODO: this function needs to be called by the manual code at the moment when eg a search finishes // TODO: call "Activate" + TYml2Xml.GetAttribute(ctrl.xmlNode, "SelectedRowActivates") } StringCollection Columns = TYml2Xml.GetElements(ctrl.xmlNode, "Columns"); if (Columns.Count > 0) { writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".Columns.Clear();" + Environment.NewLine); //This needs to come immediately after the Columns.Clear() and before the creation of the columns if (ctrl.HasAttribute("SortableHeaders")) { string trueOrFalse = ctrl.GetAttribute("SortableHeaders"); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".SortableHeaders = " + trueOrFalse + ";" + Environment.NewLine); } foreach (string ColumnFieldName in Columns) { bool IsDetailNotMaster; TTableField field = null; string TableFieldTable; string ColumnFieldNameResolved; // customfield, eg. UC_GLTransactions, ATransaction.DateEntered and ATransaction.AnalysisAttributes // there needs to be a list of CustomColumns XmlNode CustomColumnsNode = TYml2Xml.GetChild(ctrl.xmlNode, "CustomColumns"); XmlNode CustomColumnNode = null; if (CustomColumnsNode != null) { CustomColumnNode = TYml2Xml.GetChild(CustomColumnsNode, ColumnFieldName); } if ((ctrl.controlName == "grdDetails") && FCodeStorage.HasAttribute("DetailTable")) { TableFieldTable = FCodeStorage.GetAttribute("DetailTable"); if (ColumnFieldName.StartsWith("Detail") && !IsLegitimateDetailFieldName(TableFieldTable, ColumnFieldName)) { ColumnFieldNameResolved = ColumnFieldName.Substring(6); // Drop 'Details' out of 'Details...' } else { ColumnFieldNameResolved = ColumnFieldName; } } else { TableFieldTable = ctrl.GetAttribute("TableName"); ColumnFieldNameResolved = ColumnFieldName; } if (CustomColumnNode != null) { // if grd has no TableName property if ((TableFieldTable == "") && ColumnFieldNameResolved.Contains(".")) { int Period = ColumnFieldNameResolved.IndexOf("."); string TableName = ColumnFieldNameResolved.Remove(Period); string ColumnName = ColumnFieldNameResolved.Remove(0, TableName.Length + 1); AddColumnToGrid(writer, ctrl.controlName, TYml2Xml.GetAttribute(CustomColumnNode, "Type"), TYml2Xml.GetAttribute(CustomColumnNode, "Label"), TYml2Xml.GetAttribute(CustomColumnNode, "Tooltip"), TableName, ColumnName); } else { AddColumnToGrid(writer, ctrl.controlName, TYml2Xml.GetAttribute(CustomColumnNode, "Type"), TYml2Xml.GetAttribute(CustomColumnNode, "Label"), TYml2Xml.GetAttribute(CustomColumnNode, "Tooltip"), TableFieldTable, ColumnFieldNameResolved); } } else if (ctrl.HasAttribute("TableName")) { field = TDataBinding.GetTableField(null, ctrl.GetAttribute("TableName") + "." + ColumnFieldName, out IsDetailNotMaster, true); } else { field = TDataBinding.GetTableField(null, ColumnFieldName, out IsDetailNotMaster, true); } if (field != null) { AddColumnToGrid(writer, ctrl.controlName, field.iDecimals == 10 && field.iLength == 24 ? "Decimal" : field.GetDotNetType(), field.strLabel.Length > 0 ? field.strLabel : field.strName, String.Empty, TTable.NiceTableName(field.strTableName), TTable.NiceFieldName(field.strName)); } } } else { //If no columns, but the user is able to add columns dynamically during the running of the form, then need this here. if (ctrl.HasAttribute("SortableHeaders")) { string trueOrFalse = ctrl.GetAttribute("SortableHeaders"); writer.Template.AddToCodelet("INITMANUALCODE", ctrl.controlName + ".SortableHeaders = " + trueOrFalse + ";" + Environment.NewLine); } } if (ctrl.controlName != "grdDetails") { if (ctrl.HasAttribute("ActionLeavingRow")) { AssignEventHandlerToControl(writer, ctrl, "Selection.FocusRowLeaving", "SourceGrid.RowCancelEventHandler", ctrl.GetAttribute("ActionLeavingRow")); } if (ctrl.HasAttribute("ActionFocusRow")) { AssignEventHandlerToControl(writer, ctrl, "Selection.FocusRowEntered", "SourceGrid.RowEventHandler", ctrl.GetAttribute("ActionFocusRow")); } } if (ctrl.HasAttribute("ActionEnterKeyPressed")) { AssignEventHandlerToControl(writer, ctrl, "EnterKeyPressed", "TKeyPressedEventHandler", ctrl.GetAttribute("ActionEnterKeyPressed")); } if ((ctrl.controlName == "grdDetails") && FCodeStorage.HasAttribute("DetailTable")) { writer.Template.AddToCodelet("SHOWDATA", ""); if (ctrl.HasAttribute("SortOrder")) { // SortOrder is comma separated and has DESC or ASC after the column name string SortOrder = ctrl.GetAttribute("SortOrder"); foreach (string SortOrderPart in SortOrder.Split(',')) { bool temp; TTableField field = null; if ((SortOrderPart.Split(' ')[0].IndexOf(".") == -1) && ctrl.HasAttribute("TableName")) { field = TDataBinding.GetTableField(null, ctrl.GetAttribute("TableName") + "." + SortOrderPart.Split( ' ')[0], out temp, true); } else { field = TDataBinding.GetTableField( null, SortOrderPart.Split(' ')[0], out temp, true); } if (field != null) { SortOrder = SortOrder.Replace(SortOrderPart.Split(' ')[0], field.strName); } } writer.Template.AddToCodelet("GRIDSORT", SortOrder); } if (ctrl.HasAttribute("RowFilter")) { // this references a field in the table, and assumes there exists a local variable with the same name // eg. FBatchNumber in GL Journals string RowFilter = ctrl.GetAttribute("RowFilter"); String FilterString = "\""; foreach (string RowFilterPart in RowFilter.Split(',')) { bool temp; string columnName = TDataBinding.GetTableField( null, RowFilterPart, out temp, true).strName; if (FilterString.Length > 1) { FilterString += " + \" and "; } FilterString += columnName + " = \" + F" + TTable.NiceFieldName(columnName) + ".ToString()"; } writer.Template.AddToCodelet("GRIDFILTER", FilterString); } } if (ctrl.controlName == "grdDetails") { if (ctrl.HasAttribute("EnableMultiSelection")) { writer.Template.SetCodelet("GRIDMULTISELECTION", String.Format("grdDetails.Selection.EnableMultiSelection = {0};{1}", ctrl.GetAttribute("EnableMultiSelection"), Environment.NewLine)); } else if (FCodeStorage.FControlList.ContainsKey("btnDelete")) { writer.Template.SetCodelet("GRIDMULTISELECTION", "grdDetails.Selection.EnableMultiSelection = true;" + Environment.NewLine); } } return(writer.FTemplate); }
private static void ParsePartners(ref PartnerImportExportTDS AMainDS, XmlNode ACurNode, TDBTransaction ATransaction, ref TVerificationResultCollection AVerificationResult) { XmlNode LocalNode = ACurNode; while (LocalNode != null) { if (LocalNode.Name.StartsWith("PartnerGroup")) { ParsePartners(ref AMainDS, LocalNode.FirstChild, ATransaction, ref AVerificationResult); } else if (LocalNode.Name.StartsWith("Partner")) { PPartnerRow PartnerRow = AMainDS.PPartner.NewRowTyped(); Boolean IsExistingPartner = false; if (!TYml2Xml.HasAttributeRecursive(LocalNode, "SiteKey")) { throw new Exception(Catalog.GetString("Missing SiteKey Attribute")); } if (!TYml2Xml.HasAttributeRecursive(LocalNode, "status")) { throw new Exception(Catalog.GetString("Missing status Attribute")); } // get a new partner key if (TYml2Xml.HasAttribute(LocalNode, "PartnerKey")) { PartnerRow.PartnerKey = Convert.ToInt64(TYml2Xml.GetAttribute(LocalNode, "PartnerKey")); if (PPartnerAccess.Exists(PartnerRow.PartnerKey, ATransaction)) { AMainDS.Merge(PPartnerAccess.LoadByPrimaryKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.PPartner.DefaultView.RowFilter = String.Format("{0} = '{1}'", PPartnerTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey); PartnerRow = (PPartnerRow)AMainDS.PPartner.DefaultView[0].Row; IsExistingPartner = true; } else { AMainDS.PPartner.Rows.Add(PartnerRow); } } else { PartnerRow.PartnerKey = TImportExportYml.NewPartnerKey; TImportExportYml.NewPartnerKey--; } String PartnerClass = TYml2Xml.GetAttributeRecursive(LocalNode, "class"); TLogging.LogAtLevel(TLogging.DEBUGLEVEL_TRACE, PartnerClass + " " + LocalNode.Name + " " + "PartnerKey=" + PartnerRow.PartnerKey ); if (IsExistingPartner && (PartnerClass != PartnerRow.PartnerClass)) { throw new Exception(String.Format("Error: Yml contains Existing Partner {0} with a different partner class {1}!", PartnerRow.PartnerKey, PartnerClass)); } PartnerRow.PartnerClass = PartnerClass; if (PartnerClass == MPartnerConstants.PARTNERCLASS_FAMILY) { PFamilyRow FamilyRow; if (IsExistingPartner) { AMainDS.Merge(PFamilyAccess.LoadByPrimaryKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.PFamily.DefaultView.RowFilter = String.Format("{0} = '{1}'", PFamilyTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey); FamilyRow = (PFamilyRow)AMainDS.PFamily.DefaultView[0].Row; } else { FamilyRow = AMainDS.PFamily.NewRowTyped(); FamilyRow.PartnerKey = PartnerRow.PartnerKey; PartnerRow.PartnerClass = MPartnerConstants.PARTNERCLASS_FAMILY; AMainDS.PFamily.Rows.Add(FamilyRow); } FamilyRow.FamilyName = TYml2Xml.GetAttributeRecursive(LocalNode, "LastName"); FamilyRow.FirstName = TYml2Xml.GetAttribute(LocalNode, "FirstName"); FamilyRow.Title = TYml2Xml.GetAttribute(LocalNode, "Title"); if (TYml2Xml.HasAttribute(LocalNode, "CreatedAt")) { FamilyRow.DateCreated = Convert.ToDateTime(TYml2Xml.GetAttribute(LocalNode, "CreatedAt")); } PartnerRow.AddresseeTypeCode = MPartnerConstants.PARTNERCLASS_FAMILY; PartnerRow.PartnerShortName = Calculations.DeterminePartnerShortName(FamilyRow.FamilyName, FamilyRow.Title, FamilyRow.FirstName); } if (PartnerClass == MPartnerConstants.PARTNERCLASS_PERSON) { PPersonRow PersonRow; if (IsExistingPartner) { AMainDS.Merge(PPersonAccess.LoadByPrimaryKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.PPerson.DefaultView.RowFilter = String.Format("{0} = '{1}'", PPersonTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey); PersonRow = (PPersonRow)AMainDS.PPerson.DefaultView[0].Row; } else { PersonRow = AMainDS.PPerson.NewRowTyped(); PersonRow.PartnerKey = PartnerRow.PartnerKey; AMainDS.PPerson.Rows.Add(PersonRow); } PersonRow.FamilyName = TYml2Xml.GetAttributeRecursive(LocalNode, "LastName"); PersonRow.FirstName = TYml2Xml.GetAttribute(LocalNode, "FirstName"); PersonRow.Title = TYml2Xml.GetAttribute(LocalNode, "Title"); if (TYml2Xml.HasAttribute(LocalNode, "CreatedAt")) { PersonRow.DateCreated = Convert.ToDateTime(TYml2Xml.GetAttribute(LocalNode, "CreatedAt")); } // PersonRow.Sp PartnerRow.PartnerShortName = Calculations.DeterminePartnerShortName(PersonRow.FamilyName, PersonRow.Title, PersonRow.FirstName); } else if (PartnerClass == MPartnerConstants.PARTNERCLASS_ORGANISATION) { POrganisationRow OrganisationRow; if (IsExistingPartner) { AMainDS.Merge(POrganisationAccess.LoadByPrimaryKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.POrganisation.DefaultView.RowFilter = String.Format("{0} = '{1}'", POrganisationTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey); OrganisationRow = (POrganisationRow)AMainDS.POrganisation.DefaultView[0].Row; } else { OrganisationRow = AMainDS.POrganisation.NewRowTyped(); OrganisationRow.PartnerKey = PartnerRow.PartnerKey; AMainDS.POrganisation.Rows.Add(OrganisationRow); } OrganisationRow.OrganisationName = TYml2Xml.GetAttributeRecursive(LocalNode, "Name"); PartnerRow.PartnerShortName = OrganisationRow.OrganisationName; } else if (PartnerClass == MPartnerConstants.PARTNERCLASS_UNIT) { PUnitRow UnitRow; if (IsExistingPartner) { AMainDS.Merge(PUnitAccess.LoadByPrimaryKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.PUnit.DefaultView.RowFilter = String.Format("{0} = '{1}'", PUnitTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey); UnitRow = (PUnitRow)AMainDS.PUnit.DefaultView[0].Row; } else { UnitRow = AMainDS.PUnit.NewRowTyped(); UnitRow.PartnerKey = PartnerRow.PartnerKey; AMainDS.PUnit.Rows.Add(UnitRow); } UnitRow.UnitTypeCode = TYml2Xml.GetAttributeRecursive(LocalNode, "UnitTypeCode"); UnitRow.UnitName = TYml2Xml.GetAttributeRecursive(LocalNode, "Name"); if (PartnerRow.PartnerKey < -1) { throw new Exception("Invalid Partner Key or No Partner Key - and no proper handling implemented"); // from here... /* * AVerificationResult.Add(new TVerificationResult( * String.Format(Catalog.GetString("Importing Unit {0}"), UnitRow.UnitName), * Catalog.GetString("You need to provide a partner key for the unit"), * TResultSeverity.Resv_Critical)); */ // ...to here: throws Exception in case of a illegal import file? // The above code must have a glitch } if (!TYml2Xml.HasAttribute(LocalNode, "ParentUnitKey")) { throw new Exception( "The currently being processed unit (PartnerKey " + PartnerRow.PartnerKey + ") requires a ParentUnitKey."); } Int64 ParentKey = Convert.ToInt64(TYml2Xml.GetAttributeRecursive(LocalNode, "ParentUnitKey")); UmUnitStructureRow UnitStructureRow = null; if (IsExistingPartner) { AMainDS.Merge(UmUnitStructureAccess.LoadViaPUnitChildUnitKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.UmUnitStructure.DefaultView.RowFilter = String.Format("{0} = '{1}'", UmUnitStructureTable.GetChildUnitKeyDBName(), PartnerRow.PartnerKey); if (AMainDS.UmUnitStructure.DefaultView.Count > 0) { UnitStructureRow = (UmUnitStructureRow)AMainDS.UmUnitStructure.DefaultView[0].Row; } } if (UnitStructureRow == null) { UnitStructureRow = AMainDS.UmUnitStructure.NewRowTyped(); UnitStructureRow.ParentUnitKey = ParentKey; UnitStructureRow.ChildUnitKey = PartnerRow.PartnerKey; AMainDS.UmUnitStructure.Rows.Add(UnitStructureRow); } else { UnitStructureRow.ParentUnitKey = ParentKey; UnitStructureRow.ChildUnitKey = PartnerRow.PartnerKey; } PartnerRow.PartnerShortName = UnitRow.UnitName; } else if (PartnerClass == MPartnerConstants.PARTNERCLASS_BANK) { PBankRow BankRow; if (IsExistingPartner) { AMainDS.Merge(PBankAccess.LoadByPrimaryKey(PartnerRow.PartnerKey, ATransaction)); AMainDS.PBank.DefaultView.RowFilter = String.Format("{0} = '{1}'", PBankTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey); BankRow = (PBankRow)AMainDS.PBank.DefaultView[0].Row; } else { BankRow = AMainDS.PBank.NewRowTyped(); BankRow.PartnerKey = PartnerRow.PartnerKey; AMainDS.PBank.Rows.Add(BankRow); } BankRow.BranchName = TYml2Xml.GetAttribute(LocalNode, "BranchName"); BankRow.BranchCode = TYml2Xml.GetAttribute(LocalNode, "BranchCode"); BankRow.Bic = TYml2Xml.GetAttribute(LocalNode, "BranchBic"); BankRow.EpFormatFile = TYml2Xml.GetAttribute(LocalNode, "EpFormatFile"); if (TYml2Xml.HasAttribute(LocalNode, "CreatedAt")) { BankRow.DateCreated = Convert.ToDateTime(TYml2Xml.GetAttribute(LocalNode, "CreatedAt")); } } else { /* * throw new Exception( * "Unknown Partner Class" + * TYml2Xml.GetAttributeRecursive(LocalNode, "class")); */ // TODO AVerificationResult add failing problem: unknown partner class } PartnerRow.StatusCode = TYml2Xml.GetAttributeRecursive(LocalNode, "status"); // import special types StringCollection SpecialTypes = StringHelper.StrSplit(TYml2Xml.GetAttributeRecursive(LocalNode, "SpecialTypes"), ","); if (IsExistingPartner) { PPartnerTypeAccess.LoadViaPPartner(AMainDS, PartnerRow.PartnerKey, ATransaction); } foreach (string SpecialType in SpecialTypes) { PPartnerTypeRow PartnerTypeRow = null; AMainDS.PPartnerType.DefaultView.RowFilter = String.Format("{0}={1} AND {2}='{3}'", PPartnerTypeTable.GetPartnerKeyDBName(), PartnerRow.PartnerKey, PPartnerTypeTable.GetTypeCodeDBName(), SpecialType ); if (AMainDS.PPartnerType.DefaultView.Count > 0) { PartnerTypeRow = (PPartnerTypeRow)AMainDS.PPartnerType.DefaultView[0].Row; } else { PartnerTypeRow = AMainDS.PPartnerType.NewRowTyped(); PartnerTypeRow.PartnerKey = PartnerRow.PartnerKey; PartnerTypeRow.TypeCode = SpecialType.Trim(); AMainDS.PPartnerType.Rows.Add(PartnerTypeRow); } // Check Partner type exists, or create it bool TypeIsKnown = PTypeAccess.Exists(PartnerTypeRow.TypeCode, ATransaction); if (!TypeIsKnown) { Int32 RowIdx = AMainDS.PType.DefaultView.Find(PartnerTypeRow.TypeCode); // I might have created it a second ago.. if (RowIdx < 0) { PTypeRow TypeRow = AMainDS.PType.NewRowTyped(); TypeRow.TypeCode = PartnerTypeRow.TypeCode; TypeRow.TypeDescription = "Created from YAML import"; AMainDS.PType.Rows.Add(TypeRow); } } } // import subscriptions StringCollection Subscriptions = StringHelper.StrSplit(TYml2Xml.GetAttributeRecursive(LocalNode, "Subscriptions"), ","); foreach (string publicationCode in Subscriptions) { PSubscriptionRow subscription = AMainDS.PSubscription.NewRowTyped(); subscription.PartnerKey = PartnerRow.PartnerKey; subscription.PublicationCode = publicationCode.Trim(); subscription.ReasonSubsGivenCode = "FREE"; AMainDS.PSubscription.Rows.Add(subscription); } // import address XmlNode addressNode = TYml2Xml.GetChild(LocalNode, "Address"); if ((addressNode == null) || (TYml2Xml.GetAttributeRecursive(addressNode, "Street").Length == 0)) { if (!IsExistingPartner) { // add the empty location PPartnerLocationRow partnerlocation = AMainDS.PPartnerLocation.NewRowTyped(true); partnerlocation.SiteKey = 0; partnerlocation.PartnerKey = PartnerRow.PartnerKey; partnerlocation.DateEffective = DateTime.Now; partnerlocation.LocationType = "HOME"; partnerlocation.SendMail = false; partnerlocation.EmailAddress = TYml2Xml.GetAttributeRecursive(addressNode, "Email"); partnerlocation.TelephoneNumber = TYml2Xml.GetAttributeRecursive(addressNode, "Phone"); partnerlocation.MobileNumber = TYml2Xml.GetAttributeRecursive(addressNode, "MobilePhone"); AMainDS.PPartnerLocation.Rows.Add(partnerlocation); } } else { PLocationRow location = AMainDS.PLocation.NewRowTyped(true); location.LocationKey = (AMainDS.PLocation.Rows.Count + 1) * -1; location.SiteKey = 0; if (!TYml2Xml.HasAttributeRecursive(LocalNode, "Country")) { throw new Exception(Catalog.GetString("Missing Country Attribute")); } location.CountryCode = TYml2Xml.GetAttributeRecursive(addressNode, "Country"); location.StreetName = TYml2Xml.GetAttributeRecursive(addressNode, "Street"); location.City = TYml2Xml.GetAttributeRecursive(addressNode, "City"); location.PostalCode = TYml2Xml.GetAttributeRecursive(addressNode, "PostCode"); AMainDS.PLocation.Rows.Add(location); PPartnerLocationRow partnerlocation = AMainDS.PPartnerLocation.NewRowTyped(true); partnerlocation.SiteKey = 0; partnerlocation.LocationKey = location.LocationKey; partnerlocation.PartnerKey = PartnerRow.PartnerKey; partnerlocation.SendMail = true; partnerlocation.DateEffective = DateTime.Now; partnerlocation.LocationType = "HOME"; partnerlocation.EmailAddress = TYml2Xml.GetAttributeRecursive(addressNode, "Email"); partnerlocation.TelephoneNumber = TYml2Xml.GetAttributeRecursive(addressNode, "Phone"); partnerlocation.MobileNumber = TYml2Xml.GetAttributeRecursive(addressNode, "MobilePhone"); AMainDS.PPartnerLocation.Rows.Add(partnerlocation); } // import finance details (bank account number) XmlNode financialDetailsNode = TYml2Xml.GetChild(LocalNode, "FinancialDetails"); ParseFinancialDetails(AMainDS, financialDetailsNode, PartnerRow.PartnerKey, ATransaction); } LocalNode = LocalNode.NextSibling; } }