Tabs to spaces, more consistent formatting.
[AROS.git] / workbench / libs / muimaster / classes / floattext.c
blob1bb08e6bab546551653886c986316a9b74b25e20
1 /*
2 Copyright © 2002-2010, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define MUIMASTER_YES_INLINE_STDARG
8 #define DEBUG 0
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>
19 #include <string.h>
21 #include "mui.h"
22 #include "muimaster_intern.h"
23 #include "support.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'))
35 ptr++;
37 return (((long)ptr) - ((long)start));
40 static void SetText(Object *obj, struct Floattext_DATA *data)
42 DoMethod(obj, MUIM_List_Clear);
44 if (data->text)
46 STRPTR pos = data->text;
47 for (;;)
49 LONG len = MyStrLen(pos);
50 DoMethod(obj, MUIM_List_InsertSingle, pos,
51 MUIV_List_Insert_Bottom);
52 pos += len;
53 if (*pos == '\0')
54 break;
55 pos++;
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))
65 AROS_USERFUNC_INIT
67 // TODO: MUIA_Floattext_Justify
68 struct Floattext_DATA *data = hook->h_Data;
70 STRPTR new;
71 ULONG tabs = 0;
72 ULONG i;
73 ULONG slen = MyStrLen(entry);
74 ULONG size = slen + 1;
76 // Count tabulators
77 for (i = 0; i < slen; i++)
79 if (entry[i] == '\t')
80 tabs++;
82 size += tabs * data->tabsize; // Worst case
84 if ((new = AllocVecPooled(pool, size)))
86 ULONG oldpos = 0;
87 ULONG newpos = 0;
88 for (; oldpos < slen; oldpos++)
90 if (data->skipchars)
92 if (strchr(data->skipchars, entry[oldpos]))
94 continue;
98 if (entry[oldpos] == '\t')
100 LONG spaces = data->tabsize - (newpos % data->tabsize);
101 for (; spaces > 0; spaces--)
103 new[newpos++] = ' ';
106 else
108 new[newpos++] = entry[oldpos];
111 new[newpos] = '\0';
113 return new;
115 AROS_USERFUNC_EXIT
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))
123 AROS_USERFUNC_INIT
125 FreeVecPooled(pool, entry);
127 AROS_USERFUNC_EXIT
130 IPTR Floattext__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg)
132 struct Floattext_DATA *data;
133 struct TagItem *tag;
134 struct TagItem *tags;
136 obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg);
138 if (!obj)
140 return 0;
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));)
154 switch (tag->ti_Tag)
156 case MUIA_Floattext_Justify:
157 data->justify = tag->ti_Data;
158 break;
161 case MUIA_Floattext_SkipChars:
162 data->skipchars = (STRPTR) tag->ti_Data;
163 break;
165 case MUIA_Floattext_TabSize:
166 data->tabsize = tag->ti_Data;
167 break;
169 case MUIA_Floattext_Text:
170 data->text = StrDup((STRPTR) tag->ti_Data);
171 break;
175 if (data->tabsize == 0)
176 data->tabsize = 8;
177 else if (data->tabsize > 20)
178 data->tabsize = 20;
180 SetText(obj, data);
182 return (IPTR) obj;
185 IPTR Floattext__OM_DISPOSE(struct IClass *cl, Object *obj,
186 struct opSet *msg)
188 struct Floattext_DATA *data = INST_DATA(cl, obj);
190 FreeVec(data->text);
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;
204 return 1;
206 case MUIA_Floattext_Text:
207 STORE = (IPTR) data->text;
208 return 1;
212 #undef STORE
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);
220 struct TagItem *tag;
221 struct TagItem *tags;
222 BOOL changed = FALSE;
224 for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));)
226 switch (tag->ti_Tag)
228 case MUIA_Floattext_Justify:
229 data->justify = tag->ti_Data;
230 changed = TRUE;
231 break;
233 case MUIA_Floattext_SkipChars:
234 data->skipchars = (STRPTR) tag->ti_Data;
235 changed = TRUE;
236 break;
238 case MUIA_Floattext_TabSize:
239 data->tabsize = tag->ti_Data;
240 changed = TRUE;
241 break;
243 case MUIA_Floattext_Text:
244 FreeVec(data->text);
245 data->text = StrDup((STRPTR) tag->ti_Data);
246 changed = TRUE;
247 break;
252 if (changed) // To avoid recursion
254 if (data->tabsize == 0)
255 data->tabsize = 8;
256 else if (data->tabsize > 20)
257 data->tabsize = 20;
259 SetText(obj, data);
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)
270 case OM_NEW:
271 return Floattext__OM_NEW(cl, obj, msg);
272 case OM_DISPOSE:
273 return Floattext__OM_DISPOSE(cl, obj, msg);
274 case OM_GET:
275 return Floattext__OM_GET(cl, obj, msg);
276 case OM_SET:
277 return Floattext__OM_SET(cl, obj, msg);
279 default:
280 return DoSuperMethodA(cl, obj, msg);
283 BOOPSI_DISPATCHER_END
285 const struct __MUIBuiltinClass _MUI_Floattext_desc =
287 MUIC_Floattext,
288 MUIC_List,
289 sizeof(struct Floattext_DATA),
290 (void *) Floattext_Dispatcher
292 #endif /* ZUNE_BUILTIN_FLOATTEXT */