static void GenerateWidgetCode(SteticCompilationUnit globalUnit, CodeNamespace globalNs, GenerationOptions options, List <SteticCompilationUnit> units, Gtk.Widget w, ArrayList warnings)
        {
            // Generate the build method

            CodeTypeDeclaration type = CreatePartialClass(globalUnit, units, options, w.Name);
            CodeMemberMethod    met  = new CodeMemberMethod();

            met.Name = "Build";
            type.Members.Add(met);
            met.ReturnType = new CodeTypeReference(typeof(void));
            met.Attributes = MemberAttributes.Family;

            Stetic.Wrapper.Widget wwidget = Stetic.Wrapper.Widget.Lookup(w);

            if (options.GenerateEmptyBuildMethod)
            {
                GenerateWrapperFields(type, wwidget);
                return;
            }

            met.Statements.Add(
                new CodeMethodInvokeExpression(
                    new CodeTypeReferenceExpression(new CodeTypeReference(globalNs.Name + ".Gui", CodeTypeReferenceOptions.GlobalReference)),
                    "Initialize",
                    new CodeThisReferenceExpression()
                    )
                );

            if (wwidget.GeneratePublic)
            {
                type.TypeAttributes = TypeAttributes.Public;
            }
            else
            {
                type.TypeAttributes = TypeAttributes.NotPublic;
            }

            if (!String.IsNullOrEmpty(wwidget.UIManagerName))
            {
                type.Members.Add(new CodeMemberField(new CodeTypeReference("Gtk.UIManager", CodeTypeReferenceOptions.GlobalReference), wwidget.UIManagerName));
            }

            Stetic.WidgetMap map = Stetic.CodeGenerator.GenerateCreationCode(globalNs, type, w, new CodeThisReferenceExpression(), met.Statements, options, warnings);
            CodeGenerator.BindSignalHandlers(new CodeThisReferenceExpression(), wwidget, map, met.Statements, options);
        }
        static void GenerateGlobalActionGroupCode(SteticCompilationUnit globalUnit, CodeNamespace globalNs, GenerationOptions options, List <SteticCompilationUnit> units, Wrapper.ActionGroup agroup, ArrayList warnings)
        {
            CodeTypeDeclaration type = CreatePartialClass(globalUnit, units, options, agroup.Name);

            // Generate the build method

            CodeMemberMethod met = new CodeMemberMethod();

            met.Name = "Build";
            type.Members.Add(met);
            met.ReturnType = new CodeTypeReference(typeof(void));
            met.Attributes = MemberAttributes.Public;

            Stetic.WidgetMap map = Stetic.CodeGenerator.GenerateCreationCode(globalNs, type, agroup, new CodeThisReferenceExpression(), met.Statements, options, warnings);

            foreach (Wrapper.Action ac in agroup.Actions)
            {
                CodeGenerator.BindSignalHandlers(new CodeThisReferenceExpression(), ac, map, met.Statements, options);
            }
        }
