library(shiny)
library(jsTreeR)
library(shinyAce)

rootFolder <- R.home()

# binary files extensions (we don't want to open these files)
binaryExtensions <- c(
  "3dm", "3ds", "3g2", "3gp", "7z", "a", "aac", "adp",
  "ai", "aif", "aiff", "alz", "ape", "apk", "appimage", "ar",
  "arj", "asf", "au", "avi", "bak", "baml", "bh", "bin",
  "bk", "bmp", "btif", "bz2", "bzip2", "cab", "caf", "cgm",
  "class", "cmx", "cpio", "cr2", "cur", "dat", "dcm", "deb",
  "dex", "djvu", "dll", "dmg", "dng", "doc", "docm", "docx",
  "dot", "dotm", "dra", "DS_Store", "dsk", "dts", "dtshd", "dvb",
  "dwg", "dxf", "ecelp4800", "ecelp7470", "ecelp9600", "egg", "eol", "eot",
  "epub", "exe", "f4v", "fbs", "fh", "fla", "flac", "flatpak",
  "fli", "flv", "fpx", "fst", "fvt", "g3", "gh", "gif",
  "graffle", "gz", "gzip", "h261", "h263", "h264", "icns", "ico",
  "ief", "img", "ipa", "iso", "jar", "jpeg", "jpg", "jpgv",
  "jpm", "jxr", "key", "ktx", "lha", "lib", "lvp", "lz",
  "lzh", "lzma", "lzo", "m3u", "m4a", "m4v", "mar", "mdi",
  "mht", "mid", "midi", "mj2", "mka", "mkv", "mmr", "mng",
  "mobi", "mov", "movie", "mp3", "mp4", "mp4a", "mpeg", "mpg",
  "mpga", "mxu", "nef", "npx", "numbers", "nupkg", "o", "oga",
  "ogg", "ogv", "otf", "pages", "pbm", "pcx", "pdb", "pdf",
  "pea", "pgm", "pic", "png", "pnm", "pot", "potm", "potx",
  "ppa", "ppam", "ppm", "pps", "ppsm", "ppsx", "ppt", "pptm",
  "pptx", "psd", "pya", "pyc", "pyo", "pyv", "qt", "rar",
  "ras", "raw", "rds", "resources", "rgb", "rip", "rlc", "rmf",
  "rmvb", "rpm", "rtf", "rz", "s3m", "s7z", "scpt", "sgi", "shar",
  "snap", "sil", "sketch", "slk", "smv", "snk", "so", "stl",
  "suo", "sub", "swf", "tar", "tbz", "tbz2", "tga", "tgz",
  "thmx", "tif", "tiff", "tlz", "ttc", "ttf", "txz", "udf",
  "uvh", "uvi", "uvm", "uvp", "uvs", "uvu", "viv", "vob",
  "war", "wav", "wax", "wbmp", "wdp", "weba", "webm", "webp",
  "whl", "wim", "wm", "wma", "wmv", "wmx", "woff", "woff2",
  "wrm", "wvx", "xbm", "xif", "xla", "xlam", "xls", "xlsb",
  "xlsm", "xlsx", "xlt", "xltm", "xltx", "xm", "xmind", "xpi",
  "xpm", "xwd", "xz", "z", "zip", "zipx"
)

# ace editor mode
aceMode <- function(filepath){
  ext <- tolower(tools::file_ext(filepath))
  if(ext %in% binaryExtensions){
    return(NULL)
  }
  switch(ext,
         c = "c_cpp",
         cpp = "c_cpp",
         "c++" = "c_cpp",
         dockerfile = "dockerfile",
         frag = "glsl",
         h = "c_cpp",
         hpp = "c_cpp",
         css = "css",
         f = "fortran",
         f90 = "fortran",
         gitignore = "gitignore",
         hs = "haskell",
         html = "html",
         java = "java",
         js = "javascript",
         jsx = "jsx",
         json = "json",
         jl = "julia",
         tex = "latex",
         md = "markdown",
         map = "json",
         markdown = "markdown",
         rmd = "markdown",
         mysql = "mysql",
         ml = "ocaml",
         perl = "perl",
         pl = "perl",
         php = "php",
         py = "python",
         r = "r",
         rd = "rdoc",
         rhtml = "rhtml",
         rnw = "latex",
         ru = "ruby",
         rs = "rust",
         scala = "scala",
         scss = "scss",
         sh = "sh",
         sql = "sql",
         svg = "svg",
         txt = "text",
         ts = "typescript",
         vb = "vbscript",
         xml = "xml",
         yaml = "yaml",
         yml = "yaml",
         "plain_text"
  )
}

# custom context menu
menuItems <- JS("function customMenu(node) {
  $treeNavigator = $('div[id^=\"explorer-\"]');
  var tree = $treeNavigator.jstree(true);
  var items = {
    'view' : {
      'label': 'View (files only)',
      'action': function (obj) {
        if(tree.is_leaf(node)) {
          var path = tree.get_path(node, '/');
          Shiny.setInputValue('path', path, {priority: 'event'});
        }
      },
      'icon': 'fas fa-eye'
    }
  };
  return items;
}")
