1 /* MuiGenerator class body */
3 /* Code generated with ChocolateCastle 0.1 */
4 /* written by Grzegorz "Krashan" Kraszewski <krashan@teleinfo.pb.bialystok.pl> */
8 #include <proto/intuition.h>
9 #include <proto/utility.h>
10 #include <proto/muimaster.h>
11 #include <clib/alib_protos.h>
12 #include <libraries/asl.h>
13 #include <libraries/mui.h>
14 #include <libvstring.h>
17 #include "muigenerator.h"
18 #include "generator.h"
20 #include "methodlist.h"
21 #include "methodeditor.h"
27 struct MuiGeneratorData
29 Object
*SuperclassTypeRadio
;
30 Object
*SuperclassNameString
;
31 Object
*SuperclassPointerString
;
32 Object
*SuperclassPageGroup
;
43 const char* PopularMuiSuperclasses
[] =
72 const struct MethodEntry DefaultMethods
[] = {
73 { (STRPTR
)"OM_NEW", (STRPTR
)"OM_NEW", (STRPTR
)"opSet", (STRPTR
)"00000101", TRUE
},
74 { (STRPTR
)"OM_DISPOSE", (STRPTR
)"OM_DISPOSE", (STRPTR
)"", (STRPTR
)"00000102", TRUE
},
75 { (STRPTR
)"OM_SET", (STRPTR
)"OM_SET", (STRPTR
)"opSet", (STRPTR
)"00000103", TRUE
},
76 { (STRPTR
)"OM_GET", (STRPTR
)"OM_GET", (STRPTR
)"opGet", (STRPTR
)"00000104", TRUE
},
77 { NULL
, NULL
, NULL
, NULL
, 0 }
80 const struct MethodEntry DefaultMethods
[] = {
81 { (STRPTR
)"OM_NEW", (STRPTR
)"New", (STRPTR
)"opSet", (STRPTR
)"00000101", TRUE
},
82 { (STRPTR
)"OM_DISPOSE", (STRPTR
)"Dispose", (STRPTR
)"", (STRPTR
)"00000102", TRUE
},
83 { (STRPTR
)"OM_SET", (STRPTR
)"Set", (STRPTR
)"opSet", (STRPTR
)"00000103", TRUE
},
84 { (STRPTR
)"OM_GET", (STRPTR
)"Get", (STRPTR
)"opGet", (STRPTR
)"00000104", TRUE
},
85 { NULL
, NULL
, NULL
, NULL
, 0 }
89 #define SUPERCLASS_TYPE_PRIVATE 0
90 #define SUPERCLASS_TYPE_PUBLIC 1
94 /// global vars, prototypes
96 struct MUI_CustomClass
*MuiGeneratorClass
;
99 AROS_UFP3(IPTR
, g_MuiGenerator
,
100 AROS_UFPA(Class
*, cl
, A0
),
101 AROS_UFPA(Object
*, obj
, A2
),
102 AROS_UFPA(Msg
, msg
, A1
));
104 IPTR
d_MuiGenerator(void);
106 static struct EmulLibEntry g_MuiGenerator
= {TRAP_LIB
, 0, (void(*)(void))d_MuiGenerator
};
111 /// CreateMuiGeneratorClass()
113 struct MUI_CustomClass
*CreateMuiGeneratorClass(void)
115 struct MUI_CustomClass
*cl
;
117 cl
= MUI_CreateCustomClass(NULL
, NULL
, GeneratorClass
, sizeof(struct MuiGeneratorData
), &g_MuiGenerator
);
119 MuiGeneratorClass
= cl
;
125 /// DeleteMuiGeneratorClass()
127 void DeleteMuiGeneratorClass(void)
129 MUI_DeleteCustomClass(MuiGeneratorClass
);
135 /// create_my_group()
137 static Object
*create_my_group(Object
*obj
, struct MuiGeneratorData
*d
)
141 o
= MUI_NewObjectM(MUIC_Group
,
142 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Group
,
143 MUIA_Frame
, MUIV_Frame_Group
,
144 MUIA_FrameTitle
, LS(MSG_MUI_GENERATOR_SUPERCLASS_LABEL
, "Superclass"),
145 MUIA_Background
, MUII_GroupBack
,
146 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Group
,
147 MUIA_Group_Horiz
, TRUE
,
148 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Rectangle
,
150 MUIA_Group_Child
, d
->SuperclassTypeRadio
= MUI_NewObjectM(MUIC_Radio
,
151 MUIA_Radio_Entries
, SuperclassRadioEntries
,
152 MUIA_CycleChain
, TRUE
,
154 MUIA_Group_Child
, RectangleObject
,
157 MUIA_Group_Child
, d
->SuperclassPageGroup
= MUI_NewObjectM(MUIC_Group
,
158 MUIA_Group_PageMode
, TRUE
,
159 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Group
,
160 MUIA_Group_Horiz
, TRUE
,
161 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Text
,
162 MUIA_Text_Contents
, LS(MSG_MUI_GENERATOR_SUPERCLASS_PTRNAME_LABEL
, "Pointer Name:"),
163 MUIA_Frame
, MUIV_Frame_String
,
164 MUIA_FramePhantomHoriz
, TRUE
,
167 MUIA_Group_Child
, d
->SuperclassPointerString
= MUI_NewObjectM(MUIC_String
,
168 MUIA_Frame
, MUIV_Frame_String
,
169 MUIA_String_MaxLen
, 50,
170 MUIA_String_Accept
, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_",
171 MUIA_CycleChain
, TRUE
,
174 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Group
,
175 MUIA_Group_Horiz
, TRUE
,
176 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Text
,
177 MUIA_Text_Contents
, LS(MSG_MUI_GENERATOR_SUPERCLASS_CNAME_LABEL
, "Superclass Name:"),
178 MUIA_Frame
, MUIV_Frame_String
,
179 MUIA_FramePhantomHoriz
, TRUE
,
182 MUIA_Group_Child
, d
->SuperclassNameString
= MUI_NewObjectM(MUIC_Poplist
,
183 MUIA_Popstring_String
, MUI_NewObjectM(MUIC_String
,
184 MUIA_Frame
, MUIV_Frame_String
,
185 MUIA_String_MaxLen
, 50,
186 MUIA_String_Accept
, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_",
188 MUIA_Popstring_Button
, MUI_NewObjectM(MUIC_Image
,
189 MUIA_Image_Spec
, "6:18",
190 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
191 MUIA_Frame
, MUIV_Frame_ImageButton
,
192 MUIA_Image_FreeVert
, TRUE
,
194 MUIA_Poplist_Array
, PopularMuiSuperclasses
,
195 MUIA_CycleChain
, TRUE
,
200 MUIA_Group_Child
, MUI_NewObjectM(MUIC_Group
,
201 MUIA_Frame
, MUIV_Frame_Group
,
202 MUIA_FrameTitle
, LS(MSG_MUI_GENERATOR_METHODS_FRAME_TITLE
, "Methods"),
203 MUIA_Background
, MUII_GroupBack
,
204 MUIA_Group_Child
, NewObjectM(MethodEditorClass
->mcc_Class
, NULL
,
205 EDLA_List
, d
->MethodList
= NewObjectM(MethodListClass
->mcc_Class
, NULL
,
212 MUIA_Group_Child, MUI_NewObjectM(MUIC_Group,
213 MUIA_Frame, MUIV_Frame_Group,
214 MUIA_FrameTitle, "Options",
215 MUIA_Background, MUII_GroupBack,
225 /// load_super_data()
227 int load_super_data(Class
*cl
, Object
*obj
, struct GENP_Load
*msg
)
231 struct MuiGeneratorData
*d
= INST_DATA(cl
, obj
);
233 if (FGets((BPTR
)msg
->Handle
, (STRPTR
)line
, 512))
237 if (check_pattern(line
, (STRPTR
)"SUPERTYPE/K/N/A,SUPERNAME/K/A", msg
->Parser
))
239 ULONG type
= *(ULONG
*)msg
->Parser
->params
[0];
241 if (type
< 2) xset(d
->SuperclassTypeRadio
, MUIA_Radio_Active
, type
);
246 xset(d
->SuperclassPointerString
, MUIA_String_Contents
, msg
->Parser
->params
[1]);
251 xset(d
->SuperclassNameString
, MUIA_String_Contents
, msg
->Parser
->params
[1]);
255 default: syntax_error(obj
, msg
->Parser
);
258 else syntax_error(obj
, msg
->Parser
);
260 else unexpected_eof(obj
, msg
->Parser
);
269 static BOOL
load_method(Class
*cl
, Object
*obj
, struct GENP_Load
*msg
)
273 struct MuiGeneratorData
*d
= INST_DATA(cl
, obj
);
275 if (FGets((BPTR
)msg
->Handle
, (STRPTR
)line
, 512))
279 if (check_pattern(line
, (STRPTR
)"METHOD/K/A,FUNCTION/K/A,STRUCTURE/K/A,ID/K/A,STD/K/N/A", msg
->Parser
))
281 struct MethodEntry me
;
283 me
.Name
= (STRPTR
)msg
->Parser
->params
[0];
284 me
.Function
= (STRPTR
)msg
->Parser
->params
[1];
285 me
.Structure
= (STRPTR
)msg
->Parser
->params
[2];
286 me
.Identifier
= (STRPTR
)msg
->Parser
->params
[3];
287 me
.Standard
= *(LONG
*)msg
->Parser
->params
[4];
288 DoMethod(d
->MethodList
, MUIM_List_InsertSingle
, (intptr_t)&me
, MUIV_List_Insert_Bottom
);
291 else syntax_error(obj
, msg
->Parser
);
298 /// generate_set_contents()
300 static void generate_set_contents(Object
*obj
)
302 I
; T("int tagcount = 0;\n");
303 I
; T("struct TagItem *tag, *tagptr = msg->ops_AttrList;\n\n");
304 I
; T("while (tag = NextTagItem(&tagptr))\n");
306 II
; TODO("attributes in OM_SET.");
308 I
; T("tagcount += DoSuperMethodA(cl, obj, (Msg)msg);\n");
309 I
; T("return tagcount;\n");
313 /// generate_get_contents()
315 static void generate_get_contents(Object
*obj
)
317 I
; T("int rv = FALSE;\n\n");
318 I
; T("switch (msg->opg_AttrID)\n"); I
; T("{\n"); II
;
319 TODO("attributes in OM_GET.");
320 I
; T("default: rv = (DoSuperMethodA(cl, obj, (Msg)msg));\n");
322 I
; T("return rv;\n");
328 static void generate_aros_dispatcher(Object
*obj
, Object
*method_list
, struct MuiGeneratorData
*d
)
331 int32_t superclass_type
;
332 ULONG method_count
, method_number
;
335 method_count
= xget(method_list
, MUIA_List_Entries
);
336 FmtNPut(buffer
, "%u", sizeof buffer
, method_count
);
338 T("/*** Setup ************************************************************************/\n");
339 T("ZUNE_CUSTOMCLASS_");
345 superclass_type
= xget(d
->SuperclassTypeRadio
, MUIA_Radio_Active
);
347 if (superclass_type
== SUPERCLASS_TYPE_PRIVATE
)
349 s
= (char*)xget(d
->SuperclassPointerString
, MUIA_String_Contents
);
350 T("NULL, "); T(s
); T(",");
354 s
= (char*)xget(d
->SuperclassNameString
, MUIA_String_Contents
);
355 T("MUIC_"); T(s
); T(", NULL,");
360 for (method_number
= 0;; method_number
++)
362 struct MethodEntry
*me
;
364 DoMethod(method_list
, MUIM_List_GetEntry
, method_number
, (intptr_t)&me
);
367 I
; T(me
->Name
); T(", ");
371 T("struct "); T(me
->Structure
); T(" *");
378 if (method_number
< method_count
- 1)
391 /// MuiGeneratorNew()
393 IPTR
MuiGeneratorNew(Class
*cl
, Object
*obj
, struct opSet
*msg
)
395 Object
*newobj
= NULL
;
397 if (obj
= (Object
*)DoSuperMethodA(cl
, obj
, (Msg
)msg
))
399 struct MuiGeneratorData
*d
= INST_DATA(cl
, obj
);
402 if (my_group
= create_my_group(obj
, d
))
406 GetAttr(GENA_SubclassSpace
, obj
, (IPTR
*)&parent
);
410 DoMethod(parent
, OM_ADDMEMBER
, (intptr_t)my_group
);
411 SetAttrs(obj
, MUIA_Window_Title
,
412 (IPTR
)LS(MSG_MUI_GENERATOR_WINDOW_TITLE
, "MUI Custom Class"), TAG_END
);
413 DoMethod(d
->SuperclassTypeRadio
, MUIM_Notify
, MUIA_Radio_Active
, MUIV_EveryTime
,
414 (intptr_t)d
->SuperclassPageGroup
, 3, MUIM_Set
, MUIA_Group_ActivePage
, MUIV_TriggerValue
);
415 DoMethod(d
->MethodList
, MTLM_InsertMethodTable
, (IPTR
)DefaultMethods
);
419 else MUI_DisposeObject(my_group
);
422 if (!newobj
) CoerceMethod(cl
, obj
, OM_DISPOSE
);
429 /// MuiGeneratorDispose()
431 IPTR
MuiGeneratorDispose(Class
*cl
, Object
*obj
, Msg msg
)
433 return DoSuperMethodA(cl
, obj
, msg
);
438 /// MuiGeneratorGet()
440 IPTR
MuiGeneratorGet(Class
*cl
, Object
*obj
, struct opGet
*msg
)
442 switch (msg
->opg_AttrID
)
444 case GENA_ProjectType
:
445 *(STRPTR
*)msg
->opg_Storage
= (STRPTR
)"MUI Class";
448 return DoSuperMethodA(cl
, obj
, (Msg
)msg
);
453 /// MuiGeneratorGenerate()
455 intptr_t MuiGeneratorGenerate(Class
*cl
, Object
*obj
, Msg msg
)
457 struct MuiGeneratorData
*d
= INST_DATA(cl
, obj
);
462 /* === Class code. === */
464 if (DoMethod(obj
, GENM_Setup
, (intptr_t)"%s.c"))
469 T(" Copyright © 2012, The AROS Development Team. All rights reserved.\n");
472 TCS("#include \"%s.h\"\n\n");
474 TC("/// %s_DATA\n\n");
475 TC("struct %s_DATA\n{\n"); II
; I
; T("// Insert object instance data here.\n"); IO
; T("};\n\n\n");
478 /*------------------------------------------------------------------------*/
480 /*------------------------------------------------------------------------*/
482 for (entry_number
= 0;; entry_number
++)
484 struct MethodEntry
*me
;
485 BOOL return_zero
= TRUE
;
487 DoMethod(d
->MethodList
, MUIM_List_GetEntry
, entry_number
, (intptr_t)&me
);
489 DoMethod(obj
, GENM_MethodHeader
, (IPTR
)me
->Name
, (IPTR
)me
->Function
,
490 (IPTR
)me
->Structure
, (IPTR
)me
->Identifier
, TRUE
, FALSE
);
492 if (strcmp((char*)me
->Name
, "OM_GET") == 0)
494 generate_get_contents(obj
);
497 else if (strcmp((char*)me
->Name
, "OM_SET") == 0)
499 generate_set_contents(obj
);
503 DoMethod(obj
, GENM_MethodFooter
, return_zero
);
506 generate_aros_dispatcher(obj
, d
->MethodList
, d
);
511 int32_t superclass_type
;
513 DoMethod(obj
, GENM_Signature
);
514 TC("/* %sClass code. */\n\n");
515 TCS("#include \"%s.h\"\n\n");
516 TC("struct MUI_CustomClass *%sClass;\n\n");
518 T("/// dispatcher prototype\n\n");
519 TC("IPTR %sDispatcher(void);\n");
520 TC("const struct EmulLibEntry %sGate = ");
521 TC("{TRAP_LIB, 0, (void(*)(void))%sDispatcher};\n");
524 TC("/// %sData\n\n");
525 TC("struct %sData\n{\n"); II
; I
; T("// Insert object instance data here.\n"); IO
; T("};\n\n\n");
528 /*------------------------------------------------------------------------*/
530 /*------------------------------------------------------------------------*/
532 TC("/// Create%sClass()\n\n");
533 TC("struct MUI_CustomClass *Create%sClass(void)\n{\n");
534 II
; I
; T("struct MUI_CustomClass *cl;\n\n");
535 I
; T("cl = MUI_CreateCustomClass(NULL, ");
536 superclass_type
= xget(d
->SuperclassTypeRadio
, MUIA_Radio_Active
);
538 if (superclass_type
== SUPERCLASS_TYPE_PRIVATE
)
540 s
= (char*)xget(d
->SuperclassPointerString
, MUIA_String_Contents
);
541 T("NULL, "); T(s
); T(", ");
545 s
= (char*)xget(d
->SuperclassNameString
, MUIA_String_Contents
);
546 T("MUIC_"); T(s
); T(", NULL, ");
549 TC("sizeof(struct %sData), ");
550 TC("(APTR)&%sGate);\n");
551 I
; TC("%sClass = cl;\n"); I
; T("return cl;\n"); IO
; T("}\n\n\n");
554 /*------------------------------------------------------------------------*/
556 /*------------------------------------------------------------------------*/
558 TC("/// Delete%sClass()\n\n");
559 TC("void Delete%sClass(void)\n{\n");
560 II
; I
; TC("if (%sClass) "); TC("MUI_DeleteCustomClass(%sClass);\n");
561 IO
; T("}\n\n\n///\n");
563 /*------------------------------------------------------------------------*/
565 /*------------------------------------------------------------------------*/
567 for (entry_number
= 0;; entry_number
++)
569 struct MethodEntry
*me
;
570 BOOL return_zero
= TRUE
;
572 DoMethod(d
->MethodList
, MUIM_List_GetEntry
, entry_number
, (intptr_t)&me
);
574 DoMethod(obj
, GENM_MethodHeader
, (IPTR
)me
->Name
, (IPTR
)me
->Function
,
575 (IPTR
)me
->Structure
, (IPTR
)me
->Identifier
, TRUE
, FALSE
);
577 if (strcmp((char*)me
->Name
, "OM_GET") == 0)
579 generate_get_contents(obj
);
582 else if (strcmp((char*)me
->Name
, "OM_SET") == 0)
584 generate_set_contents(obj
);
588 DoMethod(obj
, GENM_MethodFooter
, return_zero
);
591 generate_dispatcher(obj
, d
->MethodList
);
596 DoMethod(obj
, GENM_Cleanup
);
598 /* === Class header. === */
600 if (DoMethod(obj
, GENM_Setup
, (intptr_t)"%s.h"))
605 TC("#ifndef %s_H\n");
606 TC("#define %s_H\n\n");
608 T(" Copyright © 2012, The AROS Development Team. All rights reserved.\n");
611 T("#include <exec/types.h>\n");
612 T("#include <libraries/mui.h>\n\n");
613 T("/*** Identifier base ********************************************************/\n");
614 TC("#define MUIB_%s (TAG_USER|0x00000000)\n\n");
620 T("/*** Attributes *************************************************************/\n");
621 for (entry_number
= 0;; entry_number
++)
623 struct MethodEntry
*me
;
625 DoMethod(d
->MethodList
, MUIM_List_GetEntry
, entry_number
, (intptr_t)&me
);
630 T("#define "); T(me
->Name
); TC(" (MUIB_%s | 0x"); T(me
->Identifier
); T(")\n");
633 T("\n/*** Variables **************************************************************/\n");
634 TC("extern struct MUI_CustomClass *%s_CLASS;\n\n");
636 T("/*** Macros *****************************************************************/\n");
637 TC("#define %sObject ");
638 TC("BOOPSIOBJMACRO_START(%s_CLASS->mcc_Class)\n\n");
643 DoMethod(obj
, GENM_Signature
);
644 TC("/* %sClass header. */\n\n");
645 T("#include <proto/intuition.h>\n");
646 T("#include <proto/utility.h>\n");
647 T("#include <proto/muimaster.h>\n");
648 T("#include <clib/alib_protos.h>\n\n");
649 TC("extern struct MUI_CustomClass *%sClass;\n\n");
650 TC("struct MUI_CustomClass *Create%sClass(void);\n");
651 TC("void Delete%sClass(void);\n\n\n");
657 for (entry_number
= 0;; entry_number
++)
659 struct MethodEntry
*me
;
661 DoMethod(d
->MethodList
, MUIM_List_GetEntry
, entry_number
, (intptr_t)&me
);
666 T("#define "); T(me
->Name
); T(" 0x"); T(me
->Identifier
); T("\n");
673 DoMethod(obj
, GENM_Cleanup
);
674 DoSuperMethodA(cl
, obj
, msg
); // displays info requester
680 /// MuiGeneratorSave()
682 IPTR
MuiGeneratorSave(Class
*cl
, Object
*obj
, struct GENP_Save
*msg
)
684 struct MuiGeneratorData
*d
= INST_DATA(cl
, obj
);
686 if (DoSuperMethodA(cl
, obj
, msg
))
690 supertype
= xget(d
->SuperclassTypeRadio
, MUIA_Radio_Active
);
692 if (supertype
== 0) FPrintf((BPTR
)msg
->Handle
, (STRPTR
)"SUPERTYPE=0 SUPERNAME=%s\n", xget(d
->SuperclassPointerString
, MUIA_String_Contents
));
693 else FPrintf((BPTR
)msg
->Handle
, (STRPTR
)"SUPERTYPE=1 SUPERNAME=%s\n", xget(d
->SuperclassNameString
, MUIA_String_Contents
));
699 struct MethodEntry
*me
;
702 DoMethod(d
->MethodList
, MUIM_List_GetEntry
, e
, (intptr_t)&me
);
704 if (*me
->Structure
== 0x00) s
= (STRPTR
)"\"\"";
705 else s
= me
->Structure
;
706 FPrintf((BPTR
)msg
->Handle
, (STRPTR
)"METHOD=%s FUNCTION=%s STRUCTURE=%s ID=%s STD=%ld\n", (intptr_t)me
->Name
,
707 (intptr_t)me
->Function
, (intptr_t)s
, (intptr_t)me
->Identifier
, me
->Standard
);
716 /// MuiGeneratorLoad()
718 IPTR
MuiGeneratorLoad(Class
*cl
, Object
*obj
, struct GENP_Load
*msg
)
720 struct MuiGeneratorData
*d
= INST_DATA(cl
, obj
);
723 if (DoSuperMethodA(cl
, obj
, (Msg
)msg
))
725 if (load_super_data(cl
, obj
, msg
))
727 DoMethod(d
->MethodList
, MUIM_List_Clear
);
728 while (load_method(cl
, obj
, msg
));
741 BOOPSI_DISPATCHER(IPTR
, g_MuiGenerator
, cl
, obj
, msg
)
744 IPTR
d_MuiGenerator(void)
746 Class
*cl
= (Class
*)REG_A0
;
747 Object
*obj
= (Object
*)REG_A2
;
748 Msg msg
= (Msg
)REG_A1
;
751 switch (msg
->MethodID
)
753 case OM_NEW
: return (MuiGeneratorNew(cl
, obj
, (struct opSet
*)msg
));
754 case OM_DISPOSE
: return (MuiGeneratorDispose(cl
, obj
, msg
));
755 case OM_GET
: return (MuiGeneratorGet(cl
, obj
, (struct opGet
*)msg
));
756 case GENM_Generate
: return (MuiGeneratorGenerate(cl
, obj
, msg
));
757 case GENM_Save
: return (MuiGeneratorSave(cl
, obj
, (struct GENP_Save
*)msg
));
758 case GENM_Load
: return (MuiGeneratorLoad(cl
, obj
, (struct GENP_Load
*)msg
));
759 default: return (DoSuperMethodA(cl
, obj
, msg
));
763 BOOPSI_DISPATCHER_END