/*
* FileTypeRegistry.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.common.filetypes;
import java.util.HashMap;
import org.rstudio.core.client.FilePosition;
import org.rstudio.core.client.files.FileSystemItem;
import org.rstudio.core.client.resources.ImageResource2x;
import org.rstudio.studio.client.application.Desktop;
import org.rstudio.studio.client.application.events.EventBus;
import org.rstudio.studio.client.common.GlobalDisplay;
import org.rstudio.studio.client.common.filetypes.model.NavigationMethods;
import org.rstudio.studio.client.common.reditor.EditorLanguage;
import org.rstudio.studio.client.common.satellite.Satellite;
import org.rstudio.studio.client.server.ServerError;
import org.rstudio.studio.client.server.ServerRequestCallback;
import org.rstudio.studio.client.workbench.model.Session;
import org.rstudio.studio.client.workbench.views.files.model.FilesServerOperations;
import org.rstudio.studio.client.workbench.views.source.SourceSatellite;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.Command;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class FileTypeRegistry
{
private static final FileIconResources ICONS = FileIconResources.INSTANCE;
public static final TextFileType TEXT =
new TextFileType("text", "Text File", EditorLanguage.LANG_PLAIN, "",
new ImageResource2x(ICONS.iconText2x()),
true,
false, false, false, false, false, false, false, false, false, true, false, false);
public static final TextFileType R =
new RFileType("r_source", "R Script", EditorLanguage.LANG_R, ".R",
new ImageResource2x(ICONS.iconRdoc2x()));
public static final TextFileType RD =
new TextFileType("r_doc", "Rd File", EditorLanguage.LANG_RDOC, ".Rd",
new ImageResource2x(ICONS.iconRd2x()),
true, // word-wrap
true, // source on save aka preview on save
false, false, false,
true, // preview html
false, false, false, false,
true, // check spelling
false,
false);
public static final TextFileType DCF =
new TextFileType("dcf", "DCF", EditorLanguage.LANG_DCF, ".dcf",
new ImageResource2x(ICONS.iconDCF2x()), false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType STAN = new StanFileType();
public static final TextFileType MERMAID = new MermaidFileType();
public static final TextFileType GRAPHVIZ = new GraphvizFileType();
public static final TextFileType NAMESPACE =
new TextFileType("r_namespace", "NAMESPACE", EditorLanguage.LANG_R, "",
new ImageResource2x(ICONS.iconText2x()), false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType SWEAVE =
new SweaveFileType("sweave", "R Sweave",
EditorLanguage.LANG_SWEAVE, ".Rnw",new ImageResource2x(ICONS.iconRsweave2x()));
public static final TexFileType TEX =
new TexFileType("tex", "TeX", EditorLanguage.LANG_TEX, ".tex",
new ImageResource2x(ICONS.iconTex2x()));
public static final PlainTextFileType RHISTORY =
new PlainTextFileType("r_history", "R History", ".Rhistory",
new ImageResource2x(ICONS.iconRhistory2x()),
true);
public static final RWebContentFileType RMARKDOWN =
new RWebContentFileType("r_markdown", "R Markdown", EditorLanguage.LANG_RMARKDOWN,
".Rmd", new ImageResource2x(ICONS.iconRmarkdown2x()), true);
public static final RWebContentFileType RNOTEBOOK =
new RWebContentFileType("r_notebook", "R Notebook", EditorLanguage.LANG_RMARKDOWN,
".nb.html", new ImageResource2x(ICONS.iconRnotebook2x()), true);
public static final RWebContentFileType RPRESENTATION = new RPresentationFileType();
public static final WebContentFileType MARKDOWN =
new WebContentFileType("markdown", "Markdown", EditorLanguage.LANG_MARKDOWN,
".md", new ImageResource2x(ICONS.iconMarkdown2x()), true);
public static final RWebContentFileType RHTML =
new RWebContentFileType("r_html", "R HTML", EditorLanguage.LANG_RHTML,
".Rhtml", new ImageResource2x(ICONS.iconRhtml2x()), false);
public static final WebContentFileType HTML =
new WebContentFileType("html", "HTML", EditorLanguage.LANG_HTML,
".html", new ImageResource2x(ICONS.iconHTML2x()), false);
public static final TextFileType CSS =
new TextFileType("css", "CSS", EditorLanguage.LANG_CSS, ".css",
new ImageResource2x(ICONS.iconCss2x()),
true,
false, false, false, false, false, false, false, false, false, false, false, false);
public static final TextFileType JS =
new TextFileType("js", "JavaScript", EditorLanguage.LANG_JAVASCRIPT, ".js",
new ImageResource2x(ICONS.iconJavascript2x()),
true,
false, false, false, false, false, false, false, false, false, false, false, false);
public static final TextFileType JSON =
new TextFileType("json", "JSON", EditorLanguage.LANG_JAVASCRIPT, ".json",
new ImageResource2x(ICONS.iconJavascript2x()),
true,
false, false, false, false, false, false, false, false, false, false, false, false);
public static final TextFileType PYTHON = new ScriptFileType(
"python", "Python", EditorLanguage.LANG_PYTHON, ".py",new ImageResource2x(ICONS.iconPython2x()),
"python", true);
public static final TextFileType SQL =
new TextFileType("sql", "SQL", EditorLanguage.LANG_SQL, ".sql",
new ImageResource2x(ICONS.iconSql2x()), false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType SH = new ScriptFileType(
"sh", "Shell", EditorLanguage.LANG_SH, ".sh", new ImageResource2x(ICONS.iconSh2x()),
null, false);
public static final TextFileType YAML =
new TextFileType("yaml", "YAML", EditorLanguage.LANG_YAML, ".yml",
new ImageResource2x(ICONS.iconYaml2x()), false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType XML =
new TextFileType("xml", "XML", EditorLanguage.LANG_XML, ".xml",
new ImageResource2x(ICONS.iconXml2x()), false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType H = new CppFileType("h", ".h", new ImageResource2x(ICONS.iconH2x()), true, false);
public static final TextFileType C = new CppFileType("c", ".c", new ImageResource2x(ICONS.iconC2x()), false, false);
public static final TextFileType HPP = new CppFileType("hpp", ".hpp", new ImageResource2x(ICONS.iconHpp2x()), true, false);
public static final TextFileType CPP = new CppFileType("cpp", ".cpp", new ImageResource2x(ICONS.iconCpp2x()), true, true);
public static final TextFileType CLOJURE =
new TextFileType("clojure", "Clojure", EditorLanguage.LANG_CLOJURE, ".clj", new ImageResource2x(ICONS.iconClojure2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType COFFEE =
new TextFileType("coffee", "Coffee", EditorLanguage.LANG_COFFEE, ".coffee", new ImageResource2x(ICONS.iconCoffee2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType CSHARP =
new TextFileType("csharp", "C#", EditorLanguage.LANG_CSHARP, ".cs", new ImageResource2x(ICONS.iconCsharp2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType GITIGNORE =
new TextFileType("gitignore", "Gitignore", EditorLanguage.LANG_GITIGNORE, ".gitignore", new ImageResource2x(ICONS.iconGitignore2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType GO =
new TextFileType("go", "Go", EditorLanguage.LANG_GO, ".go", new ImageResource2x(ICONS.iconGo2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType GROOVY =
new TextFileType("groovy", "Groovy", EditorLanguage.LANG_GROOVY, ".groovy", new ImageResource2x(ICONS.iconGroovy2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType HASKELL =
new TextFileType("haskell", "Haskell", EditorLanguage.LANG_HASKELL, ".haskell", new ImageResource2x(ICONS.iconHaskell2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType HAXE =
new TextFileType("haxe", "Haxe", EditorLanguage.LANG_HAXE, ".haxe", new ImageResource2x(ICONS.iconHaxe2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType JAVA =
new TextFileType("java", "Java", EditorLanguage.LANG_JAVA, ".java", new ImageResource2x(ICONS.iconJava2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType JULIA =
new TextFileType("julia", "Julia", EditorLanguage.LANG_JULIA, ".julia", new ImageResource2x(ICONS.iconJulia2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType LISP =
new TextFileType("lisp", "Lisp", EditorLanguage.LANG_LISP, ".lisp", new ImageResource2x(ICONS.iconLisp2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType LUA =
new TextFileType("lua", "Lua", EditorLanguage.LANG_LUA, ".lua", new ImageResource2x(ICONS.iconLua2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType MAKEFILE =
new TextFileType("makefile", "Makefile", EditorLanguage.LANG_MAKEFILE, ".makefile", new ImageResource2x(ICONS.iconMakefile2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType MATLAB =
new TextFileType("matlab", "Matlab", EditorLanguage.LANG_MATLAB, ".m", new ImageResource2x(ICONS.iconMatlab2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType PERL =
new TextFileType("perl", "Perl", EditorLanguage.LANG_PERL, ".pl", new ImageResource2x(ICONS.iconPerl2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType RUBY =
new TextFileType("ruby", "Ruby", EditorLanguage.LANG_RUBY, ".rb", new ImageResource2x(ICONS.iconRuby2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType RUST =
new TextFileType("rust", "Rust", EditorLanguage.LANG_RUST, ".rs", new ImageResource2x(ICONS.iconRust2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType SCALA =
new TextFileType("scala", "Scala", EditorLanguage.LANG_SCALA, ".scala", new ImageResource2x(ICONS.iconScala2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final TextFileType SNIPPETS =
new TextFileType("snippets", "Snippets", EditorLanguage.LANG_SNIPPETS, ".snippets", new ImageResource2x(ICONS.iconSnippets2x()),
false, false, false, false, false,
false, false, false, false, false, false, false, false);
public static final RDataType RDATA = new RDataType();
public static final RProjectType RPROJECT = new RProjectType();
public static final DataFrameType DATAFRAME = new DataFrameType();
public static final UrlContentType URLCONTENT = new UrlContentType();
public static final CodeBrowserType CODEBROWSER = new CodeBrowserType();
public static final ProfilerType PROFILER = new ProfilerType();
public static final ObjectExplorerFileType OBJECT_EXPLORER = new ObjectExplorerFileType();
public static final BrowserType BROWSER = new BrowserType();
@Inject
public FileTypeRegistry(EventBus eventBus,
Satellite satellite,
Session session,
GlobalDisplay globalDisplay,
FilesServerOperations server)
{
eventBus_ = eventBus;
satellite_ = satellite;
server_ = server;
session_ = session;
globalDisplay_ = globalDisplay;
if (!Satellite.isCurrentWindowSatellite())
exportEditFileCallback();
FileIconResources icons = ICONS;
register("", TEXT, new ImageResource2x(icons.iconText2x()));
register("*.txt", TEXT, new ImageResource2x(icons.iconText2x()));
register("*.log", TEXT, new ImageResource2x(icons.iconText2x()));
register("README", TEXT, new ImageResource2x(icons.iconText2x()));
register(".gitignore", TEXT, new ImageResource2x(icons.iconText2x()));
register(".Rbuildignore", TEXT, new ImageResource2x(icons.iconText2x()));
register("packrat.lock", DCF, new ImageResource2x(icons.iconDCF2x()));
register("*.r", R, new ImageResource2x(icons.iconRdoc2x()));
register("*.q", R, new ImageResource2x(icons.iconRdoc2x()));
register("*.s", R, new ImageResource2x(icons.iconRdoc2x()));
register(".Rprofile", R, new ImageResource2x(icons.iconRprofile2x()));
register("Rprofile.site", R, new ImageResource2x(icons.iconRprofile2x()));
register(".Renviron", SH, new ImageResource2x(icons.iconSh2x()));
register("Renviron.site", SH, new ImageResource2x(icons.iconSh2x()));
register("DESCRIPTION", DCF, new ImageResource2x(icons.iconDCF2x()));
register("INDEX", TEXT, new ImageResource2x(icons.iconText2x()));
register("LICENCE", TEXT, new ImageResource2x(icons.iconText2x()));
register("MD5", TEXT, new ImageResource2x(icons.iconText2x()));
register("NEWS", TEXT, new ImageResource2x(icons.iconText2x()));
register("PORTING", TEXT, new ImageResource2x(icons.iconText2x()));
register("COPYING", TEXT, new ImageResource2x(icons.iconText2x()));
register("COPYING.LIB", TEXT, new ImageResource2x(icons.iconText2x()));
register("BUGS", TEXT, new ImageResource2x(icons.iconText2x()));
register("CHANGES", TEXT, new ImageResource2x(icons.iconText2x()));
register("CHANGELOG", TEXT, new ImageResource2x(icons.iconText2x()));
register("INSTALL", SH, new ImageResource2x(icons.iconSh2x()));
register("TODO", TEXT, new ImageResource2x(icons.iconText2x()));
register("THANKS", TEXT, new ImageResource2x(icons.iconText2x()));
register("configure", SH, new ImageResource2x(icons.iconSh2x()));
register("configure.win", SH, new ImageResource2x(icons.iconSh2x()));
register("cleanup", SH, new ImageResource2x(icons.iconSh2x()));
register("cleanup.win", SH, new ImageResource2x(icons.iconSh2x()));
register("Makefile", MAKEFILE, new ImageResource2x(icons.iconMakefile2x()));
register("Makefile.in", MAKEFILE, new ImageResource2x(icons.iconMakefile2x()));
register("Makefile.win", MAKEFILE, new ImageResource2x(icons.iconMakefile2x()));
register("Makevars", MAKEFILE, new ImageResource2x(icons.iconMakefile2x()));
register("Makevars.in", MAKEFILE, new ImageResource2x(icons.iconMakefile2x()));
register("Makevars.win", MAKEFILE, new ImageResource2x(icons.iconMakefile2x()));
register("TUTORIAL", DCF, new ImageResource2x(icons.iconDCF2x()));
register("NAMESPACE", NAMESPACE, new ImageResource2x(icons.iconText2x()));
register("*.rhistory", RHISTORY, new ImageResource2x(icons.iconRhistory2x()));
register("*.rproj", RPROJECT, new ImageResource2x(icons.iconRproject2x()));
register("*.rnw", SWEAVE, new ImageResource2x(icons.iconRsweave2x()));
register("*.rtex", SWEAVE, new ImageResource2x(icons.iconRsweave2x()));
register("*.snw", SWEAVE, new ImageResource2x(icons.iconRsweave2x()));
register("*.nw", SWEAVE, new ImageResource2x(icons.iconRsweave2x()));
register("*.tex", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.latex", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.sty", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.cls", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.bbl", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.dtx", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.ins", TEX, new ImageResource2x(icons.iconTex2x()));
register("*.rhtml", RHTML, new ImageResource2x(icons.iconRhtml2x()));
register("*.htm", HTML, new ImageResource2x(icons.iconHTML2x()));
register("*.html", HTML, new ImageResource2x(icons.iconHTML2x()));
register("*.css", CSS, new ImageResource2x(icons.iconCss2x()));
register("*.js", JS, new ImageResource2x(icons.iconJavascript2x()));
register("*.json", JSON, new ImageResource2x(icons.iconJavascript2x()));
register("*.rmd", RMARKDOWN, new ImageResource2x(icons.iconRmarkdown2x()));
register("*.rmarkdown", RMARKDOWN, new ImageResource2x(icons.iconRmarkdown2x()));
register("*.nb.html", RNOTEBOOK, new ImageResource2x(icons.iconRnotebook2x()));
register("*.rpres", RPRESENTATION, new ImageResource2x(icons.iconRpresentation2x()));
register("*.md", MARKDOWN, new ImageResource2x(icons.iconMarkdown2x()));
register("*.mdtxt", MARKDOWN, new ImageResource2x(icons.iconMarkdown2x()));
register("*.markdown*", MARKDOWN, new ImageResource2x(icons.iconMarkdown2x()));
register("*.bib", TEXT, new ImageResource2x(icons.iconText2x()));
register("*.c", C, new ImageResource2x(icons.iconC2x()));
register("*.cpp", CPP, new ImageResource2x(icons.iconCpp2x()));
register("*.cc", CPP, new ImageResource2x(icons.iconCpp2x()));
register("*.h", H, new ImageResource2x(icons.iconH2x()));
register("*.hpp", HPP, new ImageResource2x(icons.iconHpp2x()));
register("*.f", TEXT, new ImageResource2x(icons.iconText2x()));
register("*.Rout.save", TEXT, new ImageResource2x(icons.iconText2x()));
register("*.rd", RD, new ImageResource2x(icons.iconRd2x()));
register("*.rdata", RDATA, new ImageResource2x(icons.iconRdata2x()));
register("*.rda", RDATA, new ImageResource2x(icons.iconRdata2x()));
register("*.Rproj", RPROJECT, new ImageResource2x(icons.iconRproject2x()));
register("*.dcf", DCF, new ImageResource2x(icons.iconDCF2x()));
register("*.mmd", MERMAID, new ImageResource2x(icons.iconMermaid2x()));
register("*.gv", GRAPHVIZ, new ImageResource2x(icons.iconGraphviz2x()));
register("*.dot", GRAPHVIZ, new ImageResource2x(icons.iconGraphviz2x()));
register("*.py", PYTHON, new ImageResource2x(icons.iconPython2x()));
register("*.sql", SQL, new ImageResource2x(icons.iconSql2x()));
register("*.sh", SH, new ImageResource2x(icons.iconSh2x()));
register("*.yml", YAML, new ImageResource2x(icons.iconYaml2x()));
register("*.yaml", YAML, new ImageResource2x(icons.iconYaml2x()));
register("*.xml", XML, new ImageResource2x(icons.iconXml2x()));
register("*.stan", STAN, new ImageResource2x(icons.iconStan2x()));
register("*.clj", CLOJURE, new ImageResource2x(icons.iconClojure2x()));
register("*.cloj", CLOJURE, new ImageResource2x(icons.iconClojure2x()));
register("*.clojure", CLOJURE, new ImageResource2x(icons.iconClojure2x()));
register("*.coffee", COFFEE, new ImageResource2x(icons.iconCoffee2x()));
register("*.cs", CSHARP, new ImageResource2x(icons.iconCsharp2x()));
register(".gitignore", GITIGNORE, new ImageResource2x(icons.iconGitignore2x()));
register("*.go", GO, new ImageResource2x(icons.iconGo2x()));
register("*.groovy", GROOVY, new ImageResource2x(icons.iconGroovy2x()));
register("*.haskell", HASKELL, new ImageResource2x(icons.iconHaskell2x()));
register("*.haxe", HAXE, new ImageResource2x(icons.iconHaxe2x()));
register("*.java", JAVA, new ImageResource2x(icons.iconJava2x()));
register("*.julia", JULIA, new ImageResource2x(icons.iconJulia2x()));
register("*.lisp", LISP, new ImageResource2x(icons.iconLisp2x()));
register(".emacs", LISP, new ImageResource2x(icons.iconLisp2x()));
register("*.el", LISP, new ImageResource2x(icons.iconLisp2x()));
register("*.lua", LUA, new ImageResource2x(icons.iconLua2x()));
register("*.m", MATLAB, new ImageResource2x(icons.iconMatlab2x()));
register("*.pl", PERL, new ImageResource2x(icons.iconPerl2x()));
register("*.rb", RUBY, new ImageResource2x(icons.iconRuby2x()));
register("*.rs", RUST, new ImageResource2x(icons.iconRust2x()));
register("*.scala", SCALA, new ImageResource2x(icons.iconScala2x()));
register("*.snippets", SNIPPETS, new ImageResource2x(icons.iconSnippets2x()));
register("*.Rprofvis", PROFILER, new ImageResource2x(icons.iconRprofile2x()));
registerIcon(".jpg", new ImageResource2x(icons.iconPng2x()));
registerIcon(".jpeg", new ImageResource2x(icons.iconPng2x()));
registerIcon(".gif", new ImageResource2x(icons.iconPng2x()));
registerIcon(".bmp", new ImageResource2x(icons.iconPng2x()));
registerIcon(".tiff", new ImageResource2x(icons.iconPng2x()));
registerIcon(".tif", new ImageResource2x(icons.iconPng2x()));
registerIcon(".png", new ImageResource2x(icons.iconPng2x()));
registerIcon(".pdf", new ImageResource2x(icons.iconPdf2x()));
registerIcon(".csv", new ImageResource2x(icons.iconCsv2x()));
registerIcon(".docx", new ImageResource2x(icons.iconWord2x()));
for (FileType fileType : FileType.ALL_FILE_TYPES)
{
assert !fileTypesByTypeName_.containsKey(fileType.getTypeId());
fileTypesByTypeName_.put(fileType.getTypeId(), fileType);
}
}
public void openFile(FileSystemItem file)
{
openFile(file, true);
}
public void openFile(final FileSystemItem file, final boolean canUseBrowser)
{
FileType fileType = getTypeForFile(file);
if (fileType != null)
{
fileType.openFile(file, eventBus_);
}
else
{
// build default command to use if we have an error or the
// file is not a text file
final Command defaultCommand = new Command() {
@Override
public void execute()
{
if (canUseBrowser)
{
if (session_.getSessionInfo().getAllowFileDownloads())
{
BROWSER.openFile(file, eventBus_);
}
else
{
globalDisplay_.showErrorMessage(
"File Download Error",
"Unable to show file because file downloads are " +
"restricted on this server.\n");
}
}
}
};
// check with the server to see if this is likely to be a text file
server_.isTextFile(file.getPath(),
new ServerRequestCallback<Boolean>() {
@Override
public void onResponseReceived(Boolean isText)
{
if (isText)
TEXT.openFile(file, eventBus_);
else
defaultCommand.execute();
}
@Override
public void onError(ServerError error)
{
defaultCommand.execute();
}
});
}
}
public void editFile(FileSystemItem file)
{
editFile(file, null);
}
public void editFile(FileSystemItem file, FilePosition position)
{
editFile(file, position, false);
}
public void editFile(FileSystemItem file,
FilePosition position,
boolean highlightLine)
{
// edit the file in the main window unless this is a source satellite
// (in which case we want to edit it locally)
if (Satellite.isCurrentWindowSatellite() &&
!satellite_.getSatelliteName().startsWith(SourceSatellite.NAME_PREFIX))
{
satellite_.focusMainWindow();
callSatelliteEditFile(file.cast(), position.cast(), highlightLine);
}
else
{
FileType fileType = getTypeForFile(file);
if (fileType != null
&& !(fileType instanceof TextFileType)
&& !(fileType instanceof ProfilerType))
{
fileType = TEXT;
}
if (fileType != null)
fileType.openFile(file,
position,
highlightLine ?
NavigationMethods.HIGHLIGHT_LINE :
NavigationMethods.DEFAULT,
eventBus_);
}
}
private void satelliteEditFile(JavaScriptObject file,
JavaScriptObject position,
boolean highlightLine)
{
FileSystemItem fsi = file.cast();
FilePosition pos = position.cast();
editFile(fsi, pos);
}
private final native void exportEditFileCallback()/*-{
var registry = this;
$wnd.editFileFromRStudioSatellite = $entry(
function(file, position, highlightLine) {
registry.@org.rstudio.studio.client.common.filetypes.FileTypeRegistry::satelliteEditFile(Lcom/google/gwt/core/client/JavaScriptObject;Lcom/google/gwt/core/client/JavaScriptObject;Z)(file,position,highlightLine);
}
);
}-*/;
private final native void callSatelliteEditFile(
JavaScriptObject file,
JavaScriptObject position,
boolean highlightLine)/*-{
$wnd.opener.editFileFromRStudioSatellite(file, position, highlightLine);
}-*/;
public FileType getTypeByTypeName(String name)
{
return fileTypesByTypeName_.get(name);
}
public FileType getTypeForFile(FileSystemItem file)
{
// last ditch default type -- see if this either a known text file type
// or (for server mode) NOT a known binary type. the result of this is
// that unknown files types are treated as text and opened in the editor
// (we don't do this on desktop because in that case users have the
// recourse of using a local editor)
String defaultType = Desktop.isDesktop() ? "application/octet-stream" :
"text/plain";
return getTypeForFile(file, defaultType);
}
public FileType getTypeForFile(FileSystemItem file, String defaultType)
{
if (file != null)
{
String filename = file.getName().toLowerCase();
FileType result = fileTypesByFilename_.get(filename);
if (result != null)
return result;
String extension = FileSystemItem.getExtensionFromPath(filename);
result = fileTypesByFileExtension_.get(extension);
if (result != null)
return result;
if (defaultType != null)
{
String mimeType = file.mimeType(defaultType);
if (mimeType.startsWith("text/"))
return TEXT;
}
}
return null;
}
public TextFileType getTextTypeForFile(FileSystemItem file)
{
FileType type = getTypeForFile(file);
if (type != null && type instanceof TextFileType)
return (TextFileType) type;
else
return TEXT;
}
public ImageResource getIconForFile(FileSystemItem file)
{
if (file.isDirectory())
{
if (file.isPublicFolder())
return new ImageResource2x(ICONS.iconPublicFolder2x());
else
return new ImageResource2x(ICONS.iconFolder2x());
}
return getIconForFilename(file.getName());
}
public ImageResource getIconForFilename(String filename)
{
ImageResource icon = iconsByFilename_.get(filename.toLowerCase());
if (icon != null)
return icon;
String ext = FileSystemItem.getExtensionFromPath(filename);
icon = iconsByFileExtension_.get(ext.toLowerCase());
if (icon != null)
return icon;
return new ImageResource2x(ICONS.iconText2x());
}
private void register(String filespec, FileType fileType, ImageResource icon)
{
if (filespec.startsWith("*."))
{
String ext = filespec.substring(1).toLowerCase();
if (ext.equals("."))
ext = "";
fileTypesByFileExtension_.put(ext,
fileType);
if (icon != null)
iconsByFileExtension_.put(ext, icon);
}
else if (filespec.length() == 0)
{
fileTypesByFileExtension_.put("", fileType);
if (icon != null)
iconsByFileExtension_.put("", icon);
}
else
{
assert filespec.indexOf("*") < 0 : "Unexpected filespec format";
fileTypesByFilename_.put(filespec.toLowerCase(), fileType);
if (icon != null)
iconsByFilename_.put(filespec.toLowerCase(), icon);
}
}
private void registerIcon(String extension, ImageResource icon)
{
iconsByFileExtension_.put(extension, icon);
}
private final HashMap<String, FileType> fileTypesByFileExtension_ =
new HashMap<String, FileType>();
private final HashMap<String, FileType> fileTypesByFilename_ =
new HashMap<String, FileType>();
private final HashMap<String, FileType> fileTypesByTypeName_ =
new HashMap<String, FileType>();
private final HashMap<String, ImageResource> iconsByFileExtension_ =
new HashMap<String, ImageResource>();
private final HashMap<String, ImageResource> iconsByFilename_ =
new HashMap<String, ImageResource>();
private final EventBus eventBus_;
private final Satellite satellite_;
private final Session session_;
private final GlobalDisplay globalDisplay_;
private final FilesServerOperations server_;
}