/* MenuGuru.c- OPEN_MENU definition "guru" assistant * * WPrefs - WindowMaker Preferences Program * * Copyright (c) 1998 Alfredo K. Kojima * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #include "WPrefs.h" #include #include typedef struct _MenuGuru { WMWindow *win; WMButton *nextB; WMButton *backB; WMButton *cancelB; WMLabel *typetopL; WMButton *typefB; WMButton *typepB; WMButton *typedB; WMLabel *pathtopL; WMTextField *pathT; WMButton *pathB; WMLabel *pathbotL; WMLabel *pipetopL; WMTextField *pipeT; WMLabel *pipebotL; WMLabel *dirtopL; WMTextField *dirT; WMLabel *dirbotL; WMLabel *progtopL; WMTextField *progT; WMLabel *progbotL; char ok; char end; int section; } MenuGuru; enum { GSelectType, GSelectFile, GSelectPaths, GSelectPipe, GSelectProgram, GDone }; static char* trimstr(char *str) { char *p = str; int i; while (isspace(*p)) p++; p = wstrdup(p); i = strlen(p); while (isspace(p[i]) && i>0) { p[i] = 0; i--; } return p; } static void showPart(MenuGuru *panel, int part) { WMUnmapSubwidgets(panel->win); WMMapWidget(panel->nextB); WMMapWidget(panel->backB); WMMapWidget(panel->cancelB); WMSetButtonEnabled(panel->backB, part!=GSelectType); switch (part) { case GSelectType: WMSetWindowTitle(panel->win, _("Menu Guru - Select Type")); WMMapWidget(panel->typetopL); WMMapWidget(panel->typedB); WMMapWidget(panel->typepB); WMMapWidget(panel->typefB); WMSetButtonText(panel->nextB, _("Next")); break; case GSelectFile: WMSetWindowTitle(panel->win, _("Menu Guru - Select Menu File")); WMMapWidget(panel->pathtopL); WMMapWidget(panel->pathT); /* WMMapWidget(panel->pathB);*/ WMMapWidget(panel->pathbotL); WMSetButtonText(panel->nextB, _("OK")); break; case GSelectPipe: WMSetWindowTitle(panel->win, _("Menu Guru - Select Pipe Command")); WMMapWidget(panel->pipetopL); WMMapWidget(panel->pipeT); WMMapWidget(panel->pipebotL); WMSetButtonText(panel->nextB, _("OK")); break; case GSelectPaths: WMSetWindowTitle(panel->win, _("Menu Guru - Select Directories")); WMMapWidget(panel->dirtopL); WMMapWidget(panel->dirT); WMMapWidget(panel->dirbotL); WMSetButtonText(panel->nextB, _("Next")); break; case GSelectProgram: WMSetWindowTitle(panel->win, _("Menu Guru - Select Command")); WMMapWidget(panel->progtopL); WMMapWidget(panel->progT); WMMapWidget(panel->progbotL); WMSetButtonText(panel->nextB, _("OK")); break; } panel->section = part; } static void clickNext(WMWidget *w, void *data) { MenuGuru *panel = (MenuGuru*)data; char *tmp, *p; switch (panel->section) { case GSelectType: if (WMGetButtonSelected(panel->typefB)) { showPart(panel, GSelectFile); } else if (WMGetButtonSelected(panel->typepB)) { showPart(panel, GSelectPipe); } else { showPart(panel, GSelectPaths); } break; case GSelectFile: tmp = WMGetTextFieldText(panel->pathT); p = trimstr(tmp); free(tmp); if (strlen(p)==0) { free(p); return; } free(p); panel->ok = 1; panel->end = 1; break; case GSelectPaths: tmp = WMGetTextFieldText(panel->dirT); p = trimstr(tmp); free(tmp); if (strlen(p)==0) { free(p); return; } free(p); showPart(panel, GSelectProgram); break; case GSelectPipe: tmp = WMGetTextFieldText(panel->pipeT); p = trimstr(tmp); free(tmp); if (strlen(p)==0) { free(p); return; } free(p); panel->ok = 1; panel->end = 1; break; case GSelectProgram: panel->ok = 1; panel->end = 1; break; default: panel->end = 1; } } static void clickBack(WMWidget *w, void *data) { MenuGuru *panel = (MenuGuru*)data; int newSection; switch (panel->section) { case GSelectFile: newSection = GSelectType; break; case GSelectPipe: newSection = GSelectType; break; case GSelectPaths: newSection = GSelectType; break; case GSelectProgram: newSection = GSelectPaths; break; default: newSection = panel->section; } showPart(panel, newSection); } static void closeWindow(WMWidget *w, void *data) { MenuGuru *panel = (MenuGuru*)data; panel->end = 1; } static void createPanel(WMWindow *mainWindow, MenuGuru *panel) { panel->win = WMCreatePanelForWindow(mainWindow, "menuGuru"); WMResizeWidget(panel->win, 370, 220); panel->nextB = WMCreateCommandButton(panel->win); WMResizeWidget(panel->nextB, 80, 24); WMMoveWidget(panel->nextB, 280, 185); WMSetButtonText(panel->nextB, _("Next")); WMSetButtonAction(panel->nextB, clickNext, panel); panel->backB = WMCreateCommandButton(panel->win); WMResizeWidget(panel->backB, 80, 24); WMMoveWidget(panel->backB, 195, 185); WMSetButtonText(panel->backB, _("Back")); WMSetButtonAction(panel->backB, clickBack, panel); panel->cancelB = WMCreateCommandButton(panel->win); WMResizeWidget(panel->cancelB, 80, 24); WMMoveWidget(panel->cancelB, 110, 185); WMSetButtonText(panel->cancelB, _("Cancel")); WMSetButtonAction(panel->cancelB, closeWindow, panel); /**/ panel->typetopL = WMCreateLabel(panel->win); WMResizeWidget(panel->typetopL, 350, 45); WMMoveWidget(panel->typetopL, 10, 10); WMSetLabelText(panel->typetopL, _("This process will help you create a " "submenu which definition is located in another file " "or is created dynamically.\nWhat do you want to use as the " "contents of the submenu?")); panel->typefB = WMCreateRadioButton(panel->win); WMResizeWidget(panel->typefB, 330, 35); WMMoveWidget(panel->typefB, 20, 65); WMSetButtonText(panel->typefB, _("A file containing the menu definition " "in the plain text (non-property list) menu format.")); panel->typepB = WMCreateRadioButton(panel->win); WMResizeWidget(panel->typepB, 330, 35); WMMoveWidget(panel->typepB, 20, 105); WMSetButtonText(panel->typepB, _("The menu definition generated by a " "script/program read through a pipe.")); panel->typedB = WMCreateRadioButton(panel->win); WMResizeWidget(panel->typedB, 330, 35); WMMoveWidget(panel->typedB, 20, 140); WMSetButtonText(panel->typedB, _("The files in one or more directories.")); WMGroupButtons(panel->typefB, panel->typepB); WMGroupButtons(panel->typefB, panel->typedB); WMPerformButtonClick(panel->typefB); /**/ panel->pathtopL = WMCreateLabel(panel->win); WMResizeWidget(panel->pathtopL, 330, 20); WMMoveWidget(panel->pathtopL, 20, 25); WMSetLabelText(panel->pathtopL, _("Type the path for the menu file:")); panel->pathT = WMCreateTextField(panel->win); WMResizeWidget(panel->pathT, 330, 20); WMMoveWidget(panel->pathT, 20, 50); /* panel->pathB = WMCreateCommandButton(panel->win); WMResizeWidget(panel->pathB, 70, 24); WMMoveWidget(panel->pathB, 275, 75); WMSetButtonText(panel->pathB, _("Browse")); */ panel->pathbotL = WMCreateLabel(panel->win); WMResizeWidget(panel->pathbotL, 330, 80); WMMoveWidget(panel->pathbotL, 20, 100); WMSetLabelText(panel->pathbotL, _("The menu file must contain a menu " "in the plain text menu file format. This format is " "described in the menu files included with WindowMaker, " "probably at ~/GNUstep/Library/WindowMaker/menu")); /**/ panel->pipetopL = WMCreateLabel(panel->win); WMResizeWidget(panel->pipetopL, 330, 32); WMMoveWidget(panel->pipetopL, 20, 20); WMSetLabelText(panel->pipetopL, _("Type the command that will generate " "the menu definition:")); panel->pipeT = WMCreateTextField(panel->win); WMResizeWidget(panel->pipeT, 330, 20); WMMoveWidget(panel->pipeT, 20, 55); panel->pipebotL = WMCreateLabel(panel->win); WMResizeWidget(panel->pipebotL, 330, 80); WMMoveWidget(panel->pipebotL, 20, 85); WMSetLabelText(panel->pipebotL, _("The command supplied must generate and " "output a valid menu definition to stdout. This definition " "should be in the plain text menu file format, described " "in the menu files included with WindowMaker, usually " "at ~/GNUstep/Library/WindowMaker/menu")); /**/ panel->dirtopL = WMCreateLabel(panel->win); WMResizeWidget(panel->dirtopL, 330, 32); WMMoveWidget(panel->dirtopL, 20, 20); WMSetLabelText(panel->dirtopL, _("Type the path for the directory. You " "can type more than one path by separating them with " "spaces.")); panel->dirT = WMCreateTextField(panel->win); WMResizeWidget(panel->dirT, 330, 20); WMMoveWidget(panel->dirT, 20, 55); panel->dirbotL = WMCreateLabel(panel->win); WMResizeWidget(panel->dirbotL, 330, 80); WMMoveWidget(panel->dirbotL, 20, 85); WMSetLabelText(panel->dirbotL, _("The menu generated will have an item " "for each file in the directory. The directories can " "contain program executables or data files (such as " "jpeg images).")); /**/ panel->dirtopL = WMCreateLabel(panel->win); WMResizeWidget(panel->dirtopL, 330, 32); WMMoveWidget(panel->dirtopL, 20, 20); WMSetLabelText(panel->dirtopL, _("Type the path for the directory. You " "can type more than one path by separating them with " "spaces.")); panel->dirT = WMCreateTextField(panel->win); WMResizeWidget(panel->dirT, 330, 20); WMMoveWidget(panel->dirT, 20, 55); panel->dirbotL = WMCreateLabel(panel->win); WMResizeWidget(panel->dirbotL, 330, 80); WMMoveWidget(panel->dirbotL, 20, 85); WMSetLabelText(panel->dirbotL, _("The menu generated will have an item " "for each file in the directory. The directories can " "contain program executables or data files (such as " "jpeg images).")); /**/ panel->dirtopL = WMCreateLabel(panel->win); WMResizeWidget(panel->dirtopL, 330, 32); WMMoveWidget(panel->dirtopL, 20, 20); WMSetLabelText(panel->dirtopL, _("Type the path for the directory. You " "can type more than one path by separating them with " "spaces.")); panel->dirT = WMCreateTextField(panel->win); WMResizeWidget(panel->dirT, 330, 20); WMMoveWidget(panel->dirT, 20, 60); panel->dirbotL = WMCreateLabel(panel->win); WMResizeWidget(panel->dirbotL, 330, 80); WMMoveWidget(panel->dirbotL, 20, 85); WMSetLabelText(panel->dirbotL, _("The menu generated will have an item " "for each file in the directory. The directories can " "contain program executables or data files (such as " "jpeg images).")); /**/ panel->progtopL = WMCreateLabel(panel->win); WMResizeWidget(panel->progtopL, 330, 48); WMMoveWidget(panel->progtopL, 20, 10); WMSetLabelText(panel->progtopL, _("If the directory contain data files, " "type the command used to open these files. Otherwise, " "leave it in blank.")); panel->progT = WMCreateTextField(panel->win); WMResizeWidget(panel->progT, 330, 20); WMMoveWidget(panel->progT, 20, 60); panel->progbotL = WMCreateLabel(panel->win); WMResizeWidget(panel->progbotL, 330, 72); WMMoveWidget(panel->progbotL, 20, 90); WMSetLabelText(panel->progbotL, _("Each file in the directory will have " "an item and they will be opened with the supplied command." "For example, if the directory contains image files and " "the command is \"xv -root\", each file in the directory " "will have a menu item like \"xv -root imagefile\".")); WMRealizeWidget(panel->win); } char* OpenMenuGuru(WMWindow *mainWindow) { WMScreen *scr = WMWidgetScreen(mainWindow); MenuGuru panel; char *text, *p, *dirs; createPanel(mainWindow, &panel); WMSetWindowCloseAction(panel.win, closeWindow, &panel); showPart(&panel, GSelectType); WMMapWidget(panel.win); panel.ok = 0; panel.end = 0; while (!panel.end) { XEvent ev; WMNextEvent(WMScreenDisplay(scr), &ev); WMHandleEvent(&ev); } text = NULL; if (panel.ok) { switch (panel.section) { case GSelectFile: text = WMGetTextFieldText(panel.pathT); break; case GSelectPipe: text = WMGetTextFieldText(panel.pipeT); p = trimstr(text); free(text); if (p[0]!='|') { text = wmalloc(strlen(p)+4); strcpy(text, "| "); strcat(text, p); free(p); } else { text = p; } break; case GSelectProgram: dirs = WMGetTextFieldText(panel.dirT); text = WMGetTextFieldText(panel.progT); p = trimstr(text); free(text); if (strlen(p)==0) { free(p); text = dirs; } else { text = wmalloc(strlen(dirs)+16+strlen(p)); sprintf(text, "%s WITH %s", dirs, p); free(dirs); free(p); } break; } } WMDestroyWidget(panel.win); return text; }