2 Copyright © 2002-2010, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
9 #include <aros/debug.h>
11 #include <exec/memory.h>
12 #include <clib/alib_protos.h>
13 #include <proto/exec.h>
14 #include <proto/dos.h>
15 #include <proto/intuition.h>
16 #include <proto/utility.h>
17 #include <proto/muimaster.h>
22 #include "muimaster_intern.h"
24 #include "support_classes.h"
25 #include "floattext_private.h"
27 extern struct Library
*MUIMasterBase
;
29 // like strlen(), but \n ends string, too.
30 static long MyStrLen(const char *ptr
)
32 const char *start
= ptr
;
34 while (*ptr
&& (*ptr
!= '\n'))
37 return (((long)ptr
) - ((long)start
));
40 static void SetText(Object
*obj
, struct Floattext_DATA
*data
)
42 DoMethod(obj
, MUIM_List_Clear
);
46 STRPTR pos
= data
->text
;
49 LONG len
= MyStrLen(pos
);
50 DoMethod(obj
, MUIM_List_InsertSingle
, pos
,
51 MUIV_List_Insert_Bottom
);
60 AROS_UFH3S(APTR
, construct_func
,
61 AROS_UFHA(struct Hook
*, hook
, A0
),
62 AROS_UFHA(APTR
, pool
, A2
),
63 AROS_UFHA(STRPTR
, entry
, A1
))
67 // TODO: MUIA_Floattext_Justify
68 struct Floattext_DATA
*data
= hook
->h_Data
;
73 ULONG slen
= MyStrLen(entry
);
74 ULONG size
= slen
+ 1;
77 for (i
= 0; i
< slen
; i
++)
82 size
+= tabs
* data
->tabsize
; // Worst case
84 if ((new = AllocVecPooled(pool
, size
)))
88 for (; oldpos
< slen
; oldpos
++)
92 if (strchr(data
->skipchars
, entry
[oldpos
]))
98 if (entry
[oldpos
] == '\t')
100 LONG spaces
= data
->tabsize
- (newpos
% data
->tabsize
);
101 for (; spaces
> 0; spaces
--)
108 new[newpos
++] = entry
[oldpos
];
118 AROS_UFH3S(void, destruct_func
,
119 AROS_UFHA(struct Hook
*, hook
, A0
),
120 AROS_UFHA(APTR
, pool
, A2
),
121 AROS_UFHA(STRPTR
, entry
, A1
))
125 FreeVecPooled(pool
, entry
);
130 IPTR
Floattext__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
132 struct Floattext_DATA
*data
;
134 struct TagItem
*tags
;
136 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
143 data
= INST_DATA(cl
, obj
);
145 data
->construct_hook
.h_Entry
= (HOOKFUNC
) construct_func
;
146 data
->construct_hook
.h_Data
= data
;
147 data
->destruct_hook
.h_Entry
= (HOOKFUNC
) destruct_func
;
149 SetAttrs(obj
, MUIA_List_ConstructHook
, (IPTR
) & data
->construct_hook
,
150 MUIA_List_DestructHook
, (IPTR
) & data
->destruct_hook
, TAG_DONE
);
152 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
156 case MUIA_Floattext_Justify
:
157 data
->justify
= tag
->ti_Data
;
161 case MUIA_Floattext_SkipChars
:
162 data
->skipchars
= (STRPTR
) tag
->ti_Data
;
165 case MUIA_Floattext_TabSize
:
166 data
->tabsize
= tag
->ti_Data
;
169 case MUIA_Floattext_Text
:
170 data
->text
= StrDup((STRPTR
) tag
->ti_Data
);
175 if (data
->tabsize
== 0)
177 else if (data
->tabsize
> 20)
185 IPTR
Floattext__OM_DISPOSE(struct IClass
*cl
, Object
*obj
,
188 struct Floattext_DATA
*data
= INST_DATA(cl
, obj
);
192 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
195 IPTR
Floattext__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
197 struct Floattext_DATA
*data
= INST_DATA(cl
, obj
);
198 #define STORE *(msg->opg_Storage)
200 switch (msg
->opg_AttrID
)
202 case MUIA_Floattext_Justify
:
203 STORE
= data
->justify
;
206 case MUIA_Floattext_Text
:
207 STORE
= (IPTR
) data
->text
;
214 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
217 IPTR
Floattext__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
219 struct Floattext_DATA
*data
= INST_DATA(cl
, obj
);
221 struct TagItem
*tags
;
222 BOOL changed
= FALSE
;
224 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
228 case MUIA_Floattext_Justify
:
229 data
->justify
= tag
->ti_Data
;
233 case MUIA_Floattext_SkipChars
:
234 data
->skipchars
= (STRPTR
) tag
->ti_Data
;
238 case MUIA_Floattext_TabSize
:
239 data
->tabsize
= tag
->ti_Data
;
243 case MUIA_Floattext_Text
:
245 data
->text
= StrDup((STRPTR
) tag
->ti_Data
);
252 if (changed
) // To avoid recursion
254 if (data
->tabsize
== 0)
256 else if (data
->tabsize
> 20)
262 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
265 #if ZUNE_BUILTIN_FLOATTEXT
266 BOOPSI_DISPATCHER(IPTR
, Floattext_Dispatcher
, cl
, obj
, msg
)
268 switch (msg
->MethodID
)
271 return Floattext__OM_NEW(cl
, obj
, msg
);
273 return Floattext__OM_DISPOSE(cl
, obj
, msg
);
275 return Floattext__OM_GET(cl
, obj
, msg
);
277 return Floattext__OM_SET(cl
, obj
, msg
);
280 return DoSuperMethodA(cl
, obj
, msg
);
283 BOOPSI_DISPATCHER_END
285 const struct __MUIBuiltinClass _MUI_Floattext_desc
=
289 sizeof(struct Floattext_DATA
),
290 (void *) Floattext_Dispatcher
292 #endif /* ZUNE_BUILTIN_FLOATTEXT */