Updated some .po files, added man page for wsetfont, and fixed a small bug
[wmaker-crm.git] / WPrefs.app / Paths.c
blob68f85036d52a0fcf2911e4efa5a70bed0e46c2a7
1 /* Paths.c- pixmap/icon paths
2 *
3 * WPrefs - Window Maker Preferences Program
4 *
5 * Copyright (c) 1998 Alfredo K. Kojima
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 * USA.
24 #include "WPrefs.h"
25 #include <unistd.h>
27 typedef struct _Panel {
28 WMFrame *frame;
29 char *sectionName;
31 char *description;
33 CallbackRec callbacks;
35 WMWindow *win;
37 WMFrame *pixF;
38 WMList *pixL;
39 WMButton *pixaB;
40 WMButton *pixrB;
41 WMTextField *pixT;
43 WMFrame *icoF;
44 WMList *icoL;
45 WMButton *icoaB;
46 WMButton *icorB;
47 WMTextField *icoT;
49 WMColor *red;
50 WMColor *black;
51 WMColor *white;
52 WMFont *font;
53 } _Panel;
57 #define ICON_FILE "paths"
60 static void
61 addPathToList(WMList *list, int index, char *path)
63 char *fpath = wexpandpath(path);
64 WMListItem *item;
66 item = WMInsertListItem(list, index, path);
68 if (access(fpath, X_OK)!=0) {
69 item->uflags = 1;
71 free(fpath);
75 static void
76 showData(_Panel *panel)
78 proplist_t array, val;
79 int i;
81 array = GetObjectForKey("IconPath");
82 if (!array || !PLIsArray(array)) {
83 if (array)
84 wwarning(_("bad value in option IconPath. Using default path list"));
85 addPathToList(panel->icoL, -1, "~/pixmaps");
86 addPathToList(panel->icoL, -1, "~/GNUstep/Library/Icons");
87 addPathToList(panel->icoL, -1, "/usr/include/X11/pixmaps");
88 addPathToList(panel->icoL, -1, "/usr/local/share/WindowMaker/Icons");
89 addPathToList(panel->icoL, -1, "/usr/local/share/WindowMaker/Pixmaps");
90 addPathToList(panel->icoL, -1, "/usr/share/WindowMaker/Icons");
91 } else {
92 for (i=0; i<PLGetNumberOfElements(array); i++) {
93 val = PLGetArrayElement(array, i);
94 addPathToList(panel->icoL, -1, PLGetString(val));
98 array = GetObjectForKey("PixmapPath");
99 if (!array || !PLIsArray(array)) {
100 if (array)
101 wwarning(_("bad value in option PixmapPath. Using default path list"));
102 addPathToList(panel->pixL, -1, "~/pixmaps");
103 addPathToList(panel->pixL, -1, "~/GNUstep/Library/WindowMaker/Pixmaps");
104 addPathToList(panel->pixL, -1, "/usr/local/share/WindowMaker/Pixmaps");
105 } else {
106 for (i=0; i<PLGetNumberOfElements(array); i++) {
107 val = PLGetArrayElement(array, i);
108 addPathToList(panel->pixL, -1, PLGetString(val));
114 static void
115 pushButton(WMWidget *w, void *data)
117 _Panel *panel = (_Panel*)data;
118 int i;
120 /* icon paths */
121 if (w == panel->icoaB) {
122 char *text = WMGetTextFieldText(panel->icoT);
124 if (text && strlen(text) > 0) {
125 i = WMGetListSelectedItemRow(panel->icoL);
126 if (i >= 0) i++;
127 addPathToList(panel->icoL, i, text);
128 WMSetListBottomPosition(panel->icoL,
129 WMGetListNumberOfRows(panel->icoL));
131 if (text)
132 free(text);
134 WMSetTextFieldText(panel->icoT, NULL);
135 } else if (w == panel->icorB) {
136 i = WMGetListSelectedItemRow(panel->icoL);
138 if (i>=0)
139 WMRemoveListItem(panel->icoL, i);
142 /* pixmap paths */
143 if (w == panel->pixaB) {
144 char *text = WMGetTextFieldText(panel->pixT);
146 if (text && strlen(text) > 0) {
147 i = WMGetListSelectedItemRow(panel->pixL);
148 if (i >= 0) i++;
149 addPathToList(panel->pixL, i, text);
150 WMSetListBottomPosition(panel->pixL,
151 WMGetListNumberOfRows(panel->pixL));
153 if (text)
154 free(text);
155 WMSetTextFieldText(panel->pixT, NULL);
156 } else if (w == panel->pixrB) {
157 i = WMGetListSelectedItemRow(panel->pixL);
159 if (i>=0)
160 WMRemoveListItem(panel->pixL, i);
165 static void
166 textEditedObserver(void *observerData, WMNotification *notification)
168 _Panel *panel = (_Panel*)observerData;
170 switch ((int)WMGetNotificationClientData(notification)) {
171 case WMReturnTextMovement:
172 if (WMGetNotificationObject(notification) == panel->icoT)
173 WMPerformButtonClick(panel->icoaB);
174 else
175 WMPerformButtonClick(panel->pixaB);
176 break;
178 case WMIllegalTextMovement:
179 if (WMGetNotificationObject(notification) == panel->icoT) {
180 WMSetButtonImage(panel->icoaB, NULL);
181 WMSetButtonAltImage(panel->icoaB, NULL);
182 } else {
183 WMSetButtonImage(panel->pixaB, NULL);
184 WMSetButtonAltImage(panel->pixaB, NULL);
186 break;
191 static void
192 textBeginObserver(void *observerData, WMNotification *notification)
194 _Panel *panel = (_Panel*)observerData;
195 WMScreen *scr = WMWidgetScreen(panel->win);
196 WMPixmap *arrow1 = WMGetSystemPixmap(scr, WSIReturnArrow);
197 WMPixmap *arrow2 = WMGetSystemPixmap(scr, WSIHighlightedReturnArrow);
199 if (WMGetNotificationObject(notification)==panel->icoT) {
200 WMSetButtonImage(panel->icoaB, arrow1);
201 WMSetButtonAltImage(panel->icoaB, arrow2);
202 } else {
203 WMSetButtonImage(panel->pixaB, arrow1);
204 WMSetButtonAltImage(panel->pixaB, arrow2);
210 static void
211 listClick(WMWidget *w, void *data)
213 _Panel *panel = (_Panel*)data;
214 char *t;
216 if (w == panel->icoL) {
217 t = WMGetListSelectedItem(panel->icoL)->text;
218 WMSetTextFieldText(panel->icoT, t);
219 } else {
220 t = WMGetListSelectedItem(panel->pixL)->text;
221 WMSetTextFieldText(panel->pixT, t);
227 static void
228 paintItem(WMList *lPtr, int index, Drawable d, char *text, int state,
229 WMRect *rect)
231 int width, height, x, y;
232 _Panel *panel = (_Panel*)WMGetHangedData(lPtr);
233 WMScreen *scr = WMWidgetScreen(lPtr);
234 Display *dpy = WMScreenDisplay(scr);
236 width = rect->size.width;
237 height = rect->size.height;
238 x = rect->pos.x;
239 y = rect->pos.y;
241 if (state & WLDSSelected)
242 XFillRectangle(dpy, d, WMColorGC(panel->white), x, y, width,
243 height);
244 else
245 XClearArea(dpy, d, x, y, width, height, False);
247 if (state & 1) {
248 WMDrawString(scr, d, WMColorGC(panel->red), panel->font, x+4, y,
249 text, strlen(text));
250 } else {
251 WMDrawString(scr, d, WMColorGC(panel->black), panel->font, x+4, y,
252 text, strlen(text));
258 static void
259 storeData(_Panel *panel)
261 proplist_t list;
262 proplist_t tmp;
263 int i;
264 char *p;
266 list = PLMakeArrayFromElements(NULL, NULL);
267 for (i=0; i<WMGetListNumberOfRows(panel->icoL); i++) {
268 p = WMGetListItem(panel->icoL, i)->text;
269 tmp = PLMakeString(p);
270 PLAppendArrayElement(list, tmp);
272 SetObjectForKey(list, "IconPath");
274 list = PLMakeArrayFromElements(NULL, NULL);
275 for (i=0; i<WMGetListNumberOfRows(panel->pixL); i++) {
276 p = WMGetListItem(panel->pixL, i)->text;
277 tmp = PLMakeString(p);
278 PLAppendArrayElement(list, tmp);
280 SetObjectForKey(list, "PixmapPath");
285 static void
286 createPanel(Panel *p)
288 _Panel *panel = (_Panel*)p;
289 WMScreen *scr = WMWidgetScreen(panel->win);
291 panel->white = WMWhiteColor(scr);
292 panel->black = WMBlackColor(scr);
293 panel->red = WMCreateRGBColor(scr, 0xffff, 0, 0, True);
294 panel->font = WMSystemFontOfSize(scr, 12);
296 panel->frame = WMCreateFrame(panel->win);
297 WMResizeWidget(panel->frame, FRAME_WIDTH, FRAME_HEIGHT);
298 WMMoveWidget(panel->frame, FRAME_LEFT, FRAME_TOP);
300 /* icon path */
301 panel->icoF = WMCreateFrame(panel->frame);
302 WMResizeWidget(panel->icoF, 230, 210);
303 WMMoveWidget(panel->icoF, 25, 10);
304 WMSetFrameTitle(panel->icoF, _("Icon Search Paths"));
306 panel->icoL = WMCreateList(panel->icoF);
307 WMResizeWidget(panel->icoL, 200, 120);
308 WMMoveWidget(panel->icoL, 15, 20);
309 WMSetListAction(panel->icoL, listClick, panel);
310 WMSetListUserDrawProc(panel->icoL, paintItem);
311 WMHangData(panel->icoL, panel);
313 panel->icoaB = WMCreateCommandButton(panel->icoF);
314 WMResizeWidget(panel->icoaB, 90, 24);
315 WMMoveWidget(panel->icoaB, 125, 145);
316 WMSetButtonText(panel->icoaB, _("Add"));
317 WMSetButtonAction(panel->icoaB, pushButton, panel);
318 WMSetButtonImagePosition(panel->icoaB, WIPRight);
320 panel->icorB = WMCreateCommandButton(panel->icoF);
321 WMResizeWidget(panel->icorB, 90, 24);
322 WMMoveWidget(panel->icorB, 15, 145);
323 WMSetButtonText(panel->icorB, _("Remove"));
324 WMSetButtonAction(panel->icorB, pushButton, panel);
326 panel->icoT = WMCreateTextField(panel->icoF);
327 WMResizeWidget(panel->icoT, 200, 20);
328 WMMoveWidget(panel->icoT, 15, 175);
329 WMAddNotificationObserver(textEditedObserver, panel,
330 WMTextDidEndEditingNotification, panel->icoT);
331 WMAddNotificationObserver(textBeginObserver, panel,
332 WMTextDidBeginEditingNotification, panel->icoT);
334 WMMapSubwidgets(panel->icoF);
336 /* pixmap path */
337 panel->pixF = WMCreateFrame(panel->frame);
338 WMResizeWidget(panel->pixF, 230, 210);
339 WMMoveWidget(panel->pixF, 270, 10);
340 WMSetFrameTitle(panel->pixF, _("Pixmap Search Paths"));
342 panel->pixL = WMCreateList(panel->pixF);
343 WMResizeWidget(panel->pixL, 200, 120);
344 WMMoveWidget(panel->pixL, 15, 20);
345 WMSetListAction(panel->pixL, listClick, panel);
346 WMSetListUserDrawProc(panel->pixL, paintItem);
347 WMHangData(panel->pixL, panel);
349 panel->pixaB = WMCreateCommandButton(panel->pixF);
350 WMResizeWidget(panel->pixaB, 90, 24);
351 WMMoveWidget(panel->pixaB, 125, 145);
352 WMSetButtonText(panel->pixaB, _("Add"));
353 WMSetButtonAction(panel->pixaB, pushButton, panel);
354 WMSetButtonImagePosition(panel->pixaB, WIPRight);
356 panel->pixrB = WMCreateCommandButton(panel->pixF);
357 WMResizeWidget(panel->pixrB, 90, 24);
358 WMMoveWidget(panel->pixrB, 15, 145);
359 WMSetButtonText(panel->pixrB, _("Remove"));
360 WMSetButtonAction(panel->pixrB, pushButton, panel);
362 panel->pixT= WMCreateTextField(panel->pixF);
363 WMResizeWidget(panel->pixT, 200, 20);
364 WMMoveWidget(panel->pixT, 15, 175);
365 WMAddNotificationObserver(textEditedObserver, panel,
366 WMTextDidEndEditingNotification, panel->pixT);
367 WMAddNotificationObserver(textBeginObserver, panel,
368 WMTextDidBeginEditingNotification, panel->pixT);
370 WMSetTextFieldNextTextField(panel->pixT, panel->icoT);
371 WMSetTextFieldPrevTextField(panel->pixT, panel->icoT);
373 WMMapSubwidgets(panel->pixF);
375 WMRealizeWidget(panel->frame);
376 WMMapSubwidgets(panel->frame);
378 showData(panel);
383 Panel*
384 InitPaths(WMScreen *scr, WMWindow *win)
386 _Panel *panel;
388 panel = wmalloc(sizeof(_Panel));
389 memset(panel, 0, sizeof(_Panel));
391 panel->sectionName = _("Search Path Configuration");
393 panel->description = _("Search paths to use when looking for pixmaps\n"
394 "and icons.");
396 panel->win = win;
398 panel->callbacks.createWidgets = createPanel;
399 panel->callbacks.updateDomain = storeData;
401 AddSection(panel, ICON_FILE);
403 return panel;