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;
  	}
  };
  

Initialization

  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 ); }

slide: The filechooser