2 Copyright © 2002-2003, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
10 #include <graphics/gfx.h>
11 #include <graphics/view.h>
12 #include <graphics/gfxmacros.h>
13 #include <clib/alib_protos.h>
14 #include <proto/exec.h>
15 #include <proto/graphics.h>
16 #include <proto/utility.h>
17 #include <proto/intuition.h>
18 #include <proto/muimaster.h>
23 #include "muimaster_intern.h"
25 #include "textengine.h"
27 #include "support_classes.h"
28 #include "pendisplay_private.h"
30 /* #define MYDEBUG 1 */
33 extern struct Library
*MUIMasterBase
;
36 IPTR
Pendisplay__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
38 struct Pendisplay_DATA
*data
;
42 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
46 data
= INST_DATA(cl
, obj
);
47 /* Format identifies need to be long enforced because of RawDoFmt()
49 snprintf(data
->penspec
.ps_buf
, sizeof(data
->penspec
.ps_buf
), "%lc%d",
50 (int)PST_MUI
, (int)MPEN_TEXT
);
53 /* parse initial taglist */
54 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
58 case MUIA_Pendisplay_Reference
:
59 data
->refobj
= (Object
*) tag
->ti_Data
;
60 DoMethod(data
->refobj
, MUIM_Notify
, MUIA_Pendisplay_Spec
,
61 MUIV_EveryTime
, (IPTR
) obj
, 3, MUIM_Set
,
62 MUIA_Pendisplay_Spec
, MUIV_TriggerValue
);
65 case MUIA_Pendisplay_RGBcolor
:
67 struct MUI_RGBcolor
*rgb
=
68 (struct MUI_RGBcolor
*)tag
->ti_Data
;
69 snprintf(data
->penspec
.ps_buf
, sizeof(data
->penspec
.ps_buf
),
70 "%lc%08x,%08x,%08x", (int)PST_RGB
,
71 (unsigned int)rgb
->red
, (unsigned int)rgb
->green
,
72 (unsigned int)rgb
->blue
);
76 case MUIA_Pendisplay_Spec
:
77 data
->penspec
= *(struct MUI_PenSpec
*)tag
->ti_Data
;
86 IPTR
Pendisplay__OM_DISPOSE(struct IClass
*cl
, Object
*obj
, Msg msg
)
88 struct Pendisplay_DATA
*data
;
90 data
= INST_DATA(cl
, obj
);
93 /* kill notify here? But refobj might already have been killed :-\ */
96 return DoSuperMethodA(cl
, obj
, msg
);
99 IPTR
Pendisplay__OM_SET(struct IClass
*cl
, Object
*obj
,
102 struct Pendisplay_DATA
*data
;
103 struct TagItem
*tags
;
108 data
= INST_DATA(cl
, obj
);
110 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
114 case MUIA_Pendisplay_Reference
:
117 DoMethod(data
->refobj
, MUIM_KillNotifyObj
,
118 MUIA_Pendisplay_Spec
, (IPTR
) obj
);
121 data
->refobj
= (Object
*) tag
->ti_Data
;
125 DoMethod(data
->refobj
, MUIM_Notify
, MUIA_Pendisplay_Spec
,
126 MUIV_EveryTime
, (IPTR
) obj
, 3, MUIM_Set
,
127 MUIA_Pendisplay_Spec
, MUIV_TriggerValue
);
132 case MUIA_Pendisplay_RGBcolor
:
134 struct MUI_RGBcolor
*rgb
=
135 (struct MUI_RGBcolor
*)tag
->ti_Data
;
137 snprintf(data
->penspec
.ps_buf
, sizeof(data
->penspec
.ps_buf
),
138 "%lc%08x,%08x,%08x", (int)PST_RGB
,
139 (unsigned int)rgb
->red
, (unsigned int)rgb
->green
,
140 (unsigned int)rgb
->blue
);
145 case MUIA_Pendisplay_Spec
:
148 data
->penspec
= *(struct MUI_PenSpec
*)tag
->ti_Data
;
157 retval
= DoSuperMethodA(cl
, obj
, (Msg
) msg
);
159 if (newcol
&& (_flags(obj
) & MADF_SETUP
))
163 MUI_ReleasePen(muiRenderInfo(obj
), data
->pen
);
170 MUI_ObtainPen(muiRenderInfo(obj
), &data
->penspec
, 0);
173 MUI_Redraw(obj
, MADF_DRAWUPDATE
);
179 IPTR
Pendisplay__OM_GET(struct IClass
*cl
, Object
*obj
,
182 struct Pendisplay_DATA
*data
= INST_DATA(cl
, obj
);
183 IPTR
*store
= msg
->opg_Storage
;
185 switch (msg
->opg_AttrID
)
187 case MUIA_Pendisplay_Pen
:
188 *store
= (IPTR
) data
->pen
;
191 case MUIA_Pendisplay_Reference
:
192 *store
= (IPTR
) data
->refobj
;
195 case MUIA_Pendisplay_RGBcolor
:
197 // FIXME: MUIA_Pendisplay_RGBColor (only works for RGB pen specs)
198 struct MUI_PenSpec_intern intpenspec
;
199 zune_pen_spec_to_intern(&data
->penspec
, &intpenspec
);
201 switch (intpenspec
.p_type
)
208 data
->rgb
= intpenspec
.p_rgb
;
212 *store
= (IPTR
) & data
->rgb
;
216 case MUIA_Pendisplay_Spec
:
217 *store
= (IPTR
) & data
->penspec
;
221 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
227 IPTR
Pendisplay__MUIM_Setup(struct IClass
*cl
, Object
*obj
,
228 struct MUIP_Setup
*msg
)
230 struct Pendisplay_DATA
*data
= INST_DATA(cl
, obj
);
232 if (!(DoSuperMethodA(cl
, obj
, (Msg
) msg
)))
237 data
->pen
= MUI_ObtainPen(muiRenderInfo(obj
), &data
->penspec
, 0);
243 IPTR
Pendisplay__MUIM_Cleanup(struct IClass
*cl
, Object
*obj
,
244 struct MUIP_Cleanup
*msg
)
246 struct Pendisplay_DATA
*data
= INST_DATA(cl
, obj
);
250 MUI_ReleasePen(muiRenderInfo(obj
), data
->pen
);
254 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
257 IPTR
Pendisplay__MUIM_AskMinMax(struct IClass
*cl
, Object
*obj
,
258 struct MUIP_AskMinMax
*msg
)
260 DoSuperMethodA(cl
, obj
, (Msg
) msg
);
262 msg
->MinMaxInfo
->MinWidth
+= 3;
263 msg
->MinMaxInfo
->MinHeight
+= 3;
264 msg
->MinMaxInfo
->DefWidth
+= 16;
265 msg
->MinMaxInfo
->DefHeight
+= 16;
266 msg
->MinMaxInfo
->MaxWidth
= MUI_MAXMAX
;
267 msg
->MinMaxInfo
->MaxHeight
= MUI_MAXMAX
;
272 IPTR
Pendisplay__MUIM_Draw(struct IClass
*cl
, Object
*obj
,
273 struct MUIP_Draw
*msg
)
275 struct Pendisplay_DATA
*data
= INST_DATA(cl
, obj
);
278 DoSuperMethodA(cl
, obj
, (Msg
) msg
);
280 if (!(msg
->flags
& (MADF_DRAWOBJECT
| MADF_DRAWUPDATE
)))
287 get(data
->refobj
, MUIA_Pendisplay_Pen
, &val
);
297 static UWORD pat
[] = { 0x1111, 0x2222, 0x4444, 0x8888 };
299 SetAfPt(_rp(obj
), pat
, 2);
300 SetABPenDrMd(_rp(obj
), _pens(obj
)[MPEN_SHADOW
],
301 _pens(obj
)[MPEN_BACKGROUND
], JAM2
);
306 SetABPenDrMd(_rp(obj
), MUIPEN(color
), 0, JAM1
);
309 RectFill(_rp(obj
), _mleft(obj
), _mtop(obj
), _mright(obj
),
312 SetAfPt(_rp(obj
), NULL
, 0);
317 IPTR
Pendisplay__MUIM_Pendisplay_SetColormap(struct IClass
*cl
,
318 Object
*obj
, struct MUIP_Pendisplay_SetColormap
*msg
)
320 struct MUI_PenSpec penspec
;
322 snprintf(penspec
.ps_buf
, sizeof(penspec
.ps_buf
), "%lc%d", (int)PST_CMAP
,
324 set(obj
, MUIA_Pendisplay_Spec
, (IPTR
) & penspec
);
329 IPTR
Pendisplay__MUIM_Pendisplay_SetRGB(struct IClass
*cl
, Object
*obj
,
330 struct MUIP_Pendisplay_SetRGB
*msg
)
332 struct MUI_PenSpec penspec
;
334 snprintf(penspec
.ps_buf
, sizeof(penspec
.ps_buf
), "%lc%08x,%08x,%08x",
335 (int)PST_RGB
, (unsigned int)msg
->r
, (unsigned int)msg
->g
,
336 (unsigned int)msg
->b
);
337 set(obj
, MUIA_Pendisplay_Spec
, (IPTR
) & penspec
);
342 IPTR
Pendisplay__MUIM_Pendisplay_SetMUIPen(struct IClass
*cl
, Object
*obj
,
343 struct MUIP_Pendisplay_SetMUIPen
*msg
)
345 struct MUI_PenSpec penspec
;
347 snprintf(penspec
.ps_buf
, sizeof(penspec
.ps_buf
), "%lc%d", (int)PST_MUI
,
349 set(obj
, MUIA_Pendisplay_Spec
, (IPTR
) & penspec
);
354 IPTR
Pendisplay__MUIM_DragQuery(struct IClass
*cl
, Object
*obj
,
355 struct MUIP_DragQuery
*msg
)
360 return MUIV_DragQuery_Refuse
;
362 if (get(msg
->obj
, MUIA_Pendisplay_Spec
, &spec
))
363 return MUIV_DragQuery_Accept
;
365 if (get(msg
->obj
, MUIA_Imagedisplay_Spec
, &spec
))
367 if ((NULL
!= spec
) && (strlen(spec
) > 2) && (spec
[0] == '2')
369 return MUIV_DragQuery_Accept
;
372 return MUIV_DragQuery_Refuse
;
375 IPTR
Pendisplay__MUIM_DragDrop(struct IClass
*cl
, Object
*obj
,
376 struct MUIP_DragDrop
*msg
)
380 if (get(msg
->obj
, MUIA_Pendisplay_Spec
, &spec
))
381 set(obj
, MUIA_Pendisplay_Spec
, spec
);
382 else if (get(msg
->obj
, MUIA_Imagedisplay_Spec
, &spec
))
383 set(obj
, MUIA_Pendisplay_Spec
, spec
+ 2);
387 #if ZUNE_BUILTIN_PENDISPLAY
388 BOOPSI_DISPATCHER(IPTR
, Pendisplay_Dispatcher
, cl
, obj
, msg
)
390 switch (msg
->MethodID
)
393 return Pendisplay__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
395 return Pendisplay__OM_DISPOSE(cl
, obj
, msg
);
397 return Pendisplay__OM_SET(cl
, obj
, (struct opSet
*)msg
);
399 return Pendisplay__OM_GET(cl
, obj
, (struct opGet
*)msg
);
401 return Pendisplay__MUIM_Setup(cl
, obj
, (struct MUIP_Setup
*)msg
);
403 return Pendisplay__MUIM_Cleanup(cl
, obj
,
404 (struct MUIP_Cleanup
*)msg
);
406 return Pendisplay__MUIM_AskMinMax(cl
, obj
,
407 (struct MUIP_AskMinMax
*)msg
);
409 return Pendisplay__MUIM_Draw(cl
, obj
, (struct MUIP_Draw
*)msg
);
410 case MUIM_Pendisplay_SetColormap
:
411 return Pendisplay__MUIM_Pendisplay_SetColormap(cl
, obj
,
412 (struct MUIP_Pendisplay_SetColormap
*)msg
);
413 case MUIM_Pendisplay_SetMUIPen
:
414 return Pendisplay__MUIM_Pendisplay_SetMUIPen(cl
, obj
,
415 (struct MUIP_Pendisplay_SetMUIPen
*)msg
);
416 case MUIM_Pendisplay_SetRGB
:
417 return Pendisplay__MUIM_Pendisplay_SetRGB(cl
, obj
,
418 (struct MUIP_Pendisplay_SetRGB
*)msg
);
420 return Pendisplay__MUIM_DragQuery(cl
, obj
,
421 (struct MUIP_DragQuery
*)msg
);
423 return Pendisplay__MUIM_DragDrop(cl
, obj
,
424 (struct MUIP_DragDrop
*)msg
);
426 return DoSuperMethodA(cl
, obj
, msg
);
429 BOOPSI_DISPATCHER_END
431 const struct __MUIBuiltinClass _MUI_Pendisplay_desc
=
435 sizeof(struct Pendisplay_DATA
),
436 (void *) Pendisplay_Dispatcher
438 #endif /* ZUNE_BUILTIN_PENDISPLAY */