2 Copyright 1999, David Le Corfec.
3 Copyright 2002-2006, The AROS Development Team.
12 #include <exec/types.h>
14 #include <clib/alib_protos.h>
15 #include <proto/exec.h>
16 #include <proto/intuition.h>
17 #include <proto/graphics.h>
18 #include <proto/utility.h>
19 #include <proto/dos.h>
20 #include <proto/muimaster.h>
23 #include "muimaster_intern.h"
25 #include "textengine.h"
27 extern struct Library
*MUIMasterBase
;
37 CONST_STRPTR preparse
;
40 LONG xpixel
; /* needed for cursor up/down movements, can be -1 */
43 struct MUI_EventHandlerNode ehn
;
45 LONG update
; /* type of update: 1 - everything,
46 * 2 - insert char, no scroll */
51 #define MTDF_SETMIN (1<<0)
52 #define MTDF_SETMAX (1<<1)
53 #define MTDF_SETVMAX (1<<2)
54 #define MTDF_HICHAR (1<<3)
55 #define MTDF_HICHARIDX (1<<4)
57 #define MTDF_EDITABLE (1<<5)
58 #define MTDF_MULTILINE (1<<6)
60 #define MTDF_ADVANCEONCR (1<<7)
62 static const int __version
= 1;
63 static const int __revision
= 1;
65 static void setup_text(struct MUI_TextData
*data
, Object
*obj
);
67 /**************************************************************************
69 **************************************************************************/
70 IPTR
Text__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
72 struct MUI_TextData
*data
;
73 struct TagItem
*tags
, *tag
;
75 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
79 data
= INST_DATA(cl
, obj
);
80 data
->mtd_Flags
= MTDF_SETMIN
| MTDF_SETVMAX
;
82 /* parse initial taglist */
84 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
88 case MUIA_Text_Contents
:
90 data
->contents
= StrDup((STRPTR
) tag
->ti_Data
);
93 case MUIA_Text_HiChar
:
94 data
->hichar
= tag
->ti_Data
;
95 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_HICHAR
);
98 case MUIA_Text_HiCharIdx
:
99 data
->hichar
= tag
->ti_Data
;
100 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_HICHARIDX
);
103 case MUIA_Text_PreParse
:
104 data
->preparse
= StrDup((STRPTR
) tag
->ti_Data
);
107 case MUIA_Text_SetMin
:
108 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_SETMIN
);
111 case MUIA_Text_SetMax
:
112 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_SETMAX
);
115 case MUIA_Text_SetVMax
:
116 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_SETVMAX
);
120 case MUIA_Text_Editable
:
121 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_EDITABLE
);
124 case MUIA_Text_Multiline
:
125 _handle_bool_tag(data
->mtd_Flags
, tag
->ti_Data
, MTDF_MULTILINE
);
132 data
->preparse
= StrDup("");
134 data
->contents
= StrDup("");
136 if (!data
->contents
|| !data
->preparse
)
138 CoerceMethod(cl
, obj
, OM_DISPOSE
);
142 /* D(bug("Text_New(0x%lx)\n", obj)); */
144 data
->ehn
.ehn_Events
= IDCMP_MOUSEBUTTONS
;
145 data
->ehn
.ehn_Priority
= 0;
146 data
->ehn
.ehn_Flags
= 0;
147 data
->ehn
.ehn_Object
= obj
;
148 data
->ehn
.ehn_Class
= cl
;
155 /**************************************************************************
157 **************************************************************************/
158 IPTR
Text__OM_DISPOSE(struct IClass
*cl
, Object
*obj
, Msg msg
)
160 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
162 FreeVec(data
->contents
);
163 FreeVec((APTR
) data
->preparse
);
165 return DoSuperMethodA(cl
, obj
, msg
);
168 /**************************************************************************
170 **************************************************************************/
171 IPTR
Text__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
173 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
174 struct TagItem
*tags
= msg
->ops_AttrList
;
177 while ((tag
= NextTagItem(&tags
)) != NULL
)
181 case MUIA_Text_Contents
:
184 StrDup(((char *)tag
->ti_Data
) ? (char *)tag
->
190 zune_text_destroy(data
->ztext
);
193 FreeVec(data
->contents
);
194 data
->contents
= new_contents
;
195 if (_flags(obj
) & MADF_SETUP
)
196 setup_text(data
, obj
);
197 MUI_Redraw(obj
, MADF_DRAWOBJECT
); /* should be optimized */
202 case MUIA_Text_PreParse
:
205 StrDup(((char *)tag
->ti_Data
) ? (char *)tag
->
211 zune_text_destroy(data
->ztext
);
214 FreeVec((APTR
) data
->preparse
);
215 data
->preparse
= new_preparse
;
216 if (_flags(obj
) & MADF_SETUP
)
217 setup_text(data
, obj
);
218 MUI_Redraw(obj
, MADF_DRAWOBJECT
); /* should be optimized */
224 D(bug("Text_Set(%p) : MUIA_Selected val=%ld sss=%d\n", obj
,
225 tag
->ti_Data
, ! !(_flags(obj
) & MADF_SHOWSELSTATE
)));
230 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
234 /**************************************************************************
236 **************************************************************************/
237 IPTR
Text__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
239 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
241 #define STORE *(msg->opg_Storage)
242 switch (msg
->opg_AttrID
)
244 case MUIA_Text_Contents
:
245 STORE
= (IPTR
) data
->contents
;
248 case MUIA_Text_PreParse
:
249 STORE
= (IPTR
) data
->preparse
;
260 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
264 /**************************************************************************
266 **************************************************************************/
267 static void setup_text(struct MUI_TextData
*data
, Object
*obj
)
269 if (data
->mtd_Flags
& MTDF_HICHAR
)
271 data
->ztext
= zune_text_new(data
->preparse
, data
->contents
,
272 ZTEXT_ARG_HICHAR
, data
->hichar
);
274 else if (data
->mtd_Flags
& MTDF_HICHARIDX
)
276 data
->ztext
= zune_text_new(data
->preparse
, data
->contents
,
277 ZTEXT_ARG_HICHARIDX
, data
->hichar
);
281 data
->ztext
= zune_text_new(data
->preparse
, data
->contents
,
284 zune_text_get_bounds(data
->ztext
, obj
);
286 /* D(bug("muimaster.library/text.c: ZText of 0x%lx at 0x%lx\n", */
287 /* obj, data->ztext)); */
290 /**************************************************************************
292 **************************************************************************/
293 IPTR
Text__MUIM_Setup(struct IClass
*cl
, Object
*obj
,
294 struct MUIP_Setup
*msg
)
296 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
298 if (!(DoSuperMethodA(cl
, obj
, (Msg
) msg
)))
301 setup_text(data
, obj
);
303 DoMethod(_win(obj
), MUIM_Window_AddEventHandler
, (IPTR
) & data
->ehn
);
307 /**************************************************************************
309 **************************************************************************/
310 IPTR
Text__MUIM_Cleanup(struct IClass
*cl
, Object
*obj
,
311 struct MUIP_Cleanup
*msg
)
313 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
315 DoMethod(_win(obj
), MUIM_Window_RemEventHandler
, (IPTR
) & data
->ehn
);
319 zune_text_destroy(data
->ztext
);
323 return (DoSuperMethodA(cl
, obj
, (Msg
) msg
));
326 /**************************************************************************
328 **************************************************************************/
329 IPTR
Text__MUIM_Show(struct IClass
*cl
, Object
*obj
,
330 struct MUIP_Show
*msg
)
332 //struct MUI_TextData *data = INST_DATA(cl, obj);
334 if (!(DoSuperMethodA(cl
, obj
, (Msg
) msg
)))
340 /**************************************************************************
342 **************************************************************************/
343 IPTR
Text__MUIM_Hide(struct IClass
*cl
, Object
*obj
,
344 struct MUIP_Hide
*msg
)
346 //struct MUI_TextData *data = INST_DATA(cl, obj);
347 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
350 /**************************************************************************
352 **************************************************************************/
353 IPTR
Text__MUIM_AskMinMax(struct IClass
*cl
, Object
*obj
,
354 struct MUIP_AskMinMax
*msg
)
357 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
359 DoSuperMethodA(cl
, obj
, (Msg
) msg
);
361 height
= data
->ztext
->height
;
362 if (_font(obj
)->tf_YSize
> height
)
363 height
= _font(obj
)->tf_YSize
;
364 /* D(bug("YSize=%ld\n", _font(obj)->tf_YSize)); */
367 if (!(data
->mtd_Flags
& MTDF_EDITABLE
))
370 msg
->MinMaxInfo
->MinWidth
+= data
->ztext
->width
;
371 msg
->MinMaxInfo
->DefWidth
+= data
->ztext
->width
;
372 msg
->MinMaxInfo
->MaxWidth
+= data
->ztext
->width
;
377 msg
->MinMaxInfo
->MinWidth
+= _font(obj
)->tf_XSize
* 4;
378 msg
->MinMaxInfo
->DefWidth
+= _font(obj
)->tf_XSize
* 12;
379 msg
->MinMaxInfo
->MaxWidth
+= MUI_MAXMAX
;
384 if (!(data
->mtd_Flags
& MTDF_MULTILINE
))
387 msg
->MinMaxInfo
->MinHeight
+= height
;
388 msg
->MinMaxInfo
->DefHeight
+= height
;
389 if (!(data
->mtd_Flags
& MTDF_SETVMAX
))
390 msg
->MinMaxInfo
->MaxHeight
+= MUI_MAXMAX
;
392 msg
->MinMaxInfo
->MaxHeight
+= height
;
397 msg
->MinMaxInfo
->MinHeight
+= _font(obj
)->tf_YSize
;
398 msg
->MinMaxInfo
->DefHeight
+= _font(obj
)->tf_YSize
* 10;
399 msg
->MinMaxInfo
->MaxHeight
+= MUI_MAXMAX
;
403 if (!(data
->mtd_Flags
& MTDF_SETMAX
))
404 msg
->MinMaxInfo
->MaxWidth
= MUI_MAXMAX
;
406 if (!(data
->mtd_Flags
& MTDF_SETMIN
))
407 msg
->MinMaxInfo
->MinWidth
= 0;
410 ("Text_AskMinMax 0x%lx (%s): Min=%ldx%ld Max=%ldx%ld Def=%ldx%ld\n",
411 obj
, data
->contents
, msg
->MinMaxInfo
->MinWidth
,
412 msg
->MinMaxInfo
->MinHeight
, msg
->MinMaxInfo
->MaxWidth
,
413 msg
->MinMaxInfo
->MaxHeight
, msg
->MinMaxInfo
->DefWidth
,
414 msg
->MinMaxInfo
->DefHeight
));
419 /**************************************************************************
421 **************************************************************************/
422 IPTR
Text__MUIM_Draw(struct IClass
*cl
, Object
*obj
,
423 struct MUIP_Draw
*msg
)
425 struct MUI_TextData
*data
= INST_DATA(cl
, obj
);
429 /* D(bug("muimaster.library/text.c: Draw Text Object at " */
430 /* "0x%lx %ldx%ldx%ldx%ld\n", obj, _left(obj), _top(obj), */
431 /* _right(obj), _bottom(obj))); */
433 DoSuperMethodA(cl
, obj
, (Msg
) msg
);
435 if ((msg
->flags
& MADF_DRAWUPDATE
) && !data
->update
)
438 if (!(msg
->flags
& MADF_DRAWUPDATE
))
441 if (msg
->flags
& MADF_DRAWUPDATE
&& data
->update
== 1)
443 DoMethod(obj
, MUIM_DrawBackground
, _mleft(obj
), _mtop(obj
),
444 _mwidth(obj
), _mheight(obj
), _mleft(obj
), _mtop(obj
), 0);
447 clip
= MUI_AddClipping(muiRenderInfo(obj
), _mleft(obj
), _mtop(obj
),
448 _mwidth(obj
), _mheight(obj
));
450 SetAPen(_rp(obj
), _pens(obj
)[MPEN_TEXT
]);
453 get(_win(obj
), MUIA_Window_ActiveObject
, &act
);
455 int y
= (_mheight(obj
) - data
->ztext
->height
) / 2;
456 zune_text_draw(data
->ztext
, obj
,
457 _mleft(obj
), _mright(obj
), _mtop(obj
) + y
);
461 MUI_RemoveClipping(muiRenderInfo(obj
), clip
);
466 /**************************************************************************
467 MUIM_Export : to export an objects "contents" to a dataspace object.
468 **************************************************************************/
469 IPTR
Text__MUIM_Export(struct IClass
*cl
, Object
*obj
,
470 struct MUIP_Export
*msg
)
472 //struct MUI_TextData *data = INST_DATA(cl, obj);
476 if ((id
= muiNotifyData(obj
)->mnd_ObjectID
))
478 DoMethod(msg
->dataspace
, MUIM_Dataspace_AddString
,
479 _U(id
), _U("contents"), _U(data
->contents
));
486 /**************************************************************************
487 MUIM_Import : to import an objects "contents" from a dataspace object.
488 **************************************************************************/
489 IPTR
Text__MUIM_Import(struct IClass
*cl
, Object
*obj
,
490 struct MUIP_Import
*msg
)
496 if ((id
= muiNotifyData(obj
)->mnd_ObjectID
))
498 if ((s
= (STRPTR
) DoMethod(msg
->dataspace
,
499 MUIM_Dataspace_FindString
, _U(id
), _U("contents"))))
501 set(obj
, MUIA_Text_Contents
, _U(s
));
509 BOOPSI_DISPATCHER(IPTR
, Text_Dispatcher
, cl
, obj
, msg
)
511 switch (msg
->MethodID
)
514 return Text__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
516 return Text__OM_DISPOSE(cl
, obj
, msg
);
518 return Text__OM_SET(cl
, obj
, (struct opSet
*)msg
);
520 return Text__OM_GET(cl
, obj
, (struct opGet
*)msg
);
523 return Text__MUIM_AskMinMax(cl
, obj
, (APTR
) msg
);
525 return Text__MUIM_Draw(cl
, obj
, (APTR
) msg
);
527 return Text__MUIM_Setup(cl
, obj
, (APTR
) msg
);
529 return Text__MUIM_Cleanup(cl
, obj
, (APTR
) msg
);
531 return Text__MUIM_Show(cl
, obj
, (APTR
) msg
);
533 return Text__MUIM_Hide(cl
, obj
, (APTR
) msg
);
535 return Text__MUIM_Export(cl
, obj
, (APTR
) msg
);
537 return Text__MUIM_Import(cl
, obj
, (APTR
) msg
);
540 return DoSuperMethodA(cl
, obj
, msg
);
542 BOOPSI_DISPATCHER_END
547 const struct __MUIBuiltinClass _MUI_Text_desc
=
551 sizeof(struct MUI_TextData
),
552 (void *) Text_Dispatcher