ModCodeAndControlHolder XmlToCode(XmlDocument XDoc, Form F) { XmlNode UiTagNode = XDoc.ChildNodes[0]; ReadAllControlNames(UiTagNode); StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); PyCode.AppendLine("ui = ModUi()"); RbCode.AppendLine("ui = ModUi.new()"); ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); if (XDoc.DocumentElement.Name.Equals("UI", StringComparison.OrdinalIgnoreCase)) { ModCodeAndControlHolder CPECC = ConvertControlPropertiesEventHandlersChildrenToCode(UiTagNode, "ui", F); PyCode.Append(CPECC.PyCode); PyCode.AppendLine("ui.ShowUi()"); RbCode.Append(CPECC.RbCode); RbCode.AppendLine("ui.ShowUi()"); } else { throw new Exception("Invalid UI description. Outermost tag must be the <ui> tag."); } Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = F; return Result; }
ModCodeAndControlHolder ConvertControlPropertyNodeToCode(XmlNode PropertyNode, string ControlName, Control C) { StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); switch (PropertyNode.Name) { case (ModUiTags.Size): SetSizeInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Location): SetLocationInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Anchor): SetAnchorInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Dock): SetDockStyleInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Enabled): SetEnabledInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Visible): SetVisibleInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.BackColor): SetBackColorInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.ForeColor): SetForeColorInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Font): SetFontInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.BorderStyle): SetBorderStyleInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Icon): SetIconInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.ReadOnly): SetReadOnlyInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Text): SetTextInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.PasswordChar): SetPasswordCharInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.MultiLine): SetMultiLineInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Wordwrap): SetWordwrapInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.TextAlign): SetTextAlignInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.ScrollBars): SetScrollBarsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; //case (ModUiTags.Rtf): // SetRtfInCode(PyCode, RbCode, ControlName, C, PropertyNode); // break; case (ModUiTags.RichTextScrollBars): SetRichTextScrollBarsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.DetectUrls): SetDetectUrlsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Checked): SetCheckedInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.Columns): SetColumnsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.AllowUserToAddRows): SetAllowUserToAddRowsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.AllowUserToDeleteRows): SetAllowUserToDeleteRowsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.AllowUserToResizeColumns): SetAllowUserToResizeColumnsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.AllowUserToResizeRows): SetAllowUserToResizeRowsInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.ColumnHeadersVisible): SetColumnHeadersVisibleInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.RowHeadersVisible): SetRowHeadersVisibleInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.GridColor): SetGridColorInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.BackgroundColor): SetBackgroundColorInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; case (ModUiTags.TabPages): SetTabPagesInCode(PyCode, RbCode, ControlName, C, PropertyNode); break; } ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = C; return Result; }
ModCodeAndControlHolder RawXmlToCode(string UiXml, Form F) { ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); XmlDocument XDoc = new XmlDocument(); XDoc.LoadXml(UiXml); MemoryStream MS = new MemoryStream(); XmlTextWriter XWriter = new XmlTextWriter(MS, Encoding.ASCII); XWriter.Formatting = Formatting.Indented; XDoc.WriteContentTo(XWriter); XWriter.Flush(); MS.Flush(); MS.Position = 0; StreamReader SR = new StreamReader(MS); Result.XmlCode = SR.ReadToEnd(); ModCodeAndControlHolder PyRbControlResult = XmlToCode(XDoc, F); Result.PyCode = PyRbControlResult.PyCode; Result.RbCode = PyRbControlResult.RbCode; Result.Control = PyRbControlResult.Control; return Result; }
ModCodeAndControlHolder ConvertControlPropertiesNodeToCode(XmlNode PropertiesNode, string ControlName, Control C) { StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); foreach (XmlNode ChildNode in PropertiesNode.ChildNodes) { ModCodeAndControlHolder PropertyCode = ConvertControlPropertyNodeToCode(ChildNode, ControlName, C); PyCode.Append(PropertyCode.PyCode); RbCode.Append(PropertyCode.RbCode); } ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = C; return Result; }
ModCodeAndControlHolder ConvertControlPropertiesEventHandlersChildrenToCode(XmlNode Node, string ControlName, Control C) { XmlNode PropertiesNode = null; XmlNode EventHandlersNode = null; XmlNode ChildrenNode = null; foreach (XmlNode SubNode in Node.ChildNodes) { switch (SubNode.Name) { case (ModUiTags.Properties): PropertiesNode = SubNode; break; case (ModUiTags.EventHandlers): EventHandlersNode = SubNode; break; case (ModUiTags.Children): ChildrenNode = SubNode; break; default: continue; } } StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); ModCodeAndControlHolder NodeResults = new ModCodeAndControlHolder(); if (PropertiesNode != null) { NodeResults = ConvertControlPropertiesNodeToCode(PropertiesNode, ControlName, C); PyCode.Append(NodeResults.PyCode); RbCode.Append(NodeResults.RbCode); } if (EventHandlersNode != null) { NodeResults = ConvertControlEventHandlersNodeToCode(EventHandlersNode, ControlName, C); PyCode.Append(NodeResults.PyCode); RbCode.Append(NodeResults.RbCode); } if (ChildrenNode != null) { NodeResults = ConvertControlChildXmlNodesToCode(ChildrenNode, ControlName, C); PyCode.Append(NodeResults.PyCode); RbCode.Append(NodeResults.RbCode); } ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = C; return Result; }
ModCodeAndControlHolder ConvertControlEventHandlersNodeToCode(XmlNode EventHandlersNode, string ControlName, Control C) { StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); foreach (XmlNode ChildNode in EventHandlersNode.ChildNodes) { ModCodeAndControlHolder ChildCode = ConvertControlEventHandlerNodeToCode(ChildNode, ControlName, C); PyCode.Append(ChildCode.PyCode); RbCode.Append(ChildCode.RbCode); } ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = C; return Result; }
ModCodeAndControlHolder ConvertControlEventHandlerNodeToCode(XmlNode EventHandlerNode, string ControlName, Control C) { StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); string EventName = EventHandlerNode.Name; string EventHandlerMethod = EventHandlerNode.InnerText; if (EventHandlerMethod.Length > 0) { PyCode.AppendLine(string.Format("{0}.{1} += lambda s,e: {2}", ControlName, EventName, EventHandlerMethod)); RbCode.AppendLine(string.Format("{0}.{1} do |s, e|", ControlName, EventName)); RbCode.AppendLine(string.Format(" {0}", EventHandlerMethod)); RbCode.AppendLine("end"); switch (C.GetType().Name) { case ("Form"): ModUi.EventHandlers[EventName] = EventHandlerMethod; break; case ("ModTextBox"): (C as ModTextBox).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModRichTextBox"): (C as ModRichTextBox).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModButton"): (C as ModButton).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModCheckBox"): (C as ModCheckBox).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModRadioButton"): (C as ModRadioButton).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModLabel"): (C as ModLabel).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModDataGridView"): (C as ModDataGridView).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModPanel"): (C as ModPanel).EventHandlers[EventName] = EventHandlerMethod; break; case ("ModTabControl"): (C as ModTabControl).EventHandlers[EventName] = EventHandlerMethod; break; } } ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = C; return Result; }
ModCodeAndControlHolder ConvertControlChildXmlNodesToCode(XmlNode ParentNode, string ParentName, Control ParentControl) { StringBuilder PyCode = new StringBuilder(); StringBuilder RbCode = new StringBuilder(); foreach (XmlNode ChildNode in ParentNode.ChildNodes) { string ReadControlName = GetControlNameFromControlXmlNode(ChildNode); string ControlName = GetControlName(ChildNode.Name, ReadControlName); Control C; switch (ChildNode.Name) { case ("ModLabel"): PyCode.AppendLine(string.Format("{0} = ModLabel()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModLabel.new()", ControlName)); try { C = (ModLabel)ModUiDesigner.IDH.CreateComponent(typeof(ModLabel), ControlName); } catch { C = new ModLabel(); } break; case ("ModTextBox"): PyCode.AppendLine(string.Format("{0} = ModTextBox()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModTextBox.new()", ControlName)); try { C = (ModTextBox)ModUiDesigner.IDH.CreateComponent(typeof(ModTextBox), ControlName); } catch { C = new ModTextBox(); } break; case ("ModRichTextBox"): PyCode.AppendLine(string.Format("{0} = ModRichTextBox()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModRichTextBox.new()", ControlName)); try { C = (ModRichTextBox)ModUiDesigner.IDH.CreateComponent(typeof(ModRichTextBox), ControlName); } catch { C = new ModRichTextBox(); } break; case ("ModButton"): PyCode.AppendLine(string.Format("{0} = ModButton()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModButton.new()", ControlName)); try { C = (ModButton)ModUiDesigner.IDH.CreateComponent(typeof(ModButton), ControlName); } catch { C = new ModButton(); } break; case ("ModCheckBox"): PyCode.AppendLine(string.Format("{0} = ModCheckBox()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModCheckBox.new()", ControlName)); try { C = (ModCheckBox)ModUiDesigner.IDH.CreateComponent(typeof(ModCheckBox), ControlName); } catch { C = new ModCheckBox(); } break; case ("ModRadioButton"): PyCode.AppendLine(string.Format("{0} = ModRadioButton()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModRadioButton.new()", ControlName)); try { C = (ModRadioButton)ModUiDesigner.IDH.CreateComponent(typeof(ModRadioButton), ControlName); } catch { C = new ModRadioButton(); } break; case ("ModDataGridView"): PyCode.AppendLine(string.Format("{0} = ModDataGridView()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModDataGridView.new()", ControlName)); try { C = (ModDataGridView)ModUiDesigner.IDH.CreateComponent(typeof(ModDataGridView), ControlName); } catch { C = new ModDataGridView(); } break; case ("ModPanel"): PyCode.AppendLine(string.Format("{0} = ModPanel()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModPanel.new()", ControlName)); try { C = (ModPanel)ModUiDesigner.IDH.CreateComponent(typeof(ModPanel), ControlName); } catch { C = new ModPanel(); } break; case ("ModTabControl"): PyCode.AppendLine(string.Format("{0} = ModTabControl()", ControlName)); RbCode.AppendLine(string.Format("{0} = ModTabControl.new()", ControlName)); ModTabControl M = new ModTabControl(); try { C = (ModTabControl)ModUiDesigner.IDH.CreateComponent(typeof(ModTabControl), ControlName); } catch { C = new ModTabControl(); } break; default: continue; } SetNameInCode(PyCode, RbCode, ControlName, C); ModCodeAndControlHolder CPECC = ConvertControlPropertiesEventHandlersChildrenToCode(ChildNode, ControlName, C); PyCode.Append(CPECC.PyCode); RbCode.Append(CPECC.RbCode); PyCode.AppendLine(string.Format("{0}.Controls.Add({1})", ParentName, ControlName)); RbCode.AppendLine(string.Format("{0}.Controls.Add({1})", ParentName, ControlName)); PyCode.AppendLine(string.Format("ui.ModControls['{0}'] = {0}", ControlName)); RbCode.AppendLine(string.Format("ui.mod_controls['{0}'] = {0}", ControlName)); CPECC.Control.Parent = ParentControl; } ModCodeAndControlHolder Result = new ModCodeAndControlHolder(); Result.PyCode = PyCode.ToString(); Result.RbCode = RbCode.ToString(); Result.Control = ParentControl; return Result; }