1 /*****************************************************************************
3 * mui-gtk - a wrapper library to wrap GTK+ calls to MUI
5 * Copyright (C) 2005 Oliver Brunner
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 * Contact information:
25 * E-Mail: mui-gtk "at" oliver-brunner.de
29 *****************************************************************************/
32 #include <proto/utility.h>
38 #include "gtk_globals.h"
43 Object
*registergroup
;
46 unsigned int nrchilds
;
49 static Object
*mgtk_note_new(Object
**child
,char **label
) {
53 DebOut("mgtk_note_new(%lx,%lx)\n",child
,label
);
55 reg
=RegisterGroup(label
),
56 MUIA_Register_Frame
, TRUE
,
61 DoMethod(reg
,OM_ADDMEMBER
,child
[i
]);
68 static void mgtk_note_add_child(Object
*obj
,struct Data
*data
,GtkWidget
*newchild
, int prepend
) {
77 DebOut("mgtk_add_child(%lx,%lx,%d)\n",obj
,newchild
,prepend
);
79 reg
=data
->registergroup
;
81 DoMethod(obj
,MUIM_Group_InitChange
);
84 /* this is the first child, so remove dummy child */
85 list
=(struct List
*) xget(reg
,MUIA_Group_ChildList
);
86 state
= list
->lh_Head
;
87 o
= NextObject( &state
);
88 DoMethod(reg
,OM_REMMEMBER
,o
);
90 g_free(data
->mylabel
[0]);
91 DebOut(" removed dummy object\n");
94 childs
=g_new(Object
*,(data
->nrchilds
)+2);
95 labels
=g_new(char *,(data
->nrchilds
)+2);
97 /* copy old content, and remove children from old register */
98 DebOut(" copy old content and remove children\n");
101 while(i
<prepend
+data
->nrchilds
) {
102 DebOut(" %d: %lx,%s\n",i
,data
->mychild
[i
],data
->mylabel
[i
-prepend
]);
103 childs
[i
]=data
->mychild
[i
-prepend
];
104 DoMethod(reg
,OM_REMMEMBER
,data
->mychild
[i
-prepend
]);
105 labels
[i
]=data
->mylabel
[i
-prepend
];
108 DebOut(" add new child\n");
109 DebOut(" newchild->MuiObject=%lx\n",newchild
->MuiObject
);
110 DebOut(" newchild->title=>%s<\n",newchild
->title
);
112 #warning g_strdup(2+newchild->title) .. why +2 ??
115 childs
[i
]=newchild
->MuiObject
;
116 if(newchild
->title
) {
117 /* ??? TODO : labels[i]=g_strdup(2+newchild->title);*/
118 labels
[i
]=g_strdup(2+newchild
->title
);
121 labels
[i
]=g_strdup_printf("page %d",i
+1);
125 childs
[0]=newchild
->MuiObject
;
126 if(newchild
->title
) {
127 /* ??? TODO : labels[0]=g_strdup(2+newchild->title);*/
128 labels
[0]=g_strdup(2+newchild
->title
);
131 labels
[0]=g_strdup_printf("page 0");
139 /* now we have everything,
140 * so get rid of the old (now empty) register
143 DoMethod(obj
,OM_REMMEMBER
,reg
);
144 MUI_DisposeObject(reg
);
145 g_free(data
->mychild
);
146 g_free(data
->mylabel
);
148 /* create and add new reg */
149 reg
=mgtk_note_new(childs
,labels
);
150 DoMethod(obj
,OM_ADDMEMBER
,reg
);
154 data
->mychild
=childs
;
155 data
->mylabel
=labels
;
157 DoMethod(obj
,MUIM_Group_ExitChange
);
160 static void mgtk_append_child(Object
*obj
,struct Data
*data
,GtkWidget
*newchild
) {
161 mgtk_note_add_child(obj
,data
,newchild
, FALSE
);
164 static void mgtk_prepend_child(Object
*obj
,struct Data
*data
,GtkWidget
*newchild
) {
165 mgtk_note_add_child(obj
,data
,newchild
, TRUE
);
168 /*******************************************
170 *******************************************/
171 HOOKPROTO(MUIHook_notebook
, ULONG
, MGTK_HOOK_OBJECT_POINTER obj
, MGTK_HOOK_APTR hookpointer
)
176 DebOut("MUIHook_notebook(%x) called\n", (int) obj
);
177 widget
=mgtk_get_widget_from_obj(obj
);
180 mgtk_notebook_value_update(widget);
186 MakeHook(MyMuiHook_notebook
, MUIHook_notebook
);
188 /*******************************************
191 * requires MA_Widget!
192 * we create a empty Notebook, as MUI does
193 * not like empty Registers, we fill it
195 *******************************************/
196 static ULONG
mNew(struct IClass
*cl
, APTR obj
, Msg msg
)
199 struct TagItem
*tstate
, *tag
;
200 Object
*registergroup
;
204 DebOut("mNew (notebook)\n");
206 obj
= (APTR
)DoSuperMethodA(cl
, obj
, msg
);
209 ErrOut("notebook: unable to create object!");
213 DebOut(" new obj=%lx\n",obj
);
215 tstate
=((struct opSet
*)msg
)->ops_AttrList
;
218 while ((tag
= (struct TagItem
*) NextTagItem((APTR
) &tstate
)))
223 widget
= (GtkWidget
*) tag
->ti_Data
;
229 ErrOut("classes/spinbutton.c: mNew: MA_Widget not supplied!\n");
233 DebOut(" widget=%d\n",widget
);
235 /* setup internal hooks */
236 /* TODO DoMethod(text,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime, text,2,MUIM_CallHook,&MyMuiHook_spinbutton);*/
238 childs
=g_new(Object
*,2);
239 labels
=g_new(char *,2);
242 childs
[0]=TextObject
,MUIA_Text_Contents
,"DUMMY OBJECT",End
;
243 labels
[0]=g_strdup("DUMMY LABEL");
245 childs
[0]=TextObject
,MUIA_Text_Contents
,"",End
;
246 labels
[0]=g_strdup("");
252 registergroup
=mgtk_note_new(childs
,labels
);
254 DoMethod(obj
,OM_ADDMEMBER
,registergroup
);
261 data
->registergroup
=registergroup
;
262 data
->mylabel
=labels
;
263 data
->mychild
=childs
;
270 /*******************************************
273 * MA_Spin_Value only usefull TAG here
274 * MA_Spin_String_Value *private*
275 *******************************************/
276 static VOID
mSet(struct Data
*data
, APTR obj
, struct opSet
*msg
) {
277 struct TagItem
*tstate
, *tag
;
279 DebOut("mSet(%lx,%lx,%lx)\n",data
,obj
,msg
);
281 tstate
= msg
->ops_AttrList
;
283 while ((tag
= (struct TagItem
*) NextTagItem(&tstate
)))
287 case MA_Note_Append_Child
:
288 /* data needs to be a widget */
289 DebOut("mSet append to %lx: %lx\n",obj
,tag
->ti_Data
);
290 mgtk_append_child(obj
,data
,(GtkWidget
*) tag
->ti_Data
);
292 case MA_Note_Prepend_Child
:
293 /* data needs to be a widget */
294 DebOut("mSet append to %lx: %lx\n",obj
,tag
->ti_Data
);
295 mgtk_prepend_child(obj
,data
,(GtkWidget
*) tag
->ti_Data
);
297 case MUIA_Group_ActivePage
:
298 set(data
->registergroup
,MUIA_Group_ActivePage
,tag
->ti_Data
);
305 /*******************************************
308 * MA_Widget: GtkWidget of this spin
309 *******************************************/
310 static ULONG
mGet(struct Data
*data
, APTR obj
, struct opGet
*msg
, struct IClass
*cl
)
314 switch (msg
->opg_AttrID
) {
316 DebOut("mGet: data->widget=%x\n",(int) data
->widget
);
317 rc
= (ULONG
) data
->widget
;
319 case MUIA_Group_ActivePage
:
320 return xget(data
->registergroup
,MUIA_Group_ActivePage
);
323 return DoSuperMethodA(cl
, obj
, (Msg
)msg
);
326 *msg
->opg_Storage
= rc
;
330 /*******************************************
332 *******************************************/
336 switch (msg
->MethodID
)
338 case OM_NEW
: return mNew (cl
, obj
, msg
);
339 case OM_SET
: mSet (data
, obj
, (APTR
)msg
); break;
340 case OM_GET
: return mGet (data
, obj
, (APTR
)msg
, cl
);
345 /*******************************************
346 * Custom class create/delete
347 *******************************************/
348 int mgtk_create_notebook_class(void)
350 DebOut("mgtk_create_notebook_class()\n");
352 CL_NoteBook
= MUI_CreateCustomClass(NULL
, MUIC_Group
, NULL
, sizeof(struct Data
), (APTR
)&mDispatcher
);
354 DebOut("CL_NoteBook=%lx\n",CL_NoteBook
);
356 return CL_NoteBook
? 1 : 0;
359 void mgtk_delete_notebook_class(void)
363 MUI_DeleteCustomClass(CL_NoteBook
);