Updated to latest source.
[AROS-Contrib.git] / bgui / separatorclass.c
bloba5fd50f441f676d7b88bc354eb33c5c03a22fa2a
1 /*
2 * @(#) $Header$
4 * BGUI library
5 * separatorclass.c
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.
13 * $Log$
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
36 * Bumping to 41.10
38 * Revision 1.1 1998/02/25 17:09:44 mlemos
39 * Ian sources
44 /// Class definitions.
46 #include "include/classdefs.h"
49 * Object Instance data.
51 typedef struct {
52 ULONG sd_Flags; /* See below. */
53 Object *sd_Title; /* Separator title. */
54 UWORD sd_Place; /* Position. */
55 } SD;
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. */
63 ///
64 /// OM_NEW
66 * Create a shiny new object.
68 METHOD(SepClassNew, struct opSet *, ops)
70 ULONG rc;
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);
79 return rc;
81 METHOD_END
82 ///
83 /// OM_DISPOSE
85 * Dispose of this.
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);
95 METHOD_END
96 ///
97 /// OM_SET
99 * Set.
101 METHOD(SepClassSet, struct opSet *, ops)
103 SD *sd = INST_DATA(cl, obj);
104 struct TagItem *tag, *tstate = ops->ops_AttrList;
105 ULONG rc, data;
107 rc = AsmDoSuperMethodA(cl, obj, (Msg)ops);
109 while (tag = NextTagItem(&tstate))
111 data = tag->ti_Data;
112 switch (tag->ti_Tag)
114 case FRM_ThinFrame:
115 case SEP_Thin:
117 * Pickup thin lines.
119 if (data) sd->sd_Flags |= SDF_THIN;
120 else sd->sd_Flags &= ~SDF_THIN;
121 break;
123 case SEP_CenterTitle:
124 if (data) sd->sd_Flags |= SDF_CENTER;
125 else sd->sd_Flags &= ~SDF_CENTER;
126 break;
128 case SEP_Horiz:
129 if (data) sd->sd_Flags |= SDF_HORIZONTAL;
130 else sd->sd_Flags &= ~SDF_HORIZONTAL;
131 break;
133 case SEP_Highlight:
134 if (data) sd->sd_Flags |= SDF_HIGHLIGHT;
135 else sd->sd_Flags &= ~SDF_HIGHLIGHT;
136 break;
138 case SEP_Recessed:
139 if (data) sd->sd_Flags |= SDF_RECESSED;
140 else sd->sd_Flags &= ~SDF_RECESSED;
141 break;
143 case SEP_TitleLeft:
144 if (data) sd->sd_Place = 1;
145 else sd->sd_Place = 0;
146 break;
148 case SEP_TitleRight:
149 if (data) sd->sd_Place = 2;
150 else sd->sd_Place = 0;
151 break;
153 case SEP_Title:
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);
156 break;
158 case SEP_TitleID:
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);
161 break;
164 return rc;
166 METHOD_END
168 /// BASE_RENDER
170 * Render.
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;
178 int l, t, w, h, s;
179 BOOL recessed;
182 * Render the baseclass.
184 AsmDoSuperMethodA(cl, obj, (Msg)bmr);
187 * Get left and top.
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;
197 * Only a single pen.
199 BSetDrMd(bi, JAM1);
202 * Horizontal?
204 if (sd->sd_Flags & SDF_HORIZONTAL)
207 * Shiny side.
209 BSetDPenA(bi, recessed ? SHADOWPEN : SHINEPEN);
212 * Center it in the given space?
214 if (sd->sd_Title)
216 if (sd->sd_Flags & SDF_CENTER) t += h >> 1;
217 else t += h - (rp->TxHeight - rp->TxBaseline);
221 * Move to the correct location.
223 Move(rp, l, t);
224 Draw(rp, l + w - 2, t);
225 WritePixel(rp, l, t + 1);
228 * Shadow side.
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);
240 * Title?
242 if (sd->sd_Title)
245 * Set font if necessary.
247 if (bc->bc_TextFont) BSetFont(bi, bc->bc_TextFont);
250 * Render the title.
252 RenderTitle(sd->sd_Title, bi, l, t, w,
253 sd->sd_Flags & SDF_HIGHLIGHT, sd->sd_Flags & SDF_CENTER, sd->sd_Place);
256 else
259 * Shiny side.
261 BSetDPenA(bi, recessed ? SHADOWPEN : SHINEPEN);
264 * Thin or thick.
266 s = sd->sd_Flags & SDF_THIN ? 1 : 2;
269 * Pick position.
271 l += (w >> 1) - s;
274 * Render shiny side.
276 Move(rp, l, t);
277 Draw(rp, l, t + h - 1);
280 * Thick?
282 if (!(sd->sd_Flags & SDF_THIN))
284 Draw(rp, l + 1, t + h - 1);
285 Draw(rp, l + 1, t);
286 Draw(rp, l + 3, t);
288 else
290 Move(rp, l, t);
291 Draw(rp, l + 1, t);
295 * Shadow side.
297 BSetDPenA(bi, recessed ? SHINEPEN : SHADOWPEN);
300 * Render.
302 Move(rp, l + s, t + 1);
303 Draw(rp, l + s, t + h - 1);
306 * Thick?
308 if (!(sd->sd_Flags & SDF_THIN))
310 s++;
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);
316 else
317 Draw(rp, l, t + h - 1);
319 return 1;
321 METHOD_END
323 /// GM_HITTEST
325 * Hit test.
327 METHOD(SepClassHitTest, Msg, msg)
329 return 0;
331 METHOD_END
333 /// BASE_DIMENSIONS
335 * Dimensions.
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);
342 int mx, my;
345 * Minimum width.
347 if (sd->sd_Flags & SDF_HORIZONTAL)
350 * Do we have a font?
352 if (bc->bc_TextFont && sd->sd_Title)
353 BSetFont(bi, bc->bc_TextFont);
355 mx = 2;
357 if (sd->sd_Title) my = bi->bi_RPort->TxHeight;
358 else my = 2;
360 else
362 mx = sd->sd_Flags & SDF_THIN ? 2 : 4;
363 my = 2;
365 return CalcDimensions(cl, obj, bmd, mx, my);
367 METHOD_END
369 /// BASE_LOCALIZE
371 METHOD(SepClassLocalize, struct bmLocalize *, bml)
373 SD *sd = INST_DATA(cl, obj);
374 ULONG rc = 0;
376 if (sd->sd_Title) rc = AsmDoMethodA(sd->sd_Title, (Msg)bml);
378 return rc;
380 METHOD_END
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,
394 DF_END, NULL
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,
405 TAG_DONE);