First checkin, AXE release 0.2
[AXE.git] / src / frame.cpp
1
2 /**************************************************************************
3 **  (c) Copyright 1998, Andromeda Technology & Automation
4 ***************************************************************************
5 ** MODULE INFORMATION *
6 ***********************
7 **      FILE NAME      : frame.cpp
8 **      SYSTEM NAME    : AXE - Andromeda X-windows Encapsulation
9 **      VERSION NUMBER : $Revision: 1.1 $
10 **
11 **  DESCRIPTION      :  Implementation of class frame
12 **
13 **  EXPORTED OBJECTS : 
14 **  LOCAL    OBJECTS : 
15 **  MODULES  USED    :
16 ***************************************************************************
17 **  ADMINISTRATIVE INFORMATION *
18 ********************************
19 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
20 **      CREATION DATE   : Mar 07, 1998
21 **      LAST UPDATE     : Mar 07, 1998
22 **      MODIFICATIONS   : 
23 **************************************************************************/
24
25 /*****************************
26    $Log: frame.cpp,v $
27    Revision 1.1  2002-07-25 08:01:27  arjen
28    First checkin, AXE release 0.2
29
30 *****************************/
31
32 static const char *RCSID = "$Id: frame.cpp,v 1.1 2002-07-25 08:01:27 arjen Exp $";
33
34 #include "frame.h"
35
36 /*=========================================================================
37 **  NAME           : EV_Expose - Handle Expose event.
38 **  SYNOPSIS       :
39 **  PARAMETERS     :
40 **  RETURN VALUE   :
41 **
42 **  DESCRIPTION    : 
43 **
44 **  VARS USED      :
45 **  VARS CHANGED   :
46 **  FUNCTIONS USED :
47 **  SEE ALSO       :
48 **  LAST MODIFIED  : 
49 **=========================================================================
50 */
51
52 int  frame::EV_Expose(XExposeEvent ev)
53 {
54    draw_effect();
55    place_text();
56    redraw();
57    return 1;
58 }
59
60 /*=========================================================================
61 **  NAME           : draw_effect - Draw the border effects in a frame
62 **  SYNOPSIS       :
63 **  PARAMETERS     :
64 **  RETURN VALUE   :
65 **
66 **  DESCRIPTION    : 
67 **
68 **  VARS USED      :
69 **  VARS CHANGED   :
70 **  FUNCTIONS USED :
71 **  SEE ALSO       :
72 **  LAST MODIFIED  : 
73 **=========================================================================
74 */
75
76 void frame::draw_effect(void)
77 {
78    gc  *top_gc, *bottom_gc;
79
80    unsigned w, h;
81    int      thick;
82
83    if (strength > 0)
84    {
85       top_gc = &light_3D_gc;
86       bottom_gc = &dark_3D_gc;
87       thick = strength;
88    }
89    else
90    {
91       top_gc = &dark_3D_gc;
92       bottom_gc = &light_3D_gc;
93       thick = -strength;
94    }
95
96    Size(w, h);
97    for (int i=0; i< thick; i++)
98    {
99       XDrawLine(stddpy, ID(), *top_gc, i, i, i, h-i);
100       XDrawLine(stddpy, ID(), *top_gc, i, i, w-i, i);
101
102       XDrawLine(stddpy, ID(), *bottom_gc, i, h-i, w-i, h-i);
103       XDrawLine(stddpy, ID(), *bottom_gc, w-i, i, w-i, h-i);
104    }
105
106 }
107
108
109 /*=========================================================================
110 **  NAME           : place_text - Place aligned text in a frame
111 **  SYNOPSIS       :
112 **  PARAMETERS     :
113 **  RETURN VALUE   :
114 **
115 **  DESCRIPTION    : 
116 **
117 **  VARS USED      :
118 **  VARS CHANGED   :
119 **  FUNCTIONS USED :
120 **  SEE ALSO       :
121 **  LAST MODIFIED  : 
122 **=========================================================================
123 */
124
125 void frame::place_text(void)
126 {
127    int  x, y;
128    unsigned w, h;
129
130    if (text && text[0])
131    {
132       Size(w, h);
133       switch (halign)
134       {
135       case Left:
136          x = strength;
137          break;
138
139       case Center:
140          x = (w - default_font.TextWidth(text)) / 2;
141          break;
142
143       case Right:
144          x = w - default_font.TextWidth(text) - strength;
145          break;
146
147       }
148
149       switch (valign)
150       {
151          int  space;
152
153       case Top:
154          y = default_font.ascent() + strength;
155          break;
156
157       case Middle:
158          space = (h - (default_font.ascent() + default_font.descent())) / 2;
159          y = space + default_font.ascent();
160          break;
161
162       case Bottom:
163          y = h - default_font.descent() - strength;
164          break;
165
166       }
167
168       XDrawString(stddpy, ID(), menu_normal_gc, x, y, text, strlen(text));
169    }
170 }
171