3
using System.Reflection;
5
namespace Stetic.Wrapper
7
public class Bin: Container
9
public static new Gtk.Bin CreateInstance (ClassDescriptor klass)
11
if (klass.Name == "Gtk.Bin")
12
return new CustomWidget ();
17
internal protected override void GenerateBuildCode (GeneratorContext ctx, CodeExpression var)
19
if (ClassDescriptor.WrappedTypeName == "Gtk.Bin") {
21
// Gtk.Bin needs a helper class which handles child allocation.
22
// This class needs to be generated since Stetic won't be linked with
26
foreach (CodeTypeDeclaration dec in ctx.GlobalCodeNamespace.Types) {
27
if (dec.Name == "BinContainer") {
34
GenerateHelperClass (ctx);
36
CodeMethodInvokeExpression attachExp = new CodeMethodInvokeExpression (
37
new CodeTypeReferenceExpression (ctx.GlobalCodeNamespace.Name + ".BinContainer"),
42
// If the Bin has its own action groups, we need to register
43
// the resulting UIManager in the BinContainer, but it needs to be done
44
// after generating it. Right now, we only keep a reference to
47
string binContainerVar = null;
49
if (IsTopLevel && LocalActionGroups.Count > 0) {
50
binContainerVar = ctx.NewId ();
52
new CodeVariableDeclarationStatement (
53
ctx.GlobalCodeNamespace.Name + ".BinContainer",
59
ctx.Statements.Add (attachExp);
62
base.GenerateBuildCode (ctx, var);
64
// Register the UIManager, if the Bin has one
66
if (binContainerVar != null && UIManagerName != null) {
68
new CodeMethodInvokeExpression (
69
new CodeVariableReferenceExpression (binContainerVar),
71
new CodeVariableReferenceExpression (UIManagerName)
77
base.GenerateBuildCode (ctx, var);
80
void GenerateHelperClass (GeneratorContext ctx)
82
CodeTypeDeclaration type = new CodeTypeDeclaration ("BinContainer");
83
type.Attributes = MemberAttributes.Private;
84
type.TypeAttributes = TypeAttributes.NestedAssembly;
85
ctx.GlobalCodeNamespace.Types.Add (type);
87
CodeMemberField field = new CodeMemberField ("Gtk.Widget", "child");
88
field.Attributes = MemberAttributes.Private;
89
type.Members.Add (field);
91
field = new CodeMemberField ("Gtk.UIManager", "uimanager");
92
field.Attributes = MemberAttributes.Private;
93
type.Members.Add (field);
95
CodeExpression child = new CodeFieldReferenceExpression (
96
new CodeThisReferenceExpression (),
100
CodeExpression uimanager = new CodeFieldReferenceExpression (
101
new CodeThisReferenceExpression (),
107
CodeMemberMethod met = new CodeMemberMethod ();
108
type.Members.Add (met);
110
met.Attributes = MemberAttributes.Public | MemberAttributes.Static;
111
met.ReturnType = new CodeTypeReference ("BinContainer");
112
met.Parameters.Add (new CodeParameterDeclarationExpression ("Gtk.Bin", "bin"));
114
CodeVariableDeclarationStatement bcDec = new CodeVariableDeclarationStatement ("BinContainer", "bc");
115
bcDec.InitExpression = new CodeObjectCreateExpression ("BinContainer");
116
met.Statements.Add (bcDec);
117
CodeVariableReferenceExpression bc = new CodeVariableReferenceExpression ("bc");
118
CodeArgumentReferenceExpression bin = new CodeArgumentReferenceExpression ("bin");
121
new CodeAttachEventStatement (
124
new CodeDelegateCreateExpression (
125
new CodeTypeReference ("Gtk.SizeRequestedHandler"), bc, "OnSizeRequested"
131
new CodeAttachEventStatement (
134
new CodeDelegateCreateExpression (
135
new CodeTypeReference ("Gtk.SizeAllocatedHandler"), bc, "OnSizeAllocated"
141
new CodeAttachEventStatement (
144
new CodeDelegateCreateExpression (
145
new CodeTypeReference ("Gtk.AddedHandler"), bc, "OnAdded"
149
met.Statements.Add (new CodeMethodReturnStatement (bc));
151
// OnSizeRequested override
153
met = new CodeMemberMethod ();
154
type.Members.Add (met);
155
met.Name = "OnSizeRequested";
156
met.ReturnType = new CodeTypeReference (typeof(void));
157
met.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "sender"));
158
met.Parameters.Add (new CodeParameterDeclarationExpression ("Gtk.SizeRequestedArgs", "args"));
160
CodeConditionStatement cond = new CodeConditionStatement ();
161
cond.Condition = new CodeBinaryOperatorExpression (
163
CodeBinaryOperatorType.IdentityInequality,
164
new CodePrimitiveExpression (null)
166
cond.TrueStatements.Add (
167
new CodeAssignStatement (
168
new CodePropertyReferenceExpression (
169
new CodeArgumentReferenceExpression ("args"),
172
new CodeMethodInvokeExpression (
178
met.Statements.Add (cond);
180
// OnSizeAllocated method
182
met = new CodeMemberMethod ();
183
type.Members.Add (met);
184
met.Name = "OnSizeAllocated";
185
met.ReturnType = new CodeTypeReference (typeof(void));
186
met.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "sender"));
187
met.Parameters.Add (new CodeParameterDeclarationExpression ("Gtk.SizeAllocatedArgs", "args"));
189
cond = new CodeConditionStatement ();
190
cond.Condition = new CodeBinaryOperatorExpression (
192
CodeBinaryOperatorType.IdentityInequality,
193
new CodePrimitiveExpression (null)
195
cond.TrueStatements.Add (
196
new CodeAssignStatement (
197
new CodePropertyReferenceExpression (
201
new CodePropertyReferenceExpression (
202
new CodeArgumentReferenceExpression ("args"),
207
met.Statements.Add (cond);
211
met = new CodeMemberMethod ();
212
type.Members.Add (met);
213
met.Name = "OnAdded";
214
met.ReturnType = new CodeTypeReference (typeof(void));
215
met.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "sender"));
216
met.Parameters.Add (new CodeParameterDeclarationExpression ("Gtk.AddedArgs", "args"));
219
new CodeAssignStatement (
221
new CodePropertyReferenceExpression (
222
new CodeArgumentReferenceExpression ("args"),
228
// SetUiManager method
230
met = new CodeMemberMethod ();
231
type.Members.Add (met);
232
met.Name = "SetUiManager";
233
met.Attributes = MemberAttributes.Public | MemberAttributes.Final;
234
met.ReturnType = new CodeTypeReference (typeof(void));
235
met.Parameters.Add (new CodeParameterDeclarationExpression (typeof(Gtk.UIManager), "uim"));
238
new CodeAssignStatement (
240
new CodeArgumentReferenceExpression ("uim")
244
new CodeAttachEventStatement (
247
new CodeDelegateCreateExpression (
248
new CodeTypeReference ("System.EventHandler"), new CodeThisReferenceExpression(), "OnRealized"
255
met = new CodeMemberMethod ();
256
type.Members.Add (met);
257
met.Name = "OnRealized";
258
met.ReturnType = new CodeTypeReference (typeof(void));
259
met.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "sender"));
260
met.Parameters.Add (new CodeParameterDeclarationExpression ("System.EventArgs", "args"));
262
cond = new CodeConditionStatement ();
263
cond.Condition = new CodeBinaryOperatorExpression (
265
CodeBinaryOperatorType.IdentityInequality,
266
new CodePrimitiveExpression (null)
269
cond.TrueStatements.Add (
270
new CodeVariableDeclarationStatement (
276
CodeExpression wexp = new CodeVariableReferenceExpression ("w");
278
cond.TrueStatements.Add (
279
new CodeAssignStatement (
281
new CodePropertyReferenceExpression (
288
CodeConditionStatement cond2 = new CodeConditionStatement ();
289
cond2.Condition = new CodeBinaryOperatorExpression (
290
new CodeBinaryOperatorExpression (
292
CodeBinaryOperatorType.IdentityInequality,
293
new CodePrimitiveExpression (null)
295
CodeBinaryOperatorType.BooleanAnd,
296
new CodeMethodInvokeExpression (
297
new CodeTypeOfExpression ("Gtk.Window"),
303
cond2.TrueStatements.Add (
304
new CodeMethodInvokeExpression (
305
new CodeCastExpression ("Gtk.Window", wexp),
307
new CodePropertyReferenceExpression (
313
cond2.TrueStatements.Add (
314
new CodeAssignStatement (
316
new CodePrimitiveExpression (null)
319
cond.TrueStatements.Add (cond2);
321
met.Statements.Add (cond);
326
This is a model of what GenerateHelperClass generates:
333
public static BinContainer Attach (Gtk.Bin bin)
335
BinContainer bc = new BinContainer ();
336
bin.SizeRequested += new Gtk.SizeRequestedHandler (bc.OnSizeRequested);
337
bin.SizeAllocated += new Gtk.SizeAllocatedHandler (bc.OnSizeAllocated);
338
bin.Added += new Gtk.AddedHandler (bc.OnAdded);
342
void OnSizeRequested (object s, Gtk.SizeRequestedArgs args)
345
args.Requisition = child.SizeRequest ();
348
void OnSizeAllocated (object s, Gtk.SizeAllocatedArgs args)
351
child.Allocation = args.Allocation;
354
void OnAdded (object s, Gtk.AddedArgs args)
359
public void SetUiManager (UIManager manager)
362
child.Realized += new System.EventHandler (OnRealized);
367
if (uimanager != null) {
368
Gtk.Widget w = child.Toplevel;
369
if (w != null && w is Gtk.Window) {
370
((Gtk.Window)w).AddAccelGroup (uimanager.AccelGroup);