Ejemplo n.º 1
0
        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();
                }
            }
        }
Ejemplo n.º 2
0
        // 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);
        }
Ejemplo n.º 3
0
        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 ) );
        }
Ejemplo n.º 4
0
        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);
        }