00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdio.h>
00022 #include <stdlib.h>
00023
00024 #include <FL/Fl.H>
00025 #include <FL/Fl_Choice.H>
00026 #include "VMDFltkMenu.h"
00027 #include "VMDApp.h"
00028 #include "utilities.h"
00029
00030 void VMDFltkMenu::window_cb(Fl_Widget *w, void *) {
00031 VMDFltkMenu *m = (VMDFltkMenu *)w;
00032 m->app->menu_show(m->get_name(), 0);
00033 }
00034
00035
00036 VMDFltkMenu::VMDFltkMenu(const char *menuname,const char *title,VMDApp *vmdapp)
00037 : VMDMenu(menuname, vmdapp), Fl_Window(0,0,NULL) {
00038 _title=stringdup(title);
00039 Fl_Window::label(_title);
00040 #if defined(VMDMENU_WINDOW)
00041 Fl_Window::color(VMDMENU_WINDOW);
00042 #endif
00043 callback(window_cb);
00044 }
00045
00046
00047 VMDFltkMenu::~VMDFltkMenu() {
00048 delete [] _title;
00049 }
00050
00051
00052 void VMDFltkMenu::do_on() {
00053 Fl_Window::show();
00054 }
00055
00056
00057 void VMDFltkMenu::do_off() {
00058 Fl_Window::hide();
00059 }
00060
00061
00062 void VMDFltkMenu::move(int x, int y) {
00063 Fl_Widget::position(x,y);
00064 }
00065
00066
00067 void VMDFltkMenu::where(int &x, int &y) {
00068 x = Fl_Widget::x();
00069 y = Fl_Widget::y();
00070 }
00071
00072
00073 void fill_fltk_molchooser(Fl_Choice *choice, VMDApp *app,
00074 const char *extramenu) {
00075 int nummols = app->num_molecules();
00076 int has_extra = (extramenu == NULL) ? 0 : 1;
00077 int need_full_regen = 0;
00078 char buf[1024];
00079
00080
00081 int menusz = choice->size() - 1;
00082
00083 #if 1
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 if ((menusz <= has_extra) ||
00095 (menusz >= (nummols + has_extra)) ||
00096 ((nummols + has_extra) - menusz) > 1) {
00097 need_full_regen = 1;
00098
00099
00100 } else {
00101
00102
00103 }
00104 #else
00105 need_full_regen = 1;
00106 #endif
00107
00108
00109 if (need_full_regen) {
00110 choice->clear();
00111
00112 if (has_extra)
00113 choice->add(extramenu);
00114
00115 for (int i=0; i<nummols; i++) {
00116 int id = app->molecule_id(i);
00117 const char *s = app->molecule_name(id);
00118
00119
00120
00121
00122 sprintf(buf, "%d: %-.25s%s", id, s,
00123 app->molecule_is_displayed(id) ? "" : " (off)");
00124
00125
00126
00127
00128 int ind = choice->add("foobar");
00129 choice->replace(ind, buf);
00130 }
00131 } else {
00132
00133 int i = nummols - 1;
00134 int id = app->molecule_id(i);
00135 const char *s = app->molecule_name(id);
00136
00137
00138
00139
00140 sprintf(buf, "%d: %-.25s%s", id, s,
00141 app->molecule_is_displayed(id) ? "" : " (off)");
00142
00143
00144
00145
00146 int ind = choice->add("foobar");
00147 choice->replace(ind, buf);
00148 }
00149 }
00150
00151
00152 char * escape_fltk_menustring(const char * menustring) {
00153 char * newstr;
00154 int len = strlen(menustring);
00155 int i, j;
00156
00157
00158
00159
00160
00161 newstr = (char *) malloc(((len * 2) + 1) * sizeof(char));
00162 if (newstr == NULL)
00163 return NULL;
00164
00165 i=0;
00166 j=0;
00167 while (menustring[i] != '\0') {
00168
00169 if (menustring[i] == '/' ||
00170 menustring[i] == '\\' ||
00171 menustring[i] == '_') {
00172 newstr[j] = '\\';
00173 j++;
00174 } else if (menustring[i] == '&') {
00175
00176 i++;
00177 continue;
00178 }
00179
00180 newstr[j] = menustring[i];
00181 i++;
00182 j++;
00183 }
00184 newstr[j] = '\0';
00185
00186 return newstr;
00187 }
00188
00189
00190
00191
00192 static int find_menu_from_string(const char *namestr, const Fl_Menu *m) {
00193
00194 if (namestr == NULL || m == NULL)
00195 return -1;
00196
00197
00198
00199
00200
00201
00202 const char *nstr;
00203 if ((nstr = strrchr(namestr, '/')) == NULL)
00204 nstr = namestr;
00205 else
00206 nstr++;
00207
00208 int i, val;
00209 for (val=-1, i=0; i<m->size()-1; i++) {
00210 const char *mstr = m[i].text;
00211
00212 if ((mstr != NULL) && (!strcmp(nstr, mstr))) {
00213 val=i;
00214 break;
00215 }
00216 }
00217
00218 return val;
00219 }
00220
00221
00222
00223
00224 void set_chooser_from_string(const char *namestr, class Fl_Choice *chooser) {
00225 int m = find_menu_from_string(namestr, chooser->menu());
00226
00227
00228 if (m >= 0)
00229 chooser->value(m);
00230 }
00231
00232
00233