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

slide: The dialog