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; } };
void file_chooser::init(char* options) { e = new entry(this,".entry","-relief sunken"); e->handler(this,"GLOB"); frame* f = new frame(this,".list"); l = new listbox(f,".box", options); scrollbar* s = new scrollbar(f,".scroll"); s->yview(l); l->yscroll(s); l->pack("-side left"); s->pack("-side right -fill y"); redirect(l);handler( this );
is redirected to the listbox
frame* g = new frame(this,"frame"); b = new button(g,".ok"); b->text("OK"); b->handler(this,"OK"); c = new button(g,".cancel"); c->text("cancel"); c->handler(this,"CANCEL"); c->pack("-side left -fill x"); b->pack("-padx 5 -side right -fill x -fill y"); tk->pack(e,"-padx 5 -pady 10")->pack(f)->pack(g); glob(""); } void file_chooser::list() { e->insert(_globvar); sprintf(buf,"foreach i [exec ls\ %s] {\ %s insert end \$i }", _globvar, l->path() ); tk->eval( buf ); }