!7

sclass DirectoryInfo extends DynModule {
  S dir;
  bool allowedToLook;
  Bool exists, isFile;
  L<S> filesContained; // this should be an immutable list b/c of listeners
  
  transient JComboBox comboBox;
  
  File dirObject() { ret newFile(dir); }
  
  void start {
    ownTimer(doEvery(2.0, r fullUpdate)); // TODO: watch service
  }
  
  JComponent visualize() {
    if (dir == null)
      ret jcenteredbutton("Select directory...", r {
        selectDir("Select directory to show", voidfunc(File dir) {
          setDir(dir);
        });
      });
      
    if (comboBox == null)
      comboBox = yesNoComboBox(allowedToLook,
        voidfunc(bool b) { setField(allowedToLook := b) });
        
    ret makeForm(
      "Directory" := dir,
      allowedToLook := comboBox,
      +exists,
      +isFile,
      "Elements contained", filesContained == null ? "Unknown" : l(filesContained));
  }
  
  void fullUpdate { updateMe(); }
  
  void update {
    temp enter();
    if (dir != null && allowedToLook) {
      File dirObject = dirObject();
      setField(exists := dirObject.isDirectory());
      setField(isFile := dirObject.isFile());
      if (setField(filesContained := listFileNames(dirObject)))
        revisualize();
    } else
      if (setFields(exists := null, isFile := null, filesContained := null)) revisualize();
  }
  
  // API for other modules
  S getDir() { ret dir; }
  void setDir(File dir) { setField(dir := f2s(dir)); revisualize(); }
  L<S> getFiles() { ret filesContained; }
  void setAllowedToLook(bool b) { setField(allowedToLook := b); }
}