00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <string.h>
00022 #include <ctype.h>
00023 #include <stdlib.h>
00024 #include <tcl.h>
00025 #include "config.h"
00026 #include "utilities.h"
00027 #include "VMDApp.h"
00028
00029 #ifdef VMDTK
00030 #include "VMDTkMenu.h"
00031 #endif
00032
00033 #define TCL_HELP 99 //internal code to generate error AND display menu command help
00034
00035 int text_cmd_menu(ClientData cd, Tcl_Interp *interp, int argc,
00036 const char *argv[]) {
00037
00038 VMDApp *app = (VMDApp *)cd;
00039 int retval = TCL_OK;
00040
00041
00042 if (argc < 2) retval = TCL_HELP;
00043
00044 if (argc == 2 && !strupncmp(argv[1], "list", CMDLEN)) {
00045
00046 for (int i=0; i<app->num_menus(); i++)
00047 Tcl_AppendElement(interp, app->menu_name(i));
00048 }
00049 #ifdef VMDTK
00050 else if (argc > 1 && !strupncmp(argv[1], "tk", CMDLEN)) {
00051 #ifndef MACVMD
00052 if ((argc == 5 || argc == 6 ) && !strupncmp(argv[2], "add", CMDLEN)) {
00053 VMDMenu *menu = new VMDTkMenu(argv[3], argv[4], app, interp);
00054 if (!app->add_menu(menu)) {
00055 delete menu;
00056 char buf[50];
00057 sprintf(buf, "Unable to add menu %s.\n", argv[3]);
00058 Tcl_SetResult(interp, buf, TCL_VOLATILE);
00059 retval = TCL_ERROR;
00060 } else {
00061
00062 if (argc==6) app->menu_add_extension(argv[3],argv[5]);
00063 else app->menu_add_extension(argv[3],argv[3]);
00064
00065
00066 Tcl_SetVar(interp, "vmd_menu_extension", argv[3], TCL_GLOBAL_ONLY);
00067 }
00068 } else if ((argc == 5 || argc == 6 ) && !strupncmp(argv[2], "register", CMDLEN)) {
00069 VMDTkMenu *menu = new VMDTkMenu(argv[3], NULL, app, interp);
00070 menu->register_proc(argv[4]);
00071 if (!app->add_menu(menu)) {
00072 delete menu;
00073 char buf[50];
00074 sprintf(buf, "Unable to add menu %s\n", argv[3]);
00075 Tcl_SetResult(interp, buf, TCL_VOLATILE);
00076 retval = TCL_ERROR;
00077 } else {
00078
00079 if (argc==6) app->menu_add_extension(argv[3],argv[5]);
00080 else app->menu_add_extension(argv[3],argv[3]);
00081
00082
00083 Tcl_SetVar(interp, "vmd_menu_extension", argv[3], TCL_GLOBAL_ONLY);
00084 }
00085 } else if (argc == 4 && !strupncmp(argv[2], "remove", CMDLEN)) {
00086 if (!app->remove_menu(argv[3])) {
00087 char buf[50];
00088 sprintf(buf, "Unable to remove menu %s\n", argv[3]);
00089 Tcl_SetResult(interp, buf, TCL_VOLATILE);
00090 retval = TCL_ERROR;
00091 }
00092 else app->menu_remove_extension(argv[3]);
00093 }
00094 else retval = TCL_HELP;
00095 #else
00096
00097 #endif
00098 }
00099 #endif
00100 else if (argc == 4 && !strupncmp(argv[2], "selectmol", CMDLEN)) {
00101
00102 int ind;
00103 if (Tcl_GetInt(interp, argv[3], &ind) != TCL_OK) retval = TCL_HELP;
00104 else app->menu_select_mol(argv[1], ind);
00105 }
00106 else if(argc == 3) {
00107 if(!strupncmp(argv[2],"on",CMDLEN))
00108 app->menu_show(argv[1], 1);
00109 else if (!strupncmp(argv[2],"off",CMDLEN))
00110 app->menu_show(argv[1], 0);
00111 else if (!strupncmp(argv[2],"loc",CMDLEN)) {
00112 int x, y;
00113 if (app->menu_location(argv[1], x, y)) {
00114 char buf[20];
00115 sprintf(buf, "%d %d", x, y);
00116 Tcl_SetResult(interp, buf, TCL_VOLATILE);
00117 }
00118 else {
00119 Tcl_AppendResult(interp, "menu loc: menu '", argv[1],
00120 "' does not exist.", NULL);
00121 retval = TCL_ERROR;
00122 }
00123 }
00124 else if (!strupncmp(argv[2], "status", CMDLEN))
00125 Tcl_AppendResult(interp, app->menu_status(argv[1]) ? "on" : "off", NULL);
00126 else retval = TCL_HELP;
00127 }
00128 else if (argc == 5 && !strupncmp(argv[2],"move",CMDLEN))
00129 app->menu_move(argv[1], atoi(argv[3]), atoi(argv[4]));
00130 else
00131 retval = TCL_HELP;
00132
00133 if (retval == TCL_HELP) {
00134 Tcl_SetResult(interp,
00135 (char *) "Usage:\n"
00136 "\tmenu list -- returns list of available menus\n"
00137 "\tmenu <name> on -- turn menu with given name on\n"
00138 "\tmenu <name> off -- turn menu with given name off\n"
00139 "\tmenu <name> status -- returns 'on' or 'off'\n"
00140 "\tmenu <name> loc -- returns current position of menu\n"
00141 "\tmenu <name> move x y -- move menu to given position\n"
00142 "\tmenu tk add <name> <tk window> [<menu path>]\n"
00143 "\t -- add Tk menu to Extensions\n"
00144 "\tmenu tk register <name> <procname> [<menu path>]\n"
00145 "\t -- same as 'add', but <procname> returns tk window handle.\n"
00146 "\tmenu tk remove <name> -- remove menu from Extensions\n"
00147 "The Tk 'menu' command is also available.",
00148 TCL_STATIC);
00149 retval = TCL_ERROR;
00150 }
00151
00152 return retval;
00153 }
00154