internal static void MenuClick(object sender, EventArgs e) { //ToolStripItemClickedEventArgs itemclick_e = e as ToolStripItemClickedEventArgs; TypeMenuItem item = sender as TypeMenuItem; if (item != null) { if (core_common.current_mouse_page != null) { current_mouse_page.MakeControl(item.Type, item.Interface , current_mouse_page.canvas.selection); current_mouse_page.canvas.flags.selecting = false; current_mouse_page.canvas.Refresh(); } } }
// plugins - these were objects that were instantiated during their load. // should probably have an unload for these also... (might just spark their startup class // which can cause persistant static classes, and destroy it after load... ) public static bool LoadAssembly(string name , out System.Windows.Forms.ToolStripMenuItem outitems , EventHandler click_handler , EventHandler persistant_plugin_handler , AssemblyTracker tracker) { Assembly a; try { a = LoadAssembly(name); if (a == null) { outitems = null; return(false); } if (tracker == null) { tracker = new AssemblyTracker(a); } else { tracker.assembly = a; } foreach (AssemblyTracker assembly in core_common.assemblies) { if (String.Compare(assembly.ToString(), tracker.ToString()) == 0) { // uhmm really trusting garbabe collector here... tracker.assembly = null; a = null; outitems = null; return(false); } } Type[] assembly_types = null; try { assembly_types = a.GetTypes(); } catch (Exception ex) { Log.log("Failed to get types from assembly. " + name + " : " + ex.Message); a = null; tracker.assembly = null; core_common.assemblies.Remove(tracker); outitems = null; return(false); } List <ToolStripItem> items = null; /* * the following 3 are actually filled with TypeMenuItem... * but for ease of use we store them as a list of their base class. */ List <ToolStripItem> button_items = new List <ToolStripItem>(); List <ToolStripItem> control_items = new List <ToolStripItem>(); List <ToolStripItem> canvas_items = new List <ToolStripItem>(); bool useful = false; // search for any objects which implement IReflectorPlugin method Preload() if (InvokePreload(tracker, assembly_types, persistant_plugin_handler)) { useful = true; } if (LoadVariables(tracker, assembly_types)) { useful = true; } if (LoadDropAcceptors(tracker, assembly_types)) { useful = true; } if (LoadSecurity(tracker, assembly_types)) { useful = true; } if (InvokeDirector(tracker, assembly_types)) { useful = true; } foreach (Type current_type in assembly_types) { // 1) a thing must have a constructor of some type // empty conctructor, takes a Canvas or a Control or a PSI_Button if ((current_type.GetConstructor(System.Type.EmptyTypes) == null) && (current_type.GetConstructor(new Type[1] { typeof(Canvas) }) == null) && (current_type.GetConstructor(new Type[1] { typeof(Control) }) == null) && (current_type.GetConstructor(new Type[1] { typeof(PSI_Button) }) == null)) { continue; } if (IsAWidget(current_type)) { useful = true; } if (IsAButton(current_type)) { //TypeMenuItem item; useful = true; core_common.buttons.Add(current_type); String name_override = null; object[] tags = current_type.GetCustomAttributes(true); bool ignore_button = false; foreach (object o in tags) { ButtonAttribute attr = o as ButtonAttribute; if (attr != null) { if (attr.hidden) { ignore_button = true; } name_override = attr.Name; break; } } if (!ignore_button) { AddMenuItem(button_items, current_type, name_override, typeof(IReflectorButton), click_handler); } } if (IsACanvas(current_type)) { TypeMenuItem item; useful = true; canvas_items.Add(item = new TypeMenuItem(current_type, typeof(IReflectorCanvas))); item.Click += click_handler; } if (IsAControl(current_type)) { String name_override = null; object[] tags = current_type.GetCustomAttributes(true); foreach (object o in tags) { ControlAttribute attr = o as ControlAttribute; if (attr != null) { name_override = attr.Name; } } if (name_override != null) { AddMenuItem(control_items, current_type, name_override, current_type, click_handler); useful = true; } else if (current_type.IsSubclassOf(typeof(XListbox))) { AddMenuItem(control_items, current_type, null, current_type, click_handler); useful = true; } else if (current_type.IsSubclassOf(typeof(XComboBox))) { AddMenuItem(control_items, current_type, null, current_type, click_handler); useful = true; } //useful = true; } if (IsCreatable(current_type)) { useful = true; String name_override = null; object[] tags = current_type.GetCustomAttributes(true); foreach (object o in tags) { ControlAttribute attr = o as ControlAttribute; if (attr != null) { name_override = attr.Name; } } AddMenuItem(control_items, current_type, name_override, typeof(IReflectorCreate), click_handler); } } foreach (IReflectorPluginModule module in core_common.plugin_module_acceptors) { if (module.AssemblyUseful(tracker.assembly)) { useful = true; } } if (useful) { core_common.assemblies.Add(tracker); ToolStripDropDown dropDown; //outitems = items.ToArray(); int subs = 0; if (button_items.Count > 0) { items = button_items; subs++; } if (control_items.Count > 0) { items = control_items; subs++; } if (canvas_items.Count > 0) { items = canvas_items; subs++; } if (subs > 1) { ToolStripMenuItem menu_item; items = new List <ToolStripItem>(); if (button_items.Count > 0) { dropDown = new ToolStripDropDown(); InsertMenuItems(dropDown, button_items); menu_item = new ToolStripMenuItem("Buttons"); //menu_item.Text = ; menu_item.DropDown = dropDown; //menu_item.DropDownDirection = ToolStripDropDownDirection.Default; //menu_item.ShowDropDownArrow = true; items.Add(menu_item); } if (control_items.Count > 0) { dropDown = new ToolStripDropDown(); InsertMenuItems(dropDown, control_items); menu_item = new ToolStripMenuItem("Controls"); // menu_item.Text = ; menu_item.DropDown = dropDown; //menu_item.DropDownDirection = ToolStripDropDownDirection.Default; //menu_item.ShowDropDownArrow = true; items.Add(menu_item); } if (canvas_items.Count > 0) { dropDown = new ToolStripDropDown(); InsertMenuItems(dropDown, canvas_items); menu_item = new ToolStripMenuItem(); menu_item.Text = "Page Layout"; menu_item.DropDown = dropDown; menu_item.DropDownDirection = ToolStripDropDownDirection.Default; //menu_item.ShowDropDownArrow = true; items.Add(menu_item); } } if (subs > 0) { dropDown = new ToolStripDropDown(); foreach (ToolStripItem tsi in items) { InsertMenuItem(dropDown, tsi); } ToolStripMenuItem itemx = new ToolStripMenuItem(); itemx.Text = osalot.StripExeFromName(a.ManifestModule.Name); itemx.DropDown = dropDown; itemx.DropDownDirection = ToolStripDropDownDirection.Default; //itemx.ShowDropDownArrow = true; outitems = itemx; // returning this one menu entry.... return(true); } outitems = null; return(useful); // just cause there's no menu options (IReflectorSecurity) doesn't mean we didn't use it... } else { // help garbage collection... tracker.assembly = null; tracker = null; a = null; } } catch (FileNotFoundException fnf) { Log.log("Could not load Assembly: \"" + name + "\" : " + fnf.Message); } catch (TypeLoadException) { Log.log("Could not load Type: \"\"\nfrom assembly: \"" + name + "\""); } outitems = null; return(false); }
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 ) ); }
static bool InvokePreload(AssemblyTracker tracker, Type[] assembly_types, EventHandler handler) { int previous_assemblies = tracker.objects.Count; int previous = core_common.persistant_plugins.Count; foreach (Type t in assembly_types) { Type[] interfaces; interfaces = t.FindInterfaces(MyInterfaceFilter, "IReflectorPlugin"); if (interfaces.Length > 0) { AssemblyObject ao; object o = Activator.CreateInstance(t); tracker.objects.Add(ao = new AssemblyObject(t, o)); try { IReflectorPlugin plugin = o as IReflectorPlugin; if (plugin != null) { plugin.Preload(); ao.plugin = true; } } catch (Exception ex) { Log.log("Invoke preload threw exception... " + t.ToString() + ":" + ex.Message); } IReflectorPersistance persis = o as IReflectorPersistance; if (persis != null) // it's a plugin, and has properties { object[] tags = t.GetCustomAttributes(true); String name = null; foreach (object tag in tags) { PluginAttribute attr = tag as PluginAttribute; if (attr != null) { name = attr.Name; } } if (name == null) { name = o.ToString(); } core_common.persistant_plugins.Add(o); TypeMenuItem tmi = new TypeMenuItem(o, name); InsertMenuItem(core_common.other_drop.DropDown, tmi); tmi.Click += handler; } IReflectorPluginModule module_acceptor = o as IReflectorPluginModule; if (module_acceptor != null) // it's a plugin, and has properties { core_common.plugin_module_acceptors.Add(module_acceptor); } } } if (core_common.persistant_plugins.Count > previous || tracker.objects.Count > previous_assemblies) { return(true); } return(false); }