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
23 ***************************************************************************/
27 #include <exec/memory.h>
28 #include <clib/alib_protos.h>
29 #include <proto/utility.h>
30 #include <proto/exec.h>
35 static char *CopyText(char *textin
)
41 int len
= strlen(textin
)+1;
43 if((textout
= AllocVecShared(len
,MEMF_ANY
)))
44 strlcpy(textout
, textin
, len
);
50 #if !defined(__MORPHOS__)
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
59 static Object
* VARARGS68K
DoSuperNew(struct IClass
*cl
, Object
*obj
, ...)
67 rc
= (Object
*)DoSuperMethod(cl
, obj
, OM_NEW
, VA_ARG(args
, ULONG
), NULL
);
74 #endif // !__MORPHOS__
76 static IPTR
mNFT_New(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
)
81 LONG Align
= ALIGN_LEFT
;
83 LONG tagts
= MUIA_NList_TypeSelect
;
84 LONG tagip
= MUIA_NList_Input
;
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
;
102 else if((tag
= FindTagItem(MUIA_Floattext_Text
, msg
->ops_AttrList
)))
104 Text
= (char *) tag
->ti_Data
;
108 if((tag
= FindTagItem(MUIA_NList_TypeSelect
, msg
->ops_AttrList
)))
111 if((tag
= FindTagItem(MUIA_NList_Input
, msg
->ops_AttrList
)))
118 if ((tag
= FindTagItem(MUIA_NFloattext_Justify
, msg
->ops_AttrList
)) ||
119 (tag
= FindTagItem(MUIA_Floattext_Justify
, msg
->ops_AttrList
)))
124 Align
= ALIGN_JUSTIFY
;
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
)
144 obj
= (Object
*) DoSuperNew(cl
,obj
,
145 tagts
, MUIV_NList_TypeSelect_Char
,
147 TAG_MORE
, msg
->ops_AttrList
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
;
161 data
->NFloattext_Text
= CopyText(Text
);
162 data
->NFloattext_Copied
= TRUE
;
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
);
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
));)
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
;
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
);
218 case MUIA_Floattext_Justify
:
219 case MUIA_NFloattext_Justify
:
221 { data
->NFloattext_Justify
= TRUE
;
222 data
->NFloattext_Align
= ALIGN_JUSTIFY
;
225 { data
->NFloattext_Justify
= FALSE
;
226 data
->NFloattext_Align
= ALIGN_LEFT
;
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
;
234 data
->NFloattext_Justify
= FALSE
;
236 case MUIA_Floattext_SkipChars
:
237 case MUIA_NFloattext_SkipChars
:
238 tag
->ti_Tag
= MUIA_NList_SkipChars
;
240 case MUIA_Floattext_TabSize
:
241 case MUIA_NFloattext_TabSize
:
242 tag
->ti_Tag
= MUIA_NList_TabSize
;
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
;
261 case MUIA_Floattext_TabSize
:
262 case MUIA_NFloattext_TabSize
:
263 ((struct opGet
*)msg
)->opg_AttrID
= MUIA_NList_TabSize
;
265 case MUIA_Floattext_Text
:
266 case MUIA_NFloattext_Text
:
267 *store
= (IPTR
) data
->NFloattext_Text
;
269 case MUIA_Floattext_Justify
:
270 case MUIA_NFloattext_Justify
:
271 *store
= data
->NFloattext_Justify
;
273 case MUIA_NFloattext_Align
:
274 *store
= data
->NFloattext_Align
;
277 *store
= LIB_VERSION
;
280 *store
= LIB_REVISION
;
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
;
293 DoMethod(obj
, MUIM_NList_GetEntryInfo
, &gei
);
294 if ((gei
.entry_pos
>= 0) && gei
.entry
)
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
;
310 *msg
->entry
= &entry
[gei
.charpos
];
313 *msg
->entry
= gei
.entry
;
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
));