static void AddMenuItem(List <ToolStripItem> menu_root, Type type, String name_override, Type as_type, EventHandler click_handler) { ToolStripMenuItem item_root = null; String name = (name_override == null)?type.FullName:name_override; XString names = new XString(name); XStringSeg seg; int skip = (name_override == null) ? 1 : 0; for (seg = names.firstseg; seg != null; seg = seg.Next) { if ((String)seg == "+") { XStringSeg begin = seg.Prior.Prior; XStringSeg end = seg.Next.Next; XStringSeg newseg = new XStringSeg(seg.Prior + "." + seg.Next); begin.Next = newseg; newseg.Prior = begin; if (end != null) { end.Prior = newseg; newseg.Next = end; } seg.Prior.Next = null; seg.Next.Prior = null; seg.Prior.Prior = null; seg.Next.Next = null; seg = newseg; } if ((String)seg == ".") { continue; } if (seg.Next != null) { while (seg.Next != null && ((String)seg.Next != "." && (String)seg.Next != "+")) { XStringSeg begin = seg.Prior; XStringSeg end = seg.Next.Next; XStringSeg newseg = new XStringSeg(seg + " ".Substring(0, seg.Next.spaces) + seg.Next); if (begin != null) { begin.Next = newseg; } else { names.firstseg = newseg; } newseg.Prior = begin; if (end != null) { end.Prior = newseg; newseg.Next = end; } if (seg.Prior != null) { seg.Prior.Next = null; seg.Prior.Prior = null; } seg.Next.Prior = null; seg.Next.Next = null; seg = newseg; } } } for (seg = names.firstseg; seg != null; seg = seg.Next) { if ((String)seg == ".") { } else { if (skip > 0) { skip--; continue; } if (item_root == null) { bool found = false; foreach (ToolStripItem item in menu_root) { if (item.Text == (String)seg) { found = true; item_root = item as ToolStripMenuItem; break; } } if (!found) { if (seg.Next == null) { TypeMenuItem new_item; menu_root.Add(new_item = new TypeMenuItem(type, as_type)); new_item.Text = (String)seg; new_item.Click += click_handler; } else { menu_root.Add(item_root = new ToolStripMenuItem((String)seg)); item_root.DropDown = new ToolStripDropDown(); } } } else { bool found = false; foreach (ToolStripItem item in item_root.DropDown.Items) { if (item.Text == (String)seg) { found = true; item_root = item as ToolStripMenuItem; break; } } if (!found) { if (seg.Next != null) { item_root.DropDown.Items.Add(item_root = new ToolStripMenuItem((String)seg)); item_root.DropDown = new ToolStripDropDown(); } else { TypeMenuItem new_item; InsertMenuItem(item_root.DropDown, new_item = new TypeMenuItem(type, as_type)); new_item.Text = (String)seg; new_item.Click += click_handler; } } } } } //TypeMenuItem new_item = new TypeMenuItem( type, typeof( IReflectorButton ) ); }
void ParseCMake(XString xs) { bool line_start = true; int skip_count = 0; foreach (XStringSeg seg in xs) { if (skip_count > 0) { skip_count--; continue; } if (((String)seg).Length == 0) { // end of line line_start = true; } if (line_start) { if (String.Compare((String)seg, "CMAKE_MINIMUM_REQUIRED", true) == 0) { } else if (String.Compare((String)seg, "PROJECT", true) == 0) { } else if (String.Compare((String)seg, "SET", true) == 0) { } else if (String.Compare((String)seg, "ADD_EXECTUABLE", true) == 0) { } else if (String.Compare((String)seg, "ADD_LIBRARY", true) == 0) { } } if (String.Compare((String)seg, "$") == 0) { StringBuilder var = new StringBuilder(); XStringSeg tmp = seg; // consume the next couple segments... if (String.Compare((String)seg.Next, "{") == 0) { skip_count = 1; tmp = seg.Next.Next; while (String.Compare((String)tmp, "}") != 0) { tmp.Expand(var); tmp = tmp.Next; skip_count++; } skip_count++; } } line_start = false; } }