# -*- coding: utf-8 -*-
"""
把旧项目 主窗口.ui.cs 的 UI 迁移到 SharpDevelop 停靠面板项目。
映射:旧 tabControl2/tabControl3 的 9 个页签 → 9 个 DockWindow;
旧 tabControl1(顶部 项目/报价/设置)+ statusStrip1 → MainForm。
仅迁移 UI(控件、属性、布局),事件与逻辑下一阶段迁移。
"""
import io
import re
import os
import sys
SRC = r"F:\pycode\wpf\src\WinFormsDesigner.Fx48\bin\Debug\net48\Samples\COOO\scr\成套报价软件\主窗口.ui.cs"
DST_PROJECT = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件\成套报价软件"
DOCK_MAP = [
("DockWindow", "tabPage3", "项目"),
("DockWindow2", "tabPage4", "报价"),
("DockWindow3", "tabPage10", "选型"),
("DockWindow4", "tabPage5", "元件库"),
("DockWindow5", "tabPage6", "用户库"),
("DockWindow6", "tabPage11", "柜体库"),
("DockWindow7", "tabPage12", "母排"),
("DockWindow8", "tabPage13", "方案"),
("DockWindow9", "tabPage14", "箱体计算"),
]
NAME = r"[A-Za-z0-9_\u4e00-\u9fff]+"
# ---------------------------------------------------------------- 解析
def parse(text):
lines = text.split("\n")
decls = [] # [(name, fulltype)] 按旧文件声明顺序
decls_seen = set()
begin_inits = set()
top_statements = [] # 声明区/尾部区语句(无块头上下文)
blocks = [] # [(header_name, [statement strings])] 属性块
edges = [] # [(parent_key, [child])] Controls.AddRange
ts_edges = [] # [(toolstrip, [items])] ToolStrip Items.AddRange
cur_name = None
cur_stmt = []
cur_lines = []
prev_blank_comment = False
def flush_stmt():
nonlocal cur_stmt
if not cur_stmt:
return
stmt = "\n".join(cur_stmt).strip()
cur_stmt = []
if not stmt:
return
m = re.match(r"this\.(" + NAME + r"(?:\.Panel[12])?)\.Controls\.AddRange\(new System\.Windows\.Forms\.Control\[\] \{(.*?)\}\);", stmt, re.S)
if m:
kids = re.findall(r"this\.(" + NAME + r")(?=[,\s}])", m.group(2))
edges.append((m.group(1), kids))
return
m = re.match(r"this\.Controls\.AddRange\(new System\.Windows\.Forms\.Control\[\] \{(.*?)\}\);", stmt, re.S)
if m:
kids = re.findall(r"this\.(" + NAME + r")(?=[,\s}])", m.group(1))
edges.append(("", kids))
return
m = re.match(r"this\.(" + NAME + r")\.Items\.AddRange\(new System\.Windows\.Forms\.ToolStripItem\[\] \{(.*?)\}\);", stmt, re.S)
if m:
kids = re.findall(r"this\.(" + NAME + r")(?=[,\s}])", m.group(2))
ts_edges.append((m.group(1), kids))
return
m = re.match(r"this\.(" + NAME + r") = new ([\w.]+)\(\);$", stmt)
if m:
if m.group(1) == "components":
return
if m.group(1) not in decls_seen:
decls.append((m.group(1), m.group(2)))
decls_seen.add(m.group(1))
return
if re.match(r"\(\(System\.ComponentModel\.ISupportInitialize\)\(this\.(" + NAME + r")\)\)\.BeginInit\(\);", stmt):
begin_inits.add(re.match(r"\(\(System\.ComponentModel\.ISupportInitialize\)\(this\.(" + NAME + r")\)\)\.BeginInit\(\);", stmt).group(1))
return
if cur_name is not None:
cur_lines.append(stmt)
else:
top_statements.append(stmt)
field_re = re.compile(r"^private [\w.]+ " + NAME + r";$")
for raw in lines:
line = raw.rstrip("\r")
s = line.strip()
if field_re.match(s):
continue
m = re.match(r"^ {12}// (" + NAME + r")$", line)
if m and prev_blank_comment:
flush_stmt()
if cur_name is not None and cur_lines:
blocks.append((cur_name, cur_lines))
cur_name, cur_lines = m.group(1), []
prev_blank_comment = False
continue
prev_blank_comment = (s == "//")
if s.startswith("this.") or s.startswith("((System") or cur_stmt:
cur_stmt.append(s)
if s.endswith(";"):
flush_stmt()
flush_stmt()
if cur_name is not None and cur_lines:
blocks.append((cur_name, cur_lines))
return decls, begin_inits, blocks, top_statements, edges, ts_edges
def classify(blocks):
ctrl_blocks = {}
form_block = []
for name, stmts in blocks:
if name == "主窗口":
form_block = stmts
else:
ctrl_blocks[name] = stmts
return ctrl_blocks, form_block
# ---------------------------------------------------------------- 默认值过滤
DROP_GLOBAL = [
r"\.Enabled = true;$",
r"\.Visible = true;$",
r"\.TabStop = true;$",
r"\.Font = new System\.Drawing\.Font\(\"宋体\", 9F, System\.Drawing\.FontStyle\.Regular, System\.Drawing\.GraphicsUnit\.Point(, 1)?\);$",
r"\.ForeColor = System\.Drawing\.SystemColors\.ControlText;$",
r"\.Margin = new System\.Windows\.Forms\.Padding\((3, 3, 3, 3|0, 0, 0, 0)\);$",
r"\.MaximumSize = new System\.Drawing\.Size\(0, 0\);$",
r"\.MinimumSize = new System\.Drawing\.Size\(0, 0\);$",
r"\.Padding = new System\.Windows\.Forms\.Padding\(0, 0, 0, 0\);$",
r"\.AutoScroll = false;$",
r"\.AutoSize = false;$",
r"\.AutoSizeMode = System\.Windows\.Forms\.AutoSizeMode\.GrowOnly;$",
r"\.AutoValidate = System\.Windows\.Forms\.AutoValidate\.\w+;$",
r"\.AllowDrop = false;$",
r"\.UseWaitCursor = false;$",
r"\.BackgroundImageLayout = System\.Windows\.Forms\.ImageLayout\.Tile;$",
r"\.AutoEllipsis = false;$",
r"\.DialogResult = System\.Windows\.Forms\.DialogResult\.None;$",
r"\.FlatStyle = System\.Windows\.Forms\.FlatStyle\.Standard;$",
r"\.ImageAlign = System\.Drawing\.ContentAlignment\.MiddleCenter;$",
r"\.TextImageRelation = System\.Windows\.Forms\.TextImageRelation\.Overlay;$",
r"\.UseMnemonic = true;$",
r"\.UseCompatibleTextRendering = false;$",
r"\.Cursor = System\.Windows\.Forms\.Cursors\.Default;$",
r"\.ImeMode = System\.Windows\.Forms\.ImeMode\.\w+;$",
r"\.RightToLeft = System\.Windows\.Forms\.RightToLeft\.No;$",
r"\.CauseValidation = true;$",
r"\.Dock = System\.Windows\.Forms\.DockStyle\.None;$",
r"\.GridColor = System\.Drawing\.SystemColors\.ControlDark;$",
r"\.ColumnHeadersVisible = true;$",
r"\.RowHeadersVisible = true;$",
r"\.ShowCellErrors = true;$",
r"\.ShowCellToolTips = true;$",
r"\.ShowEditingIcon = true;$",
r"\.ShowRowErrors = true;$",
r"\.StandardTab = false;$",
r"\.VirtualMode = false;$",
r"\.MultiSelect = true;$",
r"\.ScrollBars = System\.Windows\.Forms\.ScrollBars\.Both;$",
r"\.AllowUserToResizeColumns = true;$",
r"\.AutoSizeColumnsMode = System\.Windows\.Forms\.DataGridViewAutoSizeColumnsMode\.None;$",
r"\.AutoSizeRowsMode = System\.Windows\.Forms\.DataGridViewAutoSizeRowsMode\.None;$",
r"\.ClipboardCopyMode = System\.Windows\.Forms\.DataGridViewClipboardCopyMode\.EnableWithAutoHeaderText;$",
r"\.ColumnHeadersBorderStyle = System\.Windows\.Forms\.DataGridViewHeaderBorderStyle\.Raised;$",
r"\.RowHeadersBorderStyle = System\.Windows\.Forms\.DataGridViewHeaderBorderStyle\.Raised;$",
r"\.RowHeadersWidthSizeMode = System\.Windows\.Forms\.DataGridViewRowHeadersWidthSizeMode\.EnableResizing;$",
r"\.ColumnHeadersHeightSizeMode = System\.Windows\.Forms.DataGridViewColumnHeadersHeightSizeMode\.EnableResizing;$",
r"\.EnableCellPaste = false;$",
r"\.DefaultCellStyle\.BackColor = System\.Drawing\.SystemColors\.Window;$",
r"\.DefaultCellStyle\.ForeColor = System\.Drawing\.SystemColors\.ControlText;$",
r"\.DefaultCellStyle\.SelectionBackColor = System\.Drawing\.SystemColors\.Highlight;$",
r"\.DefaultCellStyle\.SelectionForeColor = System\.Drawing\.SystemColors\.HighlightText;$",
r"\.DefaultCellStyle\.WrapMode = System\.Windows\.Forms\.DataGridViewTriState\.False;$",
r"\.DefaultCellStyle\.Alignment = System\.Windows\.Forms\.DataGridViewContentAlignment\.MiddleLeft;$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle|DefaultCellStyle)\.Font = new System\.Drawing\.Font\(\"宋体\", 9F.*\);$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle)\.BackColor = System\.Drawing\.SystemColors\.Control;$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle)\.ForeColor = System\.Drawing\.SystemColors\.WindowText;$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle)\.SelectionBackColor = System\.Drawing\.SystemColors\.Highlight;$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle)\.SelectionForeColor = System\.Drawing\.SystemColors\.HighlightText;$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle)\.WrapMode = System\.Windows\.Forms\.DataGridViewTriState\.True;$",
r"\.(ColumnHeadersDefaultCellStyle|RowHeadersDefaultCellStyle)\.Alignment = System\.Windows\.Forms\.DataGridViewContentAlignment\.MiddleLeft;$",
# TextBox / ComboBox 默认值
r"\.AcceptsReturn = false;$",
r"\.AutoCompleteMode = System\.Windows\.Forms\.AutoCompleteMode\.None;$",
r"\.AutoCompleteSource = System\.Windows\.Forms\.AutoCompleteSource\.None;$",
r"\.CharacterCasing = System\.Windows\.Forms\.CharacterCasing\.Normal;$",
r"\.Multiline = false;$",
r"\.UseSystemPasswordChar = false;$",
r"\.AcceptsTab = false;$",
r"\.ShortcutsEnabled = true;$",
r"\.HideSelection = true;$",
r"\.WordWrap = true;$",
r"\.MaxLength = 32767;$",
r"\.MaxLength = 0;$",
r"\.ReadOnly = false;$",
r"\.ScrollBars = System\.Windows\.Forms\.ScrollBars\.None;$",
r"\.TextAlign = System\.Windows\.Forms\.HorizontalAlignment\.Left;$",
r"\.BorderStyle = System\.Windows\.Forms\.BorderStyle\.Fixed3D;$",
r"\.DrawMode = System\.Windows\.Forms\.DrawMode\.Normal;$",
r"\.IntegralHeight = true;$",
r"\.MaxDropDownItems = 8;$",
r"\.Sorted = false;$",
r"\.DropDownStyle = System\.Windows\.Forms\.ComboBoxStyle\.DropDown;$",
r"\.CanOverflow = true;$",
r"\.AllowItemReorder = false;$",
r"\.AllowMerge = true;$",
r"\.GripMargin = new System\.Windows\.Forms\.Padding\(2, 2, 2, 2\);$",
r"\.ImageScalingSize = new System\.Drawing\.Size\(16, 16\);$",
r"\.LayoutStyle = System\.Windows\.Forms\.ToolStripLayoutStyle\.HorizontalStackWithOverflow;$",
r"\.Stretch = false;$",
r"\.RenderMode = System\.Windows\.Forms\.ToolStripRenderMode\.ManagerRenderMode;$",
r"\.ShowItemToolTips = true;$",
r"\.TextDirection = System\.Windows\.Forms\.ToolStripTextDirection\.Horizontal;$",
r"\.Padding = new System\.Windows\.Forms\.Padding\(0, 0, 1, 0\);$",
]
DROP_BY_TYPE = {
"Panel": [r"\.BorderStyle = System\.Windows\.Forms\.BorderStyle\.None;$",
r"\.BackColor = System\.Drawing\.SystemColors\.Control;$"],
"SplitContainer": [
r"\.BorderStyle = System\.Windows\.Forms\.BorderStyle\.None;$",
r"\.FixedPanel = System\.Windows\.Forms\.FixedPanel\.None;$",
r"\.IsSplitterFixed = false;$",
r"\.Orientation = System\.Windows\.Forms\.Orientation\.Vertical;$",
r"\.Panel1Collapsed = false;$",
r"\.Panel2Collapsed = false;$",
r"\.Panel1MinSize = 25;$",
r"\.Panel2MinSize = 25;$",
r"\.SplitterIncrement = 1;$",
r"\.SplitterWidth = 4;$",
r"\.BackColor = System\.Drawing\.SystemColors\.Control;$",
],
"TabControl": [
r"\.Alignment = System\.Windows\.Forms\.TabAlignment\.Top;$",
r"\.Appearance = System\.Windows\.Forms\.TabAppearance\.Normal;$",
r"\.DrawMode = System\.Windows\.Forms\.TabDrawMode\.Normal;$",
r"\.HotTrack = false;$",
r"\.Multiline = false;$",
r"\.RightToLeftLayout = false;$",
r"\.ShowToolTips = false;$",
r"\.BackColor = System\.Drawing\.SystemColors\.Control;$",
],
"TabPage": [
r"\.BorderStyle = System\.Windows\.Forms\.BorderStyle\.None;$",
r"\.AutoScrollMargin = new System\.Drawing\.Size\(0, 0\);$",
r"\.AutoScrollMinSize = new System\.Drawing\.Size\(0, 0\);$",
],
"Button": [
r"\.BackColor = System\.Drawing\.SystemColors\.Control;$",
r"\.TextAlign = System\.Drawing\.ContentAlignment\.MiddleCenter;$",
],
"Label": [
r"\.BackColor = System\.Drawing\.SystemColors\.Control;$",
],
}
DROP_GLOBAL_C = [re.compile(p) for p in DROP_GLOBAL]
DROP_BY_TYPE_C = {k: [re.compile(p) for p in v] for k, v in DROP_BY_TYPE.items()}
def short_type(t):
return t.split(".")[-1]
def should_drop(stmt, stype):
for c in DROP_GLOBAL_C:
if c.search(stmt):
return True
for c in DROP_BY_TYPE_C.get(stype, []):
if c.search(stmt):
return True
return False
# ---------------------------------------------------------------- 列转换
def extract_columns(stmts):
cols = []
rest = []
for st in stmts:
m = re.match(r"this\.(" + NAME + r")\.Columns\.Add\(new System\.Windows\.Forms\.(\w+)\(\)\);$", st, re.S)
if m:
cols.append({"type": m.group(2), "props": []})
continue
m = re.match(r"this\.(" + NAME + r")\.Columns\[(\d+)\]\.([\w.]+) = (.*);$", st, re.S)
if m:
idx = int(m.group(2))
while len(cols) <= idx:
cols.append({"type": "DataGridViewTextBoxColumn", "props": []})
cols[idx]["props"].append((m.group(3), m.group(4)))
continue
rest.append(st)
return rest, cols
COL_DROP_VALUE = {
"Visible": "true",
"Frozen": "false",
"AutoSizeMode": "System.Windows.Forms.DataGridViewAutoSizeColumnMode.NotSet",
"Width": "100",
"Resizable": "System.Windows.Forms.DataGridViewTriState.True",
}
def column_lines(col):
out = []
for prop, val in col["props"]:
if prop in COL_DROP_VALUE and val == COL_DROP_VALUE[prop]:
continue
if prop == "Name" and val == '""':
continue
out.append((prop, val))
return out
# ---------------------------------------------------------------- 子树工具
def build_children(edges):
ch = {}
for parent, kids in edges:
ch.setdefault(parent, []).extend(kids)
return ch
def subtree(root, ch):
out = []
stack = [root]
while stack:
n = stack.pop(0)
out.append(n)
stack = ch.get(n, []) + ch.get(n + ".Panel1", []) + ch.get(n + ".Panel2", []) + stack
return out
# ---------------------------------------------------------------- 通用块生成
def plan_columns(ordered, ctrl_blocks):
"""预规划列字段:返回 {grid: [(fname, col)]},字段按 ordered 顺序编号"""
plan = {}
n = 0
for g in ordered:
_rest, cols = extract_columns(ctrl_blocks.get(g, []))
if cols:
flist = []
for col in cols:
n += 1
flist.append(("dataGridViewTextBoxColumn%d" % n, col))
plan[g] = flist
return plan
def emit_control_blocks(ordered, decl_types, ctrl_blocks, ts_edges, col_plan, a):
"""生成属性块"""
for n in ordered:
stype = short_type(decl_types[n])
stmts = ctrl_blocks.get(n, [])
rest, cols = extract_columns(stmts)
# 工具栏项
ts_items = None
for parent, kk in ts_edges:
if parent == n:
ts_items = kk
if not rest and not cols and ts_items is None:
continue
if n in col_plan:
for fname, col in col_plan[n]:
a("\t\t\t// ")
a("\t\t\t// %s" % fname)
a("\t\t\t// ")
for prop, val in column_lines(col):
a("\t\t\tthis.%s.%s = %s;" % (fname, prop, val))
a("\t\t\t// ")
a("\t\t\t// %s" % n)
a("\t\t\t// ")
for st in rest:
if should_drop(st, stype):
continue
a("\t\t\t" + st.replace("\n", "\n\t\t\t"))
if cols:
inner = ",\n\t\t\t\t".join("this.%s" % fname for fname, _c in col_plan[n])
a("\t\t\tthis.%s.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {" % n)
a("\t\t\t\t" + inner + "});")
if ts_items is not None:
inner = ",\n\t\t\t\t".join("this.%s" % k for k in ts_items)
a("\t\t\tthis.%s.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {" % n)
a("\t\t\t\t" + inner + "});")
TEMPLATE = """namespace 成套报价软件
{{
partial class {cls}
{{
///
/// Designer variable used to keep track of non-visual components.
///
private System.ComponentModel.IContainer components = null;
{fields}
///
/// Disposes resources used by the form.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{{
if (disposing && (components != null)) {{
components.Dispose();
}}
base.Dispose(disposing);
}}
#region Designer generated code
///
/// This method is required for Windows Forms designer support.
/// Do not change the method contents inside the source code editor. The Forms designer might
/// not be able to load this method if it was changed manually.
///
private void InitializeComponent()
{{
{body}
}}
#endregion
}}
}}
"""
def emit_decls(ordered, decl_types, begin_inits, a):
for n in ordered:
a("\t\t\tthis.%s = new %s();" % (n, decl_types[n]))
if n in begin_inits:
a("\t\t\t((System.ComponentModel.ISupportInitialize)(this.%s)).BeginInit();" % n)
def emit_hierarchy(ordered_set, edges, ch, a, root=None):
"""输出容器层级;root 的孩子挂 this"""
for parent, kids in edges:
if parent == "":
continue
if parent == root:
target = "this"
else:
base = parent.split(".")[0]
if base not in ordered_set:
continue
target = "this." + parent
if not kids:
continue
inner = ",\n\t\t\t\t".join("this.%s" % k for k in kids)
a("\t\t\t%s.Controls.AddRange(new System.Windows.Forms.Control[] {" % target)
a("\t\t\t\t" + inner + "});")
def gen_dockwindow(cls, tab, title, decls, decl_types, begin_inits, ctrl_blocks, ch, edges, ts_edges, splitter_map):
members = subtree(tab, ch)
members.remove(tab)
members_set = set(members)
ordered = [n for n, _t in decls if n in members_set]
# 工具栏项不在 Controls 层级里,补进来
for parent, kids in ts_edges:
if parent in members_set:
for k in kids:
if k not in ordered:
ordered.append(k)
tab_size = (800, 600)
for st in ctrl_blocks.get(tab, []):
m = re.match(r"this\.(" + NAME + r")\.Size = new System\.Drawing\.Size\((\d+), (\d+)\);$", st)
if m:
tab_size = (int(m.group(2)), int(m.group(3)))
L = []
a = L.append
a("\t\t\tthis.components = new System.ComponentModel.Container();")
emit_decls(ordered, decl_types, begin_inits, a)
col_plan = plan_columns(ordered, ctrl_blocks)
for flist in col_plan.values():
for fname, _c in flist:
a("\t\t\tthis.%s = new System.Windows.Forms.DataGridViewTextBoxColumn();" % fname)
a("\t\t\tthis.SuspendLayout();")
emit_control_blocks(ordered, decl_types, ctrl_blocks, ts_edges, col_plan, a)
# 层级
emit_hierarchy(members_set, edges, ch, a, root=tab)
a("\t\t\t// ")
a("\t\t\t// %s" % cls)
a("\t\t\t// ")
a("\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);")
a("\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;")
a("\t\t\tthis.ClientSize = new System.Drawing.Size(%d, %d);" % tab_size)
a("\t\t\tthis.Name = \"%s\";" % cls)
a("\t\t\tthis.Text = \"%s\";" % title)
for n in ordered:
if n in begin_inits:
a("\t\t\t((System.ComponentModel.ISupportInitialize)(this.%s)).EndInit();" % n)
a("\t\t\tthis.ResumeLayout(false);")
a("\t\t\tthis.PerformLayout();")
for n in ordered:
if n in splitter_map:
a("\t\t\tthis.%s.SplitterDistance = %d;" % (n, splitter_map[n]))
fields = ["\t\tprivate %s %s;" % (decl_types[n], n) for n in ordered]
for flist in col_plan.values():
for fname, _c in flist:
fields.append("\t\tprivate System.Windows.Forms.DataGridViewTextBoxColumn %s;" % fname)
return TEMPLATE.format(cls=cls, body="\n".join(L), fields="\n".join(fields))
# ---------------------------------------------------------------- MainForm
def gen_mainform(decls, decl_types, begin_inits, ctrl_blocks, ch, edges, ts_edges, splitter_map):
# MainForm 使用的旧控件:tabControl1 三页签的子树 + statusStrip1
main_roots = ["tabPage1", "tabPage2", "tabPage8"]
members = set()
for r in main_roots:
members.update(subtree(r, ch))
members.remove("tabPage1"); members.remove("tabPage2"); members.remove("tabPage8")
members.add("statusStrip1")
ordered = [n for n, _t in decls if n in members]
for parent, kids in ts_edges:
if parent in members:
for k in kids:
if k not in ordered:
ordered.append(k)
L = []
a = L.append
for i in range(1, 10):
a("\t\t\tSmart.CustomComponents.DockWindows.DockWindowItem dockWindowItem%d = new Smart.CustomComponents.DockWindows.DockWindowItem();" % i)
a("\t\t\tthis.tabControl1 = new System.Windows.Forms.TabControl();")
a("\t\t\tthis.tabPage1 = new System.Windows.Forms.TabPage();")
a("\t\t\tthis.tabPage2 = new System.Windows.Forms.TabPage();")
a("\t\t\tthis.tabPage3 = new System.Windows.Forms.TabPage();")
for n in ordered:
a("\t\t\tthis.%s = new %s();" % (n, decl_types[n]))
a("\t\t\tthis.dockSurface1 = new Smart.CustomComponents.DockSurface();")
col_plan = plan_columns(ordered, ctrl_blocks)
for flist in col_plan.values():
for fname, _c in flist:
a("\t\t\tthis.%s = new System.Windows.Forms.DataGridViewTextBoxColumn();" % fname)
a("\t\t\tthis.tabControl1.SuspendLayout();")
a("\t\t\tthis.SuspendLayout();")
emit_control_blocks(ordered, decl_types, ctrl_blocks, ts_edges, col_plan, a)
# tabControl1 属性(旧值 + 新尺寸)
a("\t\t\t// ")
a("\t\t\t// tabControl1")
a("\t\t\t// ")
tc_props = []
for st in ctrl_blocks.get("tabControl1", []):
if should_drop(st, "TabControl"):
continue
if re.search(r"\.(Size|Location|Name|TabIndex|Dock) = ", st):
continue
tc_props.append(st)
for st in tc_props:
a("\t\t\t" + st)
a("\t\t\tthis.tabControl1.Dock = System.Windows.Forms.DockStyle.Top;")
a("\t\t\tthis.tabControl1.Location = new System.Drawing.Point(0, 0);")
a("\t\t\tthis.tabControl1.Name = \"tabControl1\";")
a("\t\t\tthis.tabControl1.SelectedIndex = 0;")
a("\t\t\tthis.tabControl1.Size = new System.Drawing.Size(1884, 111);")
a("\t\t\tthis.tabControl1.TabIndex = 0;")
# 三个页签
for old, new, text in [("tabPage1", "tabPage1", "项目"), ("tabPage2", "tabPage2", "报价"), ("tabPage8", "tabPage3", "设置")]:
a("\t\t\t// ")
a("\t\t\t// %s" % new)
a("\t\t\t// ")
kids = ch.get(old, [])
if kids:
inner = ",\n\t\t\t\t".join("this.%s" % k for k in kids)
a("\t\t\tthis.%s.Controls.AddRange(new System.Windows.Forms.Control[] {" % new)
a("\t\t\t\t" + inner + "});")
for st in ctrl_blocks.get(old, []):
if should_drop(st, "TabPage"):
continue
if re.search(r"\.(Size|Location|Name|TabIndex|Padding|Text|BackColor) = ", st):
continue
a("\t\t\t" + re.sub(r"^this\.%s\b" % old, "this.%s" % new, st))
a("\t\t\tthis.%s.Location = new System.Drawing.Point(4, 22);" % new)
a("\t\t\tthis.%s.Name = \"%s\";" % (new, new))
a("\t\t\tthis.%s.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);" % new)
a("\t\t\tthis.%s.Size = new System.Drawing.Size(1876, 82);" % new)
a("\t\t\tthis.%s.TabIndex = %d;" % (new, ["tabPage1", "tabPage2", "tabPage3"].index(new)))
a("\t\t\tthis.%s.Text = \"%s\";" % (new, text))
a("\t\t\tthis.%s.UseVisualStyleBackColor = true;" % new)
# statusStrip1
a("\t\t\t// ")
a("\t\t\t// statusStrip1")
a("\t\t\t// ")
for st in ctrl_blocks.get("statusStrip1", []):
if should_drop(st, "StatusStrip"):
continue
if re.search(r"\.(Location|Size|Name|TabIndex) = ", st):
continue
a("\t\t\t" + st)
a("\t\t\tthis.statusStrip1.Dock = System.Windows.Forms.DockStyle.Bottom;")
a("\t\t\tthis.statusStrip1.Location = new System.Drawing.Point(0, 932);")
a("\t\t\tthis.statusStrip1.Name = \"statusStrip1\";")
a("\t\t\tthis.statusStrip1.Size = new System.Drawing.Size(1884, 22);")
a("\t\t\tthis.statusStrip1.TabIndex = 2;")
# dockSurface1(保持现有内容)
a("\t\t\t// ")
a("\t\t\t// dockSurface1")
a("\t\t\t// ")
a("\t\t\tthis.dockSurface1.Dock = System.Windows.Forms.DockStyle.Fill;")
a("\t\t\tthis.dockSurface1.DockBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(238)))), ((int)(((byte)(238)))), ((int)(((byte)(242)))));")
a("\t\t\tdockWindowItem1.DockState = WeifenLuo.WinFormsUI.Docking.DockState.Document;")
a("\t\t\tdockWindowItem1.Title = \"项目\";")
a("\t\t\tdockWindowItem2.ClassName = \"DockWindow2\";")
a("\t\t\tdockWindowItem2.DockState = WeifenLuo.WinFormsUI.Docking.DockState.Document;")
a("\t\t\tdockWindowItem2.Title = \"报价\";")
a("\t\t\tdockWindowItem3.ClassName = \"DockWindow3\";")
a("\t\t\tdockWindowItem3.DockState = WeifenLuo.WinFormsUI.Docking.DockState.Document;")
a("\t\t\tdockWindowItem3.Title = \"选型\";")
a("\t\t\tdockWindowItem4.ClassName = \"DockWindow4\";")
a("\t\t\tdockWindowItem4.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockRight;")
a("\t\t\tdockWindowItem4.Title = \"元件库\";")
a("\t\t\tdockWindowItem5.ClassName = \"DockWindow5\";")
a("\t\t\tdockWindowItem5.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockRight;")
a("\t\t\tdockWindowItem5.Title = \"用户库\";")
a("\t\t\tdockWindowItem6.ClassName = \"DockWindow6\";")
a("\t\t\tdockWindowItem6.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockRight;")
a("\t\t\tdockWindowItem6.Title = \"柜体库\";")
a("\t\t\tdockWindowItem7.ClassName = \"DockWindow7\";")
a("\t\t\tdockWindowItem7.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockRight;")
a("\t\t\tdockWindowItem7.Title = \"母排\";")
a("\t\t\tdockWindowItem8.ClassName = \"DockWindow8\";")
a("\t\t\tdockWindowItem8.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockRight;")
a("\t\t\tdockWindowItem8.Title = \"方案\";")
a("\t\t\tdockWindowItem9.ClassName = \"DockWindow9\";")
a("\t\t\tdockWindowItem9.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockRight;")
a("\t\t\tdockWindowItem9.Title = \"箱体计算\";")
for i in range(1, 10):
a("\t\t\tthis.dockSurface1.DockWindows.Add(dockWindowItem%d);" % i)
a("\t\t\tthis.dockSurface1.Location = new System.Drawing.Point(0, 111);")
a("\t\t\tthis.dockSurface1.Name = \"dockSurface1\";")
a("\t\t\tthis.dockSurface1.Padding = new System.Windows.Forms.Padding(6);")
a("\t\t\tthis.dockSurface1.ShowAutoHideContentOnHover = false;")
a("\t\t\tthis.dockSurface1.Size = new System.Drawing.Size(1884, 821);")
a("\t\t\tthis.dockSurface1.TabIndex = 1;")
# 窗体
a("\t\t\t// ")
a("\t\t\t// MainForm")
a("\t\t\t// ")
a("\t\t\tthis.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);")
a("\t\t\tthis.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;")
a("\t\t\tthis.ClientSize = new System.Drawing.Size(1884, 954);")
a("\t\t\tthis.Controls.Add(this.dockSurface1);")
a("\t\t\tthis.Controls.Add(this.statusStrip1);")
a("\t\t\tthis.Controls.Add(this.tabControl1);")
a("\t\t\tthis.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);")
a("\t\t\tthis.Name = \"MainForm\";")
a("\t\t\tthis.Text = \"成套报价软件\";")
a("\t\t\tthis.tabControl1.ResumeLayout(false);")
a("\t\t\tthis.ResumeLayout(false);")
a("\t\t\tthis.PerformLayout();")
fields = []
fields.append("\t\tprivate System.Windows.Forms.TabControl tabControl1;")
fields.append("\t\tprivate System.Windows.Forms.TabPage tabPage1;")
fields.append("\t\tprivate System.Windows.Forms.TabPage tabPage2;")
fields.append("\t\tprivate System.Windows.Forms.TabPage tabPage3;")
for n in ordered:
fields.append("\t\tprivate %s %s;" % (decl_types[n], n))
fields.append("\t\tprivate Smart.CustomComponents.DockSurface dockSurface1;")
for flist in col_plan.values():
for fname, _c in flist:
fields.append("\t\tprivate System.Windows.Forms.DataGridViewTextBoxColumn %s;" % fname)
header = """/*
* 由SharpDevelop创建。
* 用户: 099978
* 日期: 2026-08-25
* 时间: 20:59
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
namespace 成套报价软件
{
partial class MainForm
{
///
/// Designer variable used to keep track of non-visual components.
///
private System.ComponentModel.IContainer components = null;
%s
///
/// Disposes resources used by the form.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
///
/// This method is required for Windows Forms designer support.
/// Do not change the method contents inside the source code editor. The Forms designer might
/// not be able to load this method if it was changed manually.
///
private void InitializeComponent()
{
%s
}
}
}
""" % ("\n".join(fields), "\n".join(L))
return header
# ---------------------------------------------------------------- main
def main():
text = io.open(SRC, encoding="utf-8-sig").read()
decls, begin_inits, blocks, top_statements, edges, ts_edges = parse(text)
ctrl_blocks, form_block = classify(blocks)
ch = build_children(edges)
decl_types = dict(decls)
splitter_map = {}
for st in form_block + top_statements:
m = re.match(r"this\.(" + NAME + r")\.SplitterDistance = (\d+);$", st)
if m:
splitter_map[m.group(1)] = int(m.group(2))
missing = [t for _c, t, _ti in DOCK_MAP if t not in decl_types]
if missing:
print("缺少页签:", missing)
sys.exit(1)
for cls, tab, title in DOCK_MAP:
out = gen_dockwindow(cls, tab, title, decls, decl_types, begin_inits, ctrl_blocks, ch, edges, ts_edges, splitter_map)
path = os.path.join(DST_PROJECT, "DockWindows", cls, cls + ".Designer.cs")
io.open(path, "w", encoding="utf-8-sig", newline="\r\n").write(out)
n_ctrl = len(subtree(tab, ch)) - 1
print("生成 %-60s ← %-9s (%s) 控件%d个" % (path, tab, title, n_ctrl))
mf = gen_mainform(decls, decl_types, begin_inits, ctrl_blocks, ch, edges, ts_edges, splitter_map)
path = os.path.join(DST_PROJECT, "MainForm.Designer.cs")
io.open(path, "w", encoding="utf-8-sig", newline="\r\n").write(mf)
print("生成", path)
# 覆盖检查
covered = set()
for _c, tab, _t in DOCK_MAP:
covered.update(subtree(tab, ch))
main_used = set(["tabControl1", "tabControl2", "tabControl3", "splitContainer1", "statusStrip1"])
for r in ["tabControl1", "statusStrip1"]:
main_used.update(subtree(r, ch))
leftover = [n for n, _ in decls if n not in covered and n not in main_used]
print("未覆盖控件:", leftover)
# 边完整性检查
all_kids = [k for _p, kk in edges for k in kk]
no_parent = [k for k in all_kids if k not in decl_types]
print("边中未声明的子控件:", no_parent)
if __name__ == "__main__":
main()