!7

module LocalSnippets > DynObjectTable<Snippet> {
  visualize {
    JComponent c = super.visualize();
    ret withCenteredButtons(centerAndEastWithMargins(c, vstackWithSpacing(
      makeBold(tableDependentButton(table, "RUN", rThread {
        dm_addDynamicModuleDialog2(selected().id)
      })),
      tableDependentButton(table, "Edit", rThread {
        dm_editSnippet(selected().id)
      }),
      tableDependentButton(table, "Transpile", rThread {
        transpileLocalSnippet(selected().id);
        updateList();
      }),
      tableDependentButton(table, "Rename...", rThread {
        fS id = selected().id;
        inputText("Rename Snippet " + id,
          getSnippetTitle(id),
          voidfunc(S title) enter {
            renameSnippet(id, title);
            updateList();
          });
      })
,
      tableDependentButton(table, "Delete", rThread {
        if (confirmOKCancel("Delete snippet " + snippetWithTitle(selected()) + "? It will be backed up.")) {
          deleteLocalSnippet(selected().id);
          infoBox("Snippet deleted!");
          updateList();
        }
      }),
      )),
    "New program...", r addSnippet);
  }
  
  start {
    itemToMap = func(Snippet s) -> Map {
      litorderedmap(
        "ID" := s.id,
        "Title" := unnull(s.title),
        "Type" := s.type,
        "Lines" := str(numberOfLinesInFile(localSnippetFile(s.id))),
        "Transpiled" := isLocalSnippetTranspiled(s.id) ? "yes" : "no")
    };
    doEveryAndNow(5.0, r updateList);
  }
  
  void updateList enter {
    setData(listLocalSnippets());
  }
  
  void addSnippet enter {
    final JTextField tfTitle = jtextfield();
    showFormTitled("Create local snippet",
      "Title", tfTitle,
      "Type",  "Dynamic Module",
      rThread {
        long id = newLocalSnippetID();
        File f = localSnippetFile(id);
        assertFalse(fileExists(f));
        saveTextFile(f, newModuleText());
        setFileInfoField(f, "Title", gtt(tfTitle));
        setLocalSnippetType(id, snippetType_dynModule());
        updateList();
      });
  }
}