Disabled, because it makes the nightly builds fail quite often and it's already
[AROS-Contrib.git] / mui / gtk-mui / classes / notebook.c
blobc17b31473a48a0ff30c6d3d5a060278638b47c88
1 /*****************************************************************************
2 *
3 * mui-gtk - a wrapper library to wrap GTK+ calls to MUI
5 * Copyright (C) 2005 Oliver Brunner
6 *
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:
23 * Oliver Brunner
25 * E-Mail: mui-gtk "at" oliver-brunner.de
27 * $Id$
29 *****************************************************************************/
31 #include <stdlib.h>
32 #include <proto/utility.h>
33 #include <mui.h>
35 #include "debug.h"
36 #include "classes.h"
37 #include "gtk.h"
38 #include "gtk_globals.h"
40 struct Data
42 GtkWidget *widget;
43 Object *registergroup;
44 Object **mychild;
45 char **mylabel;
46 unsigned int nrchilds;
49 static Object *mgtk_note_new(Object **child,char **label) {
50 Object *reg;
51 int i;
53 DebOut("mgtk_note_new(%lx,%lx)\n",child,label);
55 reg=RegisterGroup(label),
56 MUIA_Register_Frame, TRUE,
57 End;
59 i=0;
60 while(label[i]) {
61 DoMethod(reg,OM_ADDMEMBER,child[i]);
62 i++;
65 return reg;
68 static void mgtk_note_add_child(Object *obj,struct Data *data,GtkWidget *newchild, int prepend) {
69 struct List *list;
70 struct Node *state;
71 Object *reg;
72 Object *o;
73 Object **childs;
74 char **labels;
75 int i;
77 DebOut("mgtk_add_child(%lx,%lx,%d)\n",obj,newchild,prepend);
79 reg=data->registergroup;
81 DoMethod(obj,MUIM_Group_InitChange);
83 if(!data->nrchilds) {
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);
89 MUI_DisposeObject(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");
99 i=prepend;
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];
106 i++;
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 ??
114 if(!prepend) {
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);
120 else {
121 labels[i]=g_strdup_printf("page %d",i+1);
124 else {
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);
130 else {
131 labels[0]=g_strdup_printf("page 0");
135 i++;
136 childs[i]=NULL;
137 labels[i]=NULL;
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);
152 data->nrchilds++;
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 /*******************************************
169 * MUIHook_notebook
170 *******************************************/
171 HOOKPROTO(MUIHook_notebook, ULONG, MGTK_HOOK_OBJECT_POINTER obj, MGTK_HOOK_APTR hookpointer)
173 MGTK_USERFUNC_INIT
174 GtkWidget *widget;
176 DebOut("MUIHook_notebook(%x) called\n", (int) obj);
177 widget=mgtk_get_widget_from_obj(obj);
179 /*TODO
180 mgtk_notebook_value_update(widget);
183 return 0;
184 MGTK_USERFUNC_EXIT
186 MakeHook(MyMuiHook_notebook, MUIHook_notebook);
188 /*******************************************
189 * mNew
191 * requires MA_Widget!
192 * we create a empty Notebook, as MUI does
193 * not like empty Registers, we fill it
194 * with a dummy.
195 *******************************************/
196 static ULONG mNew(struct IClass *cl, APTR obj, Msg msg)
198 GtkWidget *widget;
199 struct TagItem *tstate, *tag;
200 Object *registergroup;
201 Object **childs;
202 char **labels;
204 DebOut("mNew (notebook)\n");
206 obj = (APTR)DoSuperMethodA(cl, obj, msg);
208 if(!obj) {
209 ErrOut("notebook: unable to create object!");
210 return (ULONG) NULL;
213 DebOut(" new obj=%lx\n",obj);
215 tstate=((struct opSet *)msg)->ops_AttrList;
217 widget=NULL;
218 while ((tag = (struct TagItem *) NextTagItem((APTR) &tstate)))
220 switch (tag->ti_Tag)
222 case MA_Widget:
223 widget = (GtkWidget *) tag->ti_Data;
224 break;
228 if(!widget) {
229 ErrOut("classes/spinbutton.c: mNew: MA_Widget not supplied!\n");
230 return (ULONG) NULL;
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);
241 #ifdef MGTK_DEBUG
242 childs[0]=TextObject,MUIA_Text_Contents,"DUMMY OBJECT",End;
243 labels[0]=g_strdup("DUMMY LABEL");
244 #else
245 childs[0]=TextObject,MUIA_Text_Contents,"",End;
246 labels[0]=g_strdup("");
247 #endif
249 childs[1]=NULL;
250 labels[1]=NULL;
252 registergroup=mgtk_note_new(childs,labels);
254 DoMethod(obj,OM_ADDMEMBER,registergroup);
256 if (obj)
258 GETDATA;
260 data->widget=widget;
261 data->registergroup=registergroup;
262 data->mylabel=labels;
263 data->mychild=childs;
264 data->nrchilds=0;
267 return (ULONG)obj;
270 /*******************************************
271 * mSet
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)))
285 switch (tag->ti_Tag)
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);
291 break;
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);
296 break;
297 case MUIA_Group_ActivePage:
298 set(data->registergroup,MUIA_Group_ActivePage,tag->ti_Data);
299 break;
305 /*******************************************
306 * mGet
308 * MA_Widget: GtkWidget of this spin
309 *******************************************/
310 static ULONG mGet(struct Data *data, APTR obj, struct opGet *msg, struct IClass *cl)
312 ULONG rc;
314 switch (msg->opg_AttrID) {
315 case MA_Widget :
316 DebOut("mGet: data->widget=%x\n",(int) data->widget);
317 rc = (ULONG) data->widget;
318 break;
319 case MUIA_Group_ActivePage:
320 return xget(data->registergroup,MUIA_Group_ActivePage);
321 break;
322 default:
323 return DoSuperMethodA(cl, obj, (Msg)msg);
326 *msg->opg_Storage = rc;
327 return TRUE;
330 /*******************************************
331 * Dispatcher
332 *******************************************/
333 BEGINMTABLE
334 GETDATA;
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);
343 ENDMTABLE
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)
361 if (CL_NoteBook)
363 MUI_DeleteCustomClass(CL_NoteBook);