7 * (C) Copyright 1998 Manuel Lemos.
8 * (C) Copyright 1996-1997 Ian J. Einman.
9 * (C) Copyright 1993-1996 Jaba Development.
10 * (C) Copyright 1993-1996 Jan van den Baard.
11 * All Rights Reserved.
14 * Revision 42.3 2004/06/16 20:16:48 verhaegs
15 * Use METHODPROTO, METHOD_END and REGFUNCPROTOn where needed.
17 * Revision 42.2 2000/08/17 15:09:18 chodorowski
18 * Fixed compiler warnings.
20 * Revision 42.1 2000/05/15 19:27:02 stegerg
21 * another hundreds of REG() macro replacements in func headers/protos.
23 * Revision 42.0 2000/05/09 22:10:11 mlemos
24 * Bumped to revision 42.0 before handing BGUI to AROS team
26 * Revision 41.11 2000/05/09 19:55:05 mlemos
27 * Merged with the branch Manuel_Lemos_fixes.
29 * Revision 41.10.2.2 1999/07/28 23:18:15 mlemos
30 * Fixed superclass call to dispose the objects.
32 * Revision 41.10.2.1 1998/11/23 14:59:51 mlemos
33 * Removed needless OM_GET method code.
35 * Revision 41.10 1998/02/25 21:13:06 mlemos
38 * Revision 1.1 1998/02/25 17:09:44 mlemos
44 /// Class definitions.
46 #include "include/classdefs.h"
49 * Object Instance data.
52 ULONG sd_Flags
; /* See below. */
53 Object
*sd_Title
; /* Separator title. */
54 UWORD sd_Place
; /* Position. */
57 #define SDF_THIN (1<<0) /* Thin lines. */
58 #define SDF_HIGHLIGHT (1<<1) /* Highlight title. */
59 #define SDF_HORIZONTAL (1<<2) /* Horizontal separator.*/
60 #define SDF_CENTER (1<<3) /* Center title. */
61 #define SDF_RECESSED (1<<4) /* Recess lines. */
66 * Create a shiny new object.
68 METHOD(SepClassNew
, struct opSet
*, ops
)
73 * Let the superclass create an object.
75 if (rc
= AsmDoSuperMethodA(cl
, obj
, (Msg
)ops
))
77 AsmCoerceMethod(cl
, (Object
*)rc
, OM_SET
, ops
->ops_AttrList
, NULL
);
87 METHOD(SepClassDispose
, Msg
, msg
)
89 SD
*sd
= INST_DATA(cl
, obj
);
91 if (sd
->sd_Title
) DisposeObject(sd
->sd_Title
);
93 return AsmDoSuperMethodA(cl
, obj
, msg
);
101 METHOD(SepClassSet
, struct opSet
*, ops
)
103 SD
*sd
= INST_DATA(cl
, obj
);
104 struct TagItem
*tag
, *tstate
= ops
->ops_AttrList
;
107 rc
= AsmDoSuperMethodA(cl
, obj
, (Msg
)ops
);
109 while (tag
= NextTagItem(&tstate
))
119 if (data
) sd
->sd_Flags
|= SDF_THIN
;
120 else sd
->sd_Flags
&= ~SDF_THIN
;
123 case SEP_CenterTitle
:
124 if (data
) sd
->sd_Flags
|= SDF_CENTER
;
125 else sd
->sd_Flags
&= ~SDF_CENTER
;
129 if (data
) sd
->sd_Flags
|= SDF_HORIZONTAL
;
130 else sd
->sd_Flags
&= ~SDF_HORIZONTAL
;
134 if (data
) sd
->sd_Flags
|= SDF_HIGHLIGHT
;
135 else sd
->sd_Flags
&= ~SDF_HIGHLIGHT
;
139 if (data
) sd
->sd_Flags
|= SDF_RECESSED
;
140 else sd
->sd_Flags
&= ~SDF_RECESSED
;
144 if (data
) sd
->sd_Place
= 1;
145 else sd
->sd_Place
= 0;
149 if (data
) sd
->sd_Place
= 2;
150 else sd
->sd_Place
= 0;
154 if (!sd
->sd_Title
) sd
->sd_Title
= BGUI_NewObject(BGUI_TEXT_GRAPHIC
, TEXTA_CopyText
, TRUE
, TAG_DONE
);
155 if (sd
->sd_Title
) DoSetMethodNG(sd
->sd_Title
, TEXTA_Text
, data
, TAG_DONE
);
159 if (!sd
->sd_Title
) sd
->sd_Title
= BGUI_NewObject(BGUI_TEXT_GRAPHIC
, TEXTA_CopyText
, TRUE
, TAG_DONE
);
160 if (sd
->sd_Title
) DoSetMethodNG(sd
->sd_Title
, TEXTA_TextID
, data
, TAG_DONE
);
172 METHOD(SepClassRender
, struct bmRender
*, bmr
)
174 SD
*sd
= INST_DATA(cl
, obj
);
175 BC
*bc
= BASE_DATA(obj
);
176 struct BaseInfo
*bi
= bmr
->bmr_BInfo
;
177 struct RastPort
*rp
= bi
->bi_RPort
;
182 * Render the baseclass.
184 AsmDoSuperMethodA(cl
, obj
, (Msg
)bmr
);
189 l
= bc
->bc_OuterBox
.Left
;
190 t
= bc
->bc_OuterBox
.Top
;
191 w
= bc
->bc_OuterBox
.Width
;
192 h
= bc
->bc_OuterBox
.Height
;
194 recessed
= sd
->sd_Flags
& SDF_RECESSED
;
204 if (sd
->sd_Flags
& SDF_HORIZONTAL
)
209 BSetDPenA(bi
, recessed
? SHADOWPEN
: SHINEPEN
);
212 * Center it in the given space?
216 if (sd
->sd_Flags
& SDF_CENTER
) t
+= h
>> 1;
217 else t
+= h
- (rp
->TxHeight
- rp
->TxBaseline
);
221 * Move to the correct location.
224 Draw(rp
, l
+ w
- 2, t
);
225 WritePixel(rp
, l
, t
+ 1);
230 BSetDPenA(bi
, recessed
? SHINEPEN
: SHADOWPEN
);
233 * Move to the correct location.
235 Move(rp
, l
+ 1, t
+ 1);
236 Draw(rp
, l
+ w
- 1, t
+ 1);
237 WritePixel(rp
, l
+ w
- 1, t
);
245 * Set font if necessary.
247 if (bc
->bc_TextFont
) BSetFont(bi
, bc
->bc_TextFont
);
252 RenderTitle(sd
->sd_Title
, bi
, l
, t
, w
,
253 sd
->sd_Flags
& SDF_HIGHLIGHT
, sd
->sd_Flags
& SDF_CENTER
, sd
->sd_Place
);
261 BSetDPenA(bi
, recessed
? SHADOWPEN
: SHINEPEN
);
266 s
= sd
->sd_Flags
& SDF_THIN
? 1 : 2;
277 Draw(rp
, l
, t
+ h
- 1);
282 if (!(sd
->sd_Flags
& SDF_THIN
))
284 Draw(rp
, l
+ 1, t
+ h
- 1);
297 BSetDPenA(bi
, recessed
? SHINEPEN
: SHADOWPEN
);
302 Move(rp
, l
+ s
, t
+ 1);
303 Draw(rp
, l
+ s
, t
+ h
- 1);
308 if (!(sd
->sd_Flags
& SDF_THIN
))
311 Draw(rp
, l
+ s
, t
+ h
- 1);
312 Draw(rp
, l
+ s
, t
+ 1);
313 Move(rp
, l
, t
+ h
- 1);
314 Draw(rp
, l
+ s
, t
+ h
- 1);
317 Draw(rp
, l
, t
+ h
- 1);
327 METHOD(SepClassHitTest
, Msg
, msg
)
337 METHOD(SepClassDimensions
, struct bmDimensions
*, bmd
)
339 SD
*sd
= INST_DATA(cl
, obj
);
340 struct BaseInfo
*bi
= bmd
->bmd_BInfo
;
341 BC
*bc
= BASE_DATA(obj
);
347 if (sd
->sd_Flags
& SDF_HORIZONTAL
)
352 if (bc
->bc_TextFont
&& sd
->sd_Title
)
353 BSetFont(bi
, bc
->bc_TextFont
);
357 if (sd
->sd_Title
) my
= bi
->bi_RPort
->TxHeight
;
362 mx
= sd
->sd_Flags
& SDF_THIN
? 2 : 4;
365 return CalcDimensions(cl
, obj
, bmd
, mx
, my
);
371 METHOD(SepClassLocalize
, struct bmLocalize
*, bml
)
373 SD
*sd
= INST_DATA(cl
, obj
);
376 if (sd
->sd_Title
) rc
= AsmDoMethodA(sd
->sd_Title
, (Msg
)bml
);
382 /// Class initialization.
384 * Class function table.
386 STATIC DPFUNC ClassFunc
[] = {
387 BASE_RENDER
, (FUNCPTR
)SepClassRender
,
388 GM_HITTEST
, (FUNCPTR
)SepClassHitTest
,
389 BASE_DIMENSIONS
, (FUNCPTR
)SepClassDimensions
,
390 OM_NEW
, (FUNCPTR
)SepClassNew
,
391 OM_DISPOSE
, (FUNCPTR
)SepClassDispose
,
392 OM_SET
, (FUNCPTR
)SepClassSet
,
393 BASE_LOCALIZE
, (FUNCPTR
)SepClassLocalize
,
398 * Initialize the separator class.
400 makeproto Class
*InitSepClass(void)
402 return BGUI_MakeClass(CLASS_SuperClassBGUI
, BGUI_BASE_GADGET
,
403 CLASS_ObjectSize
, sizeof(SD
),
404 CLASS_DFTable
, ClassFunc
,