Merging NList MCC 0.119 into the main branch.
[AROS.git] / workbench / classes / zune / nlist / nfloattext_mcc / NFloattext.c
blobd3e5b3202ab28d497121e768a1c4bba986eb2ea5
1 /***************************************************************************
3 NFloattext.mcc - New Floattext MUI Custom Class
4 Registered MUI class, Serial Number: 1d51 (0x9d5100a1 to 0x9d5100aF)
6 Copyright (C) 1996-2001 by Gilles Masson
7 Copyright (C) 2001-2014 NList Open Source Team
9 This library is free software; you can redistribute it and/or
10 modify it under the terms of the GNU Lesser General Public
11 License as published by the Free Software Foundation; either
12 version 2.1 of the License, or (at your option) any later version.
14 This library is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 Lesser General Public License for more details.
19 NList classes Support Site: http://www.sf.net/projects/nlist-classes
21 $Id$
23 ***************************************************************************/
25 #include <string.h>
27 #include <exec/memory.h>
28 #include <clib/alib_protos.h>
29 #include <proto/utility.h>
30 #include <proto/exec.h>
32 #include "private.h"
33 #include "version.h"
35 static char *CopyText(char *textin)
37 char *textout = NULL;
39 if (textin)
41 int len = strlen(textin)+1;
43 if((textout = AllocVecShared(len,MEMF_ANY)))
44 strlcpy(textout, textin, len);
47 return (textout);
50 #if !defined(__MORPHOS__)
51 #ifdef __AROS__
52 static __attribute__ ((noinline)) Object * VARARGS68K DoSuperNew(struct IClass *cl, Object *obj, Tag tag1, ...)
54 AROS_SLOWSTACKTAGS_PRE_AS(tag1, Object *)
55 retval = (Object *)DoSuperMethod(cl, obj, OM_NEW, AROS_SLOWSTACKTAGS_ARG(tag1), NULL);
56 AROS_SLOWSTACKTAGS_POST
58 #else
59 static Object * VARARGS68K DoSuperNew(struct IClass *cl, Object *obj, ...)
61 Object *rc;
62 VA_LIST args;
64 ENTER();
66 VA_START(args, obj);
67 rc = (Object *)DoSuperMethod(cl, obj, OM_NEW, VA_ARG(args, ULONG), NULL);
68 VA_END(args);
70 RETURN(rc);
71 return rc;
73 #endif
74 #endif // !__MORPHOS__
76 static IPTR mNFT_New(struct IClass *cl,Object *obj,struct opSet *msg)
78 struct NFTData *data;
79 struct TagItem *tag;
80 LONG Justify = FALSE;
81 LONG Align = ALIGN_LEFT;
82 char *Text = NULL;
83 LONG tagts = MUIA_NList_TypeSelect;
84 LONG tagip = MUIA_NList_Input;
85 LONG Copied = FALSE;
87 if((tag = FindTagItem(MUIA_NFloattext_SkipChars, msg->ops_AttrList)))
88 tag->ti_Tag = MUIA_NList_SkipChars;
89 else if((tag = FindTagItem(MUIA_Floattext_SkipChars, msg->ops_AttrList)))
90 tag->ti_Tag = MUIA_NList_SkipChars;
92 if((tag = FindTagItem(MUIA_NFloattext_TabSize, msg->ops_AttrList)))
93 tag->ti_Tag = MUIA_NList_TabSize;
94 else if((tag = FindTagItem(MUIA_Floattext_TabSize, msg->ops_AttrList)))
95 tag->ti_Tag = MUIA_NList_TabSize;
97 if((tag = FindTagItem(MUIA_NFloattext_Text, msg->ops_AttrList)))
99 Text = (char *) tag->ti_Data;
100 Copied = FALSE;
102 else if((tag = FindTagItem(MUIA_Floattext_Text, msg->ops_AttrList)))
104 Text = (char *) tag->ti_Data;
105 Copied = TRUE;
108 if((tag = FindTagItem(MUIA_NList_TypeSelect, msg->ops_AttrList)))
109 tagts = TAG_IGNORE;
111 if((tag = FindTagItem(MUIA_NList_Input, msg->ops_AttrList)))
113 tagip = TAG_IGNORE;
114 if (tag->ti_Data)
115 tagts = TAG_IGNORE;
118 if ((tag = FindTagItem(MUIA_NFloattext_Justify, msg->ops_AttrList)) ||
119 (tag = FindTagItem(MUIA_Floattext_Justify, msg->ops_AttrList)))
121 if (tag->ti_Data)
123 Justify = TRUE;
124 Align = ALIGN_JUSTIFY;
126 else
128 Justify = FALSE;
129 Align = ALIGN_LEFT;
133 if((tag = FindTagItem(MUIA_NFloattext_Align, msg->ops_AttrList)))
135 data = INST_DATA(cl,obj);
136 data->NFloattext_Align = tag->ti_Data & ALIGN_MASK;
138 if (Align == ALIGN_JUSTIFY)
139 Justify = TRUE;
140 else
141 Justify = FALSE;
144 obj = (Object *) DoSuperNew(cl,obj,
145 tagts, MUIV_NList_TypeSelect_Char,
146 tagip, FALSE,
147 TAG_MORE, msg->ops_AttrList
150 if (obj)
152 data = INST_DATA(cl,obj);
153 data->NFloattext_Justify = Justify;
154 data->NFloattext_Align = Align;
155 data->NFloattext_entry = NULL;
156 data->NFloattext_entry_len = 0;
157 data->NFloattext_Copied = FALSE;
159 if (Copied && Text)
161 data->NFloattext_Text = CopyText(Text);
162 data->NFloattext_Copied = TRUE;
164 else
165 data->NFloattext_Text = Text;
167 if (data->NFloattext_Text)
169 D(DBF_ALWAYS, "inserting text with length %ld '%s'",strlen(data->NFloattext_Text),data->NFloattext_Text);
170 DoMethod(obj,MUIM_NList_InsertWrap,data->NFloattext_Text,-2,MUIV_NList_Insert_Bottom,1,data->NFloattext_Align);
174 return((IPTR) obj);
178 static IPTR mNFT_Dispose(struct IClass *cl,Object *obj,Msg msg)
180 struct NFTData *data;
181 data = INST_DATA(cl,obj);
182 DoMethod(obj,MUIM_NList_Clear,NULL);
183 if (data->NFloattext_Copied && data->NFloattext_Text)
184 FreeVec(data->NFloattext_Text);
185 data->NFloattext_Text = NULL;
186 if (data->NFloattext_entry)
187 FreeVec(data->NFloattext_entry);
188 data->NFloattext_entry = NULL;
190 return(DoSuperMethodA(cl,obj,msg));
194 static IPTR mNFT_Set(struct IClass *cl,Object *obj,Msg msg)
196 struct NFTData *data = INST_DATA(cl,obj);
197 struct TagItem *tags,*tag;
199 for (tags=((struct opSet *)msg)->ops_AttrList;(tag=NextTagItem((APTR)&tags));)
201 switch (tag->ti_Tag)
203 case MUIA_Floattext_Text:
204 case MUIA_NFloattext_Text:
205 DoMethod(obj,MUIM_NList_Clear,NULL);
206 if (data->NFloattext_Copied && data->NFloattext_Text)
207 FreeVec(data->NFloattext_Text);
208 data->NFloattext_Copied = FALSE;
209 if (tag->ti_Tag == MUIA_Floattext_Text)
210 { data->NFloattext_Text = CopyText((char *) tag->ti_Data);
211 data->NFloattext_Copied = TRUE;
213 else
214 data->NFloattext_Text = (char *) tag->ti_Data;
215 if (data->NFloattext_Text)
216 DoMethod(obj,MUIM_NList_InsertWrap,data->NFloattext_Text,-2,MUIV_NList_Insert_Bottom,1,data->NFloattext_Align);
217 break;
218 case MUIA_Floattext_Justify:
219 case MUIA_NFloattext_Justify:
220 if (tag->ti_Data)
221 { data->NFloattext_Justify = TRUE;
222 data->NFloattext_Align = ALIGN_JUSTIFY;
224 else
225 { data->NFloattext_Justify = FALSE;
226 data->NFloattext_Align = ALIGN_LEFT;
228 break;
229 case MUIA_NFloattext_Align:
230 data->NFloattext_Align = tag->ti_Data & ALIGN_MASK;
231 if (data->NFloattext_Align == ALIGN_JUSTIFY)
232 data->NFloattext_Justify = TRUE;
233 else
234 data->NFloattext_Justify = FALSE;
235 break;
236 case MUIA_Floattext_SkipChars :
237 case MUIA_NFloattext_SkipChars :
238 tag->ti_Tag = MUIA_NList_SkipChars;
239 break;
240 case MUIA_Floattext_TabSize :
241 case MUIA_NFloattext_TabSize :
242 tag->ti_Tag = MUIA_NList_TabSize;
243 break;
246 return (DoSuperMethodA(cl,obj,msg));
250 static IPTR mNFT_Get(struct IClass *cl,Object *obj,Msg msg)
252 struct NFTData *data = INST_DATA(cl,obj);
253 IPTR *store = ((struct opGet *)msg)->opg_Storage;
255 switch (((struct opGet *)msg)->opg_AttrID)
257 case MUIA_Floattext_SkipChars:
258 case MUIA_NFloattext_SkipChars:
259 ((struct opGet *)msg)->opg_AttrID = MUIA_NList_SkipChars;
260 break;
261 case MUIA_Floattext_TabSize:
262 case MUIA_NFloattext_TabSize:
263 ((struct opGet *)msg)->opg_AttrID = MUIA_NList_TabSize;
264 break;
265 case MUIA_Floattext_Text:
266 case MUIA_NFloattext_Text:
267 *store = (IPTR) data->NFloattext_Text;
268 return(TRUE);
269 case MUIA_Floattext_Justify:
270 case MUIA_NFloattext_Justify:
271 *store = data->NFloattext_Justify;
272 return(TRUE);
273 case MUIA_NFloattext_Align:
274 *store = data->NFloattext_Align;
275 return(TRUE);
276 case MUIA_Version:
277 *store = LIB_VERSION;
278 return(TRUE);
279 case MUIA_Revision:
280 *store = LIB_REVISION;
281 return(TRUE);
283 return (DoSuperMethodA(cl,obj,msg));
287 static IPTR mNFT_GetEntry(struct IClass *cl,Object *obj,struct MUIP_NFloattext_GetEntry *msg)
289 struct NFTData *data = INST_DATA(cl,obj);
290 struct MUI_NList_GetEntryInfo gei;
291 gei.pos = msg->pos;
292 gei.line = 0;
293 DoMethod(obj, MUIM_NList_GetEntryInfo, &gei);
294 if ((gei.entry_pos >= 0) && gei.entry)
295 { if (gei.wrapcol)
296 { char *entry = gei.entry;
297 if (!data->NFloattext_entry || (data->NFloattext_entry_len < gei.charlen))
298 { if (data->NFloattext_entry)
299 FreeVec(data->NFloattext_entry);
300 data->NFloattext_entry_len = gei.charlen+18;
301 data->NFloattext_entry = (char *) AllocVecShared(gei.charlen+20,MEMF_ANY);
303 if (data->NFloattext_entry)
304 { char *nft_entry = data->NFloattext_entry;
305 CopyMem(&entry[gei.charpos], nft_entry, gei.charlen);
306 nft_entry[gei.charlen] = '\0';
307 *msg->entry = nft_entry;
309 else
310 *msg->entry = &entry[gei.charpos];
312 else
313 *msg->entry = gei.entry;
315 else
316 *msg->entry = NULL;
317 return (TRUE);
321 DISPATCHER(_Dispatcher)
323 switch (msg->MethodID)
325 case OM_NEW : return ( mNFT_New(cl,obj,(APTR)msg));
326 case OM_DISPOSE : return ( mNFT_Dispose(cl,obj,(APTR)msg));
327 case OM_SET : return ( mNFT_Set(cl,obj,(APTR)msg));
328 case OM_GET : return ( mNFT_Get(cl,obj,(APTR)msg));
329 case MUIM_List_GetEntry :
330 case MUIM_NFloattext_GetEntry : return ( mNFT_GetEntry(cl,obj,(APTR)msg));
332 return(DoSuperMethodA(cl,obj,msg));