- added WMGetLabelText()
[wmaker-crm.git] / WINGs / wlabel.c
blobb6d30b8e05fb92df7e5997f70aa50f6ca131eb44
5 #include "WINGsP.h"
9 typedef struct W_Label {
10 W_Class widgetClass;
11 W_View *view;
13 char *caption;
15 WMColor *textColor;
16 WMFont *font; /* if NULL, use default */
18 W_Pixmap *image;
20 struct {
21 WMReliefType relief:3;
22 WMImagePosition imagePosition:4;
23 WMAlignment alignment:2;
25 unsigned int noWrap:1;
27 unsigned int redrawPending:1;
28 } flags;
29 } Label;
32 #define DEFAULT_WIDTH 60
33 #define DEFAULT_HEIGHT 14
34 #define DEFAULT_ALIGNMENT WALeft
35 #define DEFAULT_RELIEF WRFlat
36 #define DEFAULT_IMAGE_POSITION WIPNoImage
39 static void destroyLabel(Label *lPtr);
40 static void paintLabel(Label *lPtr);
43 static void handleEvents(XEvent *event, void *data);
46 WMLabel*
47 WMCreateLabel(WMWidget *parent)
49 Label *lPtr;
51 lPtr = wmalloc(sizeof(Label));
52 memset(lPtr, 0, sizeof(Label));
54 lPtr->widgetClass = WC_Label;
56 lPtr->view = W_CreateView(W_VIEW(parent));
57 if (!lPtr->view) {
58 wfree(lPtr);
59 return NULL;
61 lPtr->view->self = lPtr;
63 lPtr->textColor = WMRetainColor(lPtr->view->screen->black);
65 WMCreateEventHandler(lPtr->view, ExposureMask|StructureNotifyMask,
66 handleEvents, lPtr);
68 W_ResizeView(lPtr->view, DEFAULT_WIDTH, DEFAULT_HEIGHT);
69 lPtr->flags.alignment = DEFAULT_ALIGNMENT;
70 lPtr->flags.relief = DEFAULT_RELIEF;
71 lPtr->flags.imagePosition = DEFAULT_IMAGE_POSITION;
73 return lPtr;
77 void
78 WMSetLabelImage(WMLabel *lPtr, WMPixmap *image)
80 if (lPtr->image!=NULL)
81 WMReleasePixmap(lPtr->image);
83 if (image)
84 lPtr->image = WMRetainPixmap(image);
85 else
86 lPtr->image = NULL;
88 if (lPtr->view->flags.realized) {
89 paintLabel(lPtr);
94 WMPixmap*
95 WMGetLabelImage(WMLabel *lPtr)
97 return lPtr->image;
101 char *
102 WMGetLabelText(WMLabel *lPtr)
104 return lPtr->caption;
108 void
109 WMSetLabelImagePosition(WMLabel *lPtr, WMImagePosition position)
111 lPtr->flags.imagePosition = position;
112 if (lPtr->view->flags.realized) {
113 paintLabel(lPtr);
118 void
119 WMSetLabelTextAlignment(WMLabel *lPtr, WMAlignment alignment)
121 lPtr->flags.alignment = alignment;
122 if (lPtr->view->flags.realized) {
123 paintLabel(lPtr);
128 void
129 WMSetLabelRelief(WMLabel *lPtr, WMReliefType relief)
131 lPtr->flags.relief = relief;
132 if (lPtr->view->flags.realized) {
133 paintLabel(lPtr);
138 void
139 WMSetLabelText(WMLabel *lPtr, char *text)
141 if (lPtr->caption)
142 wfree(lPtr->caption);
144 if (text!=NULL) {
145 lPtr->caption = wstrdup(text);
146 } else {
147 lPtr->caption = NULL;
149 if (lPtr->view->flags.realized) {
150 paintLabel(lPtr);
155 void
156 WMSetLabelFont(WMLabel *lPtr, WMFont *font)
158 if (lPtr->font!=NULL)
159 WMReleaseFont(lPtr->font);
160 if (font)
161 lPtr->font = WMRetainFont(font);
162 else
163 lPtr->font = NULL;
165 if (lPtr->view->flags.realized) {
166 paintLabel(lPtr);
171 void
172 WMSetLabelTextColor(WMLabel *lPtr, WMColor *color)
174 if (lPtr->textColor)
175 WMReleaseColor(lPtr->textColor);
176 lPtr->textColor = WMRetainColor(color);
178 if (lPtr->view->flags.realized) {
179 paintLabel(lPtr);
184 void
185 WMSetLabelWraps(WMLabel *lPtr, Bool flag)
187 if (lPtr->flags.noWrap != !flag) {
188 lPtr->flags.noWrap = !flag;
189 if (lPtr->view->flags.realized)
190 paintLabel(lPtr);
195 static void
196 paintLabel(Label *lPtr)
198 W_Screen *scrPtr = lPtr->view->screen;
199 GC gc;
201 if (lPtr->textColor)
202 gc = WMColorGC(lPtr->textColor);
203 else
204 gc = WMColorGC(scrPtr->black);
206 W_PaintTextAndImage(lPtr->view, !lPtr->flags.noWrap, gc,
207 (lPtr->font!=NULL ? lPtr->font : scrPtr->normalFont),
208 lPtr->flags.relief, lPtr->caption,
209 lPtr->flags.alignment, lPtr->image,
210 lPtr->flags.imagePosition, NULL, 0);
215 static void
216 handleEvents(XEvent *event, void *data)
218 Label *lPtr = (Label*)data;
220 CHECK_CLASS(data, WC_Label);
223 switch (event->type) {
224 case Expose:
225 if (event->xexpose.count!=0)
226 break;
227 paintLabel(lPtr);
228 break;
230 case DestroyNotify:
231 destroyLabel(lPtr);
232 break;
237 static void
238 destroyLabel(Label *lPtr)
240 if (lPtr->textColor)
241 WMReleaseColor(lPtr->textColor);
243 if (lPtr->caption)
244 wfree(lPtr->caption);
246 if (lPtr->font)
247 WMReleaseFont(lPtr->font);
249 if (lPtr->image)
250 WMReleasePixmap(lPtr->image);
252 wfree(lPtr);