class file_chooser : public frame { public: char* type() { return "filechooser"; } file_chooser() : frame(".exemplar_filechooser",0) {} file_chooser(char* p, char * options = "") : frame(p,"") { if(options) init(options); } file_chooser(widget* w, char* p, char * options = "") : frame(w,p,"") { if(options) init(options); } char* get() { return name?name:""; } void ok() { strcpy(name, tk->selection()); cancel(); } virtual void cancel() { widget* w = new widget(path()); w->destroy(); } void glob(char* s) { strcpy(_globvar,s); list(); } int operator()() { if (!strcmp(argv[1],"OK")) ok(); else if (!strcmp(argv[1],"CANCEL")) cancel(); else if (!strcmp(argv[1],"GLOB")) glob( e->get() ); else return widget::dispatch(tk,argc,argv); //return OK; } protected: void list(); button* b; button* c; entry* e; listbox* l; char name[BUFSIZ]; char _globvar[BUFSIZ]; void init(char* options); int direct(char* s, action& a, char* opts) { b->direct(s,a,"OK"); c->direct(s,a,"CANCEL"); return OK; } };