1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-28 17:32:29 +01:00

new menu editor code

This commit is contained in:
kojima
2000-07-15 22:48:31 +00:00
parent 9a89e6cc18
commit 6f0d835bdb
4 changed files with 1204 additions and 1947 deletions

View File

@@ -24,10 +24,8 @@ WPrefs_SOURCES = \
Icons.c \ Icons.c \
KeyboardSettings.c \ KeyboardSettings.c \
KeyboardShortcuts.c \ KeyboardShortcuts.c \
Menu.c \
MenuPreferences.c \ MenuPreferences.c \
MouseSettings.c \ MouseSettings.c \
NoMenuAlert.c \
Paths.c \ Paths.c \
Preferences.c \ Preferences.c \
TexturePanel.c \ TexturePanel.c \
@@ -40,7 +38,6 @@ WPrefs_SOURCES = \
editmenu.c \ editmenu.c \
editmenu.h \ editmenu.h \
imagebrowser.c \ imagebrowser.c \
MenuGuru.c \
xmodifier.c xmodifier.c
CPPFLAGS = @CPPFLAGS@ -DLOCALEDIR=\"$(NLSDIR)\" CPPFLAGS = @CPPFLAGS@ -DLOCALEDIR=\"$(NLSDIR)\"

File diff suppressed because it is too large Load Diff

View File

@@ -1,502 +0,0 @@
/* MenuGuru.c- OPEN_MENU definition "guru" assistant
*
* WPrefs - Window Maker 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 <assert.h>
#include <ctype.h>
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;
}

View File

@@ -1,141 +0,0 @@
/* NoMenuAlert.c - warn user that menu can't be edited with WPrefs
*
* WPrefs - Window Maker Preferences Program
*
* Copyright (c) 1999 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"
typedef struct NoMenuPanel {
WMWindow *wwin;
WMLabel *text;
WMButton *copyBtn;
WMButton *keepBtn;
int finished;
int copy;
} NoMenuPanel;
#define MESSAGE_TEXT \
" The menu that is being used now could not be opened. "\
"This either means that there is a syntax error in it or that "\
"the menu is in a format not supported by WPrefs (WPrefs only "\
"supports property list menus).\n"\
" If you want to keep using the current menu, please read "\
"the '%s/%s' file, press 'Keep Current Menu' and edit it with a "\
"text editor.\n"\
" If you want to use this editor, press 'Copy Default Menu'. "\
"It will copy the default menu and will instruct Window Maker "\
"to use it instead of the current one.\n"\
" If you want more flexibility, keep using the current one "\
"as it allows you to use C preprocessor (cpp) macros, while being "\
"easy to edit. Window Maker supports both formats."
static void
closeCallback(WMWidget *self, void *data)
{
NoMenuPanel *panel = (NoMenuPanel*)data;
panel->finished = True;
}
static void
buttonCallback(WMWidget *self, void *data)
{
NoMenuPanel *panel = (NoMenuPanel*)data;
panel->finished = True;
if (self == panel->keepBtn)
panel->copy = False;
else
panel->copy = True;
}
Bool
AskMenuCopy(WMWindow *wwin)
{
NoMenuPanel panel;
char buffer[2048];
panel.wwin = WMCreatePanelForWindow(wwin, "noMenuAlert");
WMResizeWidget(panel.wwin, 430, 260);
WMSetWindowTitle(panel.wwin, "Warning");
WMSetWindowCloseAction(panel.wwin, closeCallback, &panel);
panel.text = WMCreateLabel(panel.wwin);
WMResizeWidget(panel.text, 370, 200);
WMMoveWidget(panel.text, 30, 20);
sprintf(buffer,
_(" The menu that is being used now could not be opened. "
"This either means that there is a syntax error in it or that "
"the menu is in a format not supported by WPrefs (WPrefs only "
"supports property list menus).\n"
" If you want to keep using the current menu, please read "
"the '%s/%s' file, press 'Keep Current Menu' and edit it with a "
"text editor.\n"
" If you want to use this editor, press 'Copy Default Menu'. "
"It will copy the default menu and will instruct Window Maker "
"to use it instead of the current one.\n"
" If you want more flexibility, keep using the current one "
"as it allows you to use C preprocessor (cpp) macros, while being "
"easy to edit. Window Maker supports both formats."),
wusergnusteppath(), "Library/WindowMaker/README");
WMSetLabelText(panel.text, buffer);
panel.copyBtn = WMCreateCommandButton(panel.wwin);
WMResizeWidget(panel.copyBtn, 180, 24);
WMMoveWidget(panel.copyBtn, 30, 225);
WMSetButtonText(panel.copyBtn, _("Copy Default Menu"));
WMSetButtonAction(panel.copyBtn, buttonCallback, &panel);
panel.keepBtn = WMCreateCommandButton(panel.wwin);
WMResizeWidget(panel.keepBtn, 180, 24);
WMMoveWidget(panel.keepBtn, 225, 225);
WMSetButtonText(panel.keepBtn, _("Keep Current Menu"));
WMSetButtonAction(panel.keepBtn, buttonCallback, &panel);
WMMapSubwidgets(panel.wwin);
WMRealizeWidget(panel.wwin);
WMMapWidget(panel.wwin);
panel.finished = False;
panel.copy = False;
while (!panel.finished) {
XEvent event;
WMNextEvent(WMScreenDisplay(WMWidgetScreen(panel.wwin)), &event);
WMHandleEvent(&event);
}
WMDestroyWidget(panel.wwin);
return panel.copy;
}