Esempio n. 3
0
        internal static void BindSignalHandlers(CodeExpression targetObjectVar, ObjectWrapper wrapper, Stetic.WidgetMap map, CodeStatementCollection statements, GenerationOptions options)
        {
            foreach (Signal signal in wrapper.Signals)
            {
                SignalDescriptor descriptor = signal.SignalDescriptor;

                CodeExpression createDelegate = new CodeDelegateCreateExpression(
                    new CodeTypeReference(descriptor.HandlerTypeName, CodeTypeReferenceOptions.GlobalReference),
                    new CodeThisReferenceExpression(),
                    signal.Handler);

                CodeAttachEventStatement cevent = new CodeAttachEventStatement(
                    new CodeEventReferenceExpression(
                        map.GetWidgetExp(wrapper),
                        descriptor.Name),
                    createDelegate);

                statements.Add(cevent);
            }

            Wrapper.Widget widget = wrapper as Wrapper.Widget;
            if (widget != null && widget.IsTopLevel)
            {
                // Bind local action signals
                foreach (Wrapper.ActionGroup grp in widget.LocalActionGroups)
                {
                    foreach (Wrapper.Action ac in grp.Actions)
                    {
                        BindSignalHandlers(targetObjectVar, ac, map, statements, options);
                    }
                }
            }

            Gtk.Container cont = wrapper.Wrapped as Gtk.Container;
            if (cont != null)
            {
                foreach (Gtk.Widget child in cont.AllChildren)
                {
                    Stetic.Wrapper.Widget ww = Stetic.Wrapper.Widget.Lookup(child);
                    if (ww != null)
                    {
                        BindSignalHandlers(targetObjectVar, ww, map, statements, options);
                    }
                }
            }
        }
        static void GenerateWidgetCode(SteticCompilationUnit globalUnit, CodeNamespace globalNs, GenerationOptions options, List <SteticCompilationUnit> units, Gtk.Widget w, ArrayList warnings, bool regenerateWidgetClass)
        {
            if (options.GenerateSingleFile)
            {
                regenerateWidgetClass = true;
            }

            // Don't register this unit if the class doesn't need to be regenerated
            if (!regenerateWidgetClass)
            {
                units = null;
            }

            CodeTypeDeclaration type = CreatePartialClass(globalUnit, units, options, w.Name);

            // Generate the build method
            CodeMemberMethod met = new CodeMemberMethod();

            met.Name = "Build";
            type.Members.Add(met);
            met.ReturnType = new CodeTypeReference(typeof(void));
            met.Attributes = MemberAttributes.Family;

            Stetic.Wrapper.Widget wwidget = Stetic.Wrapper.Widget.Lookup(w);

            if (regenerateWidgetClass)
            {
                if (options.GenerateEmptyBuildMethod)
                {
                    GenerateWrapperFields(type, wwidget);
                    return;
                }

                met.Statements.Add(
                    new CodeMethodInvokeExpression(
                        new CodeTypeReferenceExpression(new CodeTypeReference(globalNs.Name + ".Gui", CodeTypeReferenceOptions.GlobalReference)),
                        "Initialize",
                        new CodeThisReferenceExpression()
                        )
                    );

                if (wwidget.GeneratePublic)
                {
                    type.TypeAttributes = TypeAttributes.Public;
                }
                else
                {
                    type.TypeAttributes = TypeAttributes.NotPublic;
                }

                if (!String.IsNullOrEmpty(wwidget.UIManagerName))
                {
                    type.Members.Add(new CodeMemberField(new CodeTypeReference("Gtk.UIManager", CodeTypeReferenceOptions.GlobalReference), wwidget.UIManagerName));
                }
            }

            // We need to generate the creation code even if regenerateWidgetClass is false because GenerateCreationCode
            // may inject support classes or methods into the global namespace, which is always generated

            Stetic.WidgetMap map = Stetic.CodeGenerator.GenerateCreationCode(globalNs, type, w, new CodeThisReferenceExpression(), met.Statements, options, warnings);

            if (regenerateWidgetClass)
            {
                CodeGenerator.BindSignalHandlers(new CodeThisReferenceExpression(), wwidget, map, met.Statements, options);
            }
        }
Esempio n. 5
0
        internal static void BindSignalHandlers(CodeExpression targetObjectVar, ObjectWrapper wrapper, Stetic.WidgetMap map, CodeStatementCollection statements, GenerationOptions options)
        {
            foreach (Signal signal in wrapper.Signals)
            {
                SignalDescriptor descriptor = signal.SignalDescriptor;

                CodeExpression createDelegate;

                if (options.UsePartialClasses)
                {
                    var rgx = new Regex(@"`\d+");
                    createDelegate =
                        new CodeDelegateCreateExpression(
                            new CodeTypeReference(rgx.Replace(descriptor.HandlerTypeName, ""), CodeTypeReferenceOptions.GlobalReference),
                            new CodeThisReferenceExpression(),
                            signal.Handler);
                }
                else
                {
                    createDelegate =
                        new CodeMethodInvokeExpression(
                            new CodeTypeReferenceExpression(new CodeTypeReference(typeof(Delegate), CodeTypeReferenceOptions.GlobalReference)),
                            "CreateDelegate",
                            new CodeTypeOfExpression(descriptor.HandlerTypeName),
                            targetObjectVar,
                            new CodePrimitiveExpression(signal.Handler));

                    createDelegate = new CodeCastExpression(descriptor.HandlerTypeName.ToGlobalTypeRef(), createDelegate);
                }

                CodeAttachEventStatement cevent = new CodeAttachEventStatement(
                    new CodeEventReferenceExpression(
                        map.GetWidgetExp(wrapper),
                        descriptor.Name),
                    createDelegate);

                statements.Add(cevent);
            }

            Wrapper.Widget widget = wrapper as Wrapper.Widget;
            if (widget != null && widget.IsTopLevel)
            {
                // Bind local action signals
                foreach (Wrapper.ActionGroup grp in widget.LocalActionGroups)
                {
                    foreach (Wrapper.Action ac in grp.Actions)
                    {
                        BindSignalHandlers(targetObjectVar, ac, map, statements, options);
                    }
                }
            }

            Gtk.Container cont = wrapper.Wrapped as Gtk.Container;
            if (cont != null)
            {
                foreach (Gtk.Widget child in cont.AllChildren)
                {
                    Stetic.Wrapper.Widget ww = Stetic.Wrapper.Widget.Lookup(child);
                    if (ww != null)
                    {
                        BindSignalHandlers(targetObjectVar, ww, map, statements, options);
                    }
                }
            }
        }