forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathProjectManager.js
More file actions
1 lines (1 loc) · 45.8 KB
/
ProjectManager.js
File metadata and controls
1 lines (1 loc) · 45.8 KB
1
define(function(require,exports,module){require("utils/Global");const _=require("thirdparty/lodash"),AppInit=require("utils/AppInit"),Async=require("utils/Async"),PreferencesDialogs=require("preferences/PreferencesDialogs"),PreferencesManager=require("preferences/PreferencesManager"),DocumentManager=require("document/DocumentManager"),MainViewManager=require("view/MainViewManager"),CommandManager=require("command/CommandManager"),Commands=require("command/Commands"),Dialogs=require("widgets/Dialogs"),DefaultDialogs=require("widgets/DefaultDialogs"),EventDispatcher=require("utils/EventDispatcher"),LanguageManager=require("language/LanguageManager"),Menus=require("command/Menus"),StringUtils=require("utils/StringUtils"),Strings=require("strings"),FileSystem=require("filesystem/FileSystem"),FileViewController=require("project/FileViewController"),PerfUtils=require("utils/PerfUtils"),FileUtils=require("file/FileUtils"),FileSystemError=require("filesystem/FileSystemError"),Urls=require("i18n!nls/urls"),FileSyncManager=require("project/FileSyncManager"),ProjectModel=require("project/ProjectModel"),FileTreeView=require("project/FileTreeView"),WorkingSetView=require("project/WorkingSetView"),ViewUtils=require("utils/ViewUtils"),ZipUtils=require("utils/ZipUtils"),Metrics=require("utils/Metrics");require("command/DefaultMenus");const EVENT_PROJECT_BEFORE_CLOSE="beforeProjectClose",EVENT_PROJECT_CLOSE="projectClose",EVENT_PROJECT_OPEN_FAILED="projectFileOpenFailed",EVENT_PROJECT_OPEN="projectOpen",EVENT_AFTER_PROJECT_OPEN="afterProjectOpen",EVENT_AFTER_STARTUP_FILES_LOADED="startupFilesLoaded",EVENT_PROJECT_REFRESH="projectRefresh",EVENT_CONTENT_CHANGED="contentChanged",EVENT_PROJECT_FILE_CHANGED="projectFileChanged",EVENT_PROJECT_FILE_RENAMED="projectFileRenamed",EVENT_PROJECT_CHANGED_OR_RENAMED_PATH="projectChangedPath";EventDispatcher.setLeakThresholdForEvent(EVENT_PROJECT_OPEN,25);const CLIPBOARD_SYNC_KEY="phoenix.clipboard",SETTINGS_FILENAME="."+PreferencesManager.SETTINGS_FILENAME,SETTINGS_FILENAME_BRACKETS="."+PreferencesManager.SETTINGS_FILENAME_BRACKETS;var SORT_DIRECTORIES_FIRST="sortDirectoriesFirst",_fileSystemChange,_fileSystemRename,_showErrorDialog,_saveTreeState,_renderTreeSync,_renderTree;const ERR_TYPE_CREATE=1,ERR_TYPE_CREATE_EXISTS=2,ERR_TYPE_RENAME=3,ERR_TYPE_DELETE=4,ERR_TYPE_LOADING_PROJECT=5,ERR_TYPE_LOADING_PROJECT_NATIVE=6,ERR_TYPE_MAX_FILES=7,ERR_TYPE_OPEN_DIALOG=8,ERR_TYPE_INVALID_FILENAME=9,ERR_TYPE_MOVE=10,ERR_TYPE_PASTE=11,ERR_TYPE_PASTE_FAILED=12,ERR_TYPE_DUPLICATE_FAILED=13,ERR_TYPE_DOWNLOAD_FAILED=14;var $projectTreeContainer,fileTreeViewContainer;function _hasFileSelectionFocus(){return FileViewController.getFileSelectionFocus()===FileViewController.PROJECT_MANAGER}var model=new ProjectModel.ProjectModel({focused:_hasFileSelectionFocus()}),_projectWarnedForTooManyFiles=!1;function _displayCreationError(e,errorInfo){window.setTimeout(function(){var error=errorInfo.type,isFolder=errorInfo.isFolder,name=errorInfo.name;if(error===FileSystemError.ALREADY_EXISTS)_showErrorDialog(ERR_TYPE_CREATE_EXISTS,isFolder,null,name);else if(error===ProjectModel.ERROR_INVALID_FILENAME)_showErrorDialog(ERR_TYPE_INVALID_FILENAME,isFolder,ProjectModel._invalidChars);else{var errString=error===FileSystemError.NOT_WRITABLE?Strings.NO_MODIFICATION_ALLOWED_ERR:StringUtils.format(Strings.GENERIC_ERROR,error);_showErrorDialog(ERR_TYPE_CREATE,isFolder,errString,name).getPromise()}},10)}function _revertSelection(previousPath,switchToWorkingSet){model.setSelected(previousPath),switchToWorkingSet&&FileViewController.setFileViewFocus(FileViewController.WORKING_SET_VIEW)}function ActionCreator(model){this.model=model,this._bindEvents()}ActionCreator.prototype._bindEvents=function(){this.model.on(ProjectModel.EVENT_CHANGE,function(){_renderTree()}),this.model.on(ProjectModel.EVENT_SHOULD_SELECT,function(e,data){data.add?FileViewController.openFileAndAddToWorkingSet(data.path).fail(_.partial(_revertSelection,data.previousPath,!data.hadFocus)):FileViewController.openAndSelectDocument(data.path,FileViewController.PROJECT_MANAGER).fail(_.partial(_revertSelection,data.previousPath,!data.hadFocus))}),this.model.on(ProjectModel.EVENT_SHOULD_FOCUS,function(){FileViewController.setFileViewFocus(FileViewController.PROJECT_MANAGER)}),this.model.on(ProjectModel.ERROR_CREATION,_displayCreationError)},ActionCreator.prototype.setDirectoryOpen=function(path,open){this.model.setDirectoryOpen(path,open).then(_saveTreeState)},ActionCreator.prototype.setSelected=function(path,doNotOpen){this.model.setSelected(path,doNotOpen)},ActionCreator.prototype.selectInWorkingSet=function(path){this.model.selectInWorkingSet(path)},ActionCreator.prototype.openWithExternalApplication=function(path){FileViewController.openWithExternalApplication(path)},ActionCreator.prototype.setContext=function(path){this.model.setContext(path)},ActionCreator.prototype.restoreContext=function(){this.model.restoreContext()},ActionCreator.prototype.startRename=function(path,isMoved){renameItemInline(path,isMoved)},ActionCreator.prototype.setRenameValue=function(path){this.model.setRenameValue(path)},ActionCreator.prototype.cancelRename=function(){this.model.cancelRename()},ActionCreator.prototype.performRename=function(){return this.model.performRename()},ActionCreator.prototype.startCreating=function(basedir,newName,isFolder){return this.model.startCreating(basedir,newName,isFolder)},ActionCreator.prototype.setSortDirectoriesFirst=function(sortDirectoriesFirst){this.model.setSortDirectoriesFirst(sortDirectoriesFirst)},ActionCreator.prototype.setFocused=function(focused){this.model.setFocused(focused)},ActionCreator.prototype.setCurrentFile=function(curFile){this.model.setCurrentFile(curFile)},ActionCreator.prototype.toggleSubdirectories=function(path,openOrClose){this.model.toggleSubdirectories(path,openOrClose).then(_saveTreeState)},ActionCreator.prototype.closeSubtree=function(path){this.model.closeSubtree(path),_saveTreeState()},ActionCreator.prototype.dragItem=function(path){$(".dropdown.open").length>0&&(Menus.closeAll(),this.setContext(null)),"/"===_.last(path)&&this.setDirectoryOpen(path,!1)},ActionCreator.prototype.moveItem=function(oldPath,newDirectory){var fileName,newPath=newDirectory+FileUtils.getBaseName(oldPath),self=this;oldPath!==newDirectory&&FileUtils.getParentPath(oldPath)!==newDirectory&&("/"===_.last(oldPath)&&(newPath=ProjectModel._ensureTrailingSlash(newPath)),this.startRename(oldPath,!0),this.setRenameValue(newPath),this.performRename(),this.setDirectoryOpen(newDirectory,!0))},ActionCreator.prototype.refresh=function(){this.model.refresh()};var actionCreator=new ActionCreator(model);function getFileTreeContext(){var selectedEntry;return model.getContext()}function getSelectedItem(){var selectedEntry=getFileTreeContext();return selectedEntry||(selectedEntry=model.getSelected()),selectedEntry||(selectedEntry=MainViewManager.getCurrentlyViewedFile()),selectedEntry}function _fileViewControllerChange(){actionCreator.setFocused(_hasFileSelectionFocus()),_renderTree()}function _documentSelectionFocusChange(){var curFullPath=MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE);curFullPath&&_hasFileSelectionFocus()?actionCreator.setSelected(curFullPath,!0):actionCreator.setSelected(null),_fileViewControllerChange()}function _currentFileChange(e,curFile){actionCreator.setCurrentFile(curFile)}function getBaseUrl(){return model.getBaseUrl()}function setBaseUrl(projectBaseUrl){projectBaseUrl=model.setBaseUrl(projectBaseUrl),PreferencesManager.setViewState("project.baseUrl",projectBaseUrl,PreferencesManager.STATE_PROJECT_CONTEXT)}function isWithinProject(absPathOrEntry){return model.isWithinProject(absPathOrEntry)}function filterProjectFiles(absPathOrEntryArray){if(!absPathOrEntryArray)return absPathOrEntryArray;let filteredPaths=[];return absPathOrEntryArray.forEach(function(file){isWithinProject(file)&&filteredPaths.push(file)}),filteredPaths}function makeProjectRelativeIfPossible(absPath){return model.makeProjectRelativeIfPossible(absPath)}function getProjectRelativeOrDisplayPath(fullPath){return Phoenix.app.getDisplayPath(makeProjectRelativeIfPossible(fullPath))}function getProjectRoot(){return model.projectRoot}function _setProjectRoot(rootEntry){var d=new $.Deferred;return model.setProjectRoot(rootEntry).then(function(){d.resolve(),model.reopenNodes(PreferencesManager.getViewState("project.treeState",PreferencesManager.STATE_PROJECT_CONTEXT))}),d.promise()}var _saveProjectPath=function(){PreferencesManager.setViewState("projectPath",model.projectRoot.fullPath)};_saveTreeState=function(){const openNodes=model.getOpenNodes();PreferencesManager.setViewState("project.treeState",openNodes,PreferencesManager.STATE_PROJECT_CONTEXT)},_showErrorDialog=function(errType,isFolder,error,path,dstPath){var titleType=isFolder?Strings.DIRECTORY_TITLE:Strings.FILE_TITLE,entryType=isFolder?Strings.DIRECTORY:Strings.FILE,title,message;switch(path=Phoenix.app.getDisplayPath(path),path=StringUtils.breakableUrl(path),errType){case ERR_TYPE_CREATE:title=StringUtils.format(Strings.ERROR_CREATING_FILE_TITLE,titleType),message=StringUtils.format(Strings.ERROR_CREATING_FILE,entryType,path,error);break;case ERR_TYPE_CREATE_EXISTS:title=StringUtils.format(Strings.INVALID_FILENAME_TITLE,titleType),message=StringUtils.format(Strings.ENTRY_WITH_SAME_NAME_EXISTS,path);break;case ERR_TYPE_RENAME:title=StringUtils.format(Strings.ERROR_RENAMING_FILE_TITLE,titleType),message=StringUtils.format(Strings.ERROR_RENAMING_FILE,path,error,entryType);break;case ERR_TYPE_MOVE:title=StringUtils.format(Strings.ERROR_MOVING_FILE_TITLE,titleType),message=StringUtils.format(Strings.ERROR_MOVING_FILE,path,error,entryType);break;case ERR_TYPE_DELETE:title=StringUtils.format(Strings.ERROR_DELETING_FILE_TITLE,titleType),message=StringUtils.format(Strings.ERROR_DELETING_FILE,path,error,entryType);break;case 5:title=Strings.ERROR_LOADING_PROJECT,message=StringUtils.format(Strings.READ_DIRECTORY_ENTRIES_ERROR,path,error);break;case ERR_TYPE_LOADING_PROJECT_NATIVE:title=Strings.ERROR_LOADING_PROJECT,message=StringUtils.format(Strings.REQUEST_NATIVE_FILE_SYSTEM_ERROR,path,error);break;case ERR_TYPE_MAX_FILES:title=Strings.ERROR_MAX_FILES_TITLE,message=Strings.ERROR_MAX_FILES;break;case 8:title=Strings.ERROR_LOADING_PROJECT,message=StringUtils.format(Strings.OPEN_DIALOG_ERROR,error);break;case ERR_TYPE_INVALID_FILENAME:title=StringUtils.format(Strings.INVALID_FILENAME_TITLE,isFolder?Strings.DIRECTORY_NAME:Strings.FILENAME),message=StringUtils.format(Strings.INVALID_FILENAME_MESSAGE,isFolder?Strings.DIRECTORY_NAMES_LEDE:Strings.FILENAMES_LEDE,error);break;case ERR_TYPE_PASTE:title=StringUtils.format(Strings.CANNOT_PASTE_TITLE,titleType),message=StringUtils.format(Strings.ENTRY_WITH_SAME_NAME_EXISTS,path);break;case ERR_TYPE_PASTE_FAILED:title=StringUtils.format(Strings.CANNOT_PASTE_TITLE,titleType),message=StringUtils.format(Strings.ERR_TYPE_PASTE_FAILED,path,dstPath);break;case ERR_TYPE_DUPLICATE_FAILED:title=StringUtils.format(Strings.CANNOT_DUPLICATE_TITLE,titleType),message=StringUtils.format(Strings.ERR_TYPE_DUPLICATE_FAILED,path);break;case ERR_TYPE_DOWNLOAD_FAILED:title=StringUtils.format(Strings.CANNOT_DOWNLOAD_TITLE,titleType),message=StringUtils.format(Strings.ERR_TYPE_DOWNLOAD_FAILED,path)}return title&&message?Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,title,message):null};var _RENDER_DEBOUNCE_TIME=100;function getWelcomeProjectPath(){return ProjectModel._ensureTrailingSlash(Phoenix.VFS.getDefaultProjectDir())}function getPlaceholderProjectPath(){return"/no_project_loaded/"}function getExploreProjectPath(){return`${getLocalProjectsPath()}explore/`}function getLocalProjectsPath(){return Phoenix.VFS.getUserProjectsDirectory()}function addWelcomeProjectPath(path){var welcomeProjects=ProjectModel._addWelcomeProjectPath(path,PreferencesManager.getViewState("welcomeProjects"));PreferencesManager.setViewState("welcomeProjects",welcomeProjects)}function isWelcomeProjectPath(path){return ProjectModel._isWelcomeProjectPath(path,getWelcomeProjectPath(),PreferencesManager.getViewState("welcomeProjects"))}function updateWelcomeProjectPath(path){return isWelcomeProjectPath(path)?getWelcomeProjectPath():path}function getInitialProjectPath(){return updateWelcomeProjectPath(PreferencesManager.getViewState("projectPath"))}async function _dirExists(fullPath){try{const{entry:entry}=await FileSystem.resolveAsync(fullPath);return entry.isDirectory}catch(e){return!1}}async function _safeCheckFolder(absOrRelativePath,relativeToDir=null){try{let folderToOpen;if(relativeToDir){folderToOpen=window.path.join(Phoenix.VFS.getTauriVirtualPath(relativeToDir),absOrRelativePath);const dirExists=await _dirExists(folderToOpen);if(dirExists)return folderToOpen}else{folderToOpen=Phoenix.VFS.getTauriVirtualPath(absOrRelativePath);const dirExists=await _dirExists(folderToOpen);if(dirExists)return folderToOpen}}catch(e){console.warn("error opening folder at path",absOrRelativePath,relativeToDir)}return null}async function _getStartupProjectFromCLIArgs(){const cliArgs=await Phoenix.app.getCommandLineArgs(),args=cliArgs&&cliArgs.args,cwd=cliArgs&&cliArgs.cwd;if(!args||args.length<=1)return null;try{let folderToOpen=args[1];return(folderToOpen=await _safeCheckFolder(args[1]))?(Metrics.countEvent(Metrics.EVENT_TYPE.PLATFORM,"openWith","folder"),folderToOpen):((folderToOpen=await _safeCheckFolder(args[1],cwd))&&Metrics.countEvent(Metrics.EVENT_TYPE.PLATFORM,"openWith","folder"),folderToOpen)}catch(e){console.error("Error getting startupProjectPath from CLI args",e)}return null}async function getStartupProjectPath(){let startupProjectPath=await _getStartupProjectFromCLIArgs();if(startupProjectPath)return startupProjectPath;if((startupProjectPath=updateWelcomeProjectPath(PreferencesManager.getViewState("projectPath")))&&_isProjectSafeToStartup(startupProjectPath)){const dirExists=await _dirExists(startupProjectPath);if(dirExists)return startupProjectPath}return getWelcomeProjectPath()}function _mergeProjectGitIgnores(rootPath,gitIgnoreFilters){let mergedGitIgnoreFile="";for(let filter of gitIgnoreFilters){if(!filter.gitIgnoreContent)continue;const projectRelativePath=makeProjectRelativeIfPossible(filter.basePath);if(projectRelativePath){let lines=[];for(let line of filter.gitIgnoreContent.split("\n"))if(!line.trim()||line.startsWith("#"))lines.push(line);else{const isNegated=line.startsWith("!"),pattern=isNegated?line.substring(1):line;line.startsWith("/")?lines.push(`${isNegated?"!":""}${projectRelativePath}${pattern.substring(1)}`):line.endsWith("/")&&1===(line.match(/\//g)||[]).length?lines.push(`${isNegated?"!":""}${projectRelativePath}**/${pattern}`):lines.push(`${isNegated?"!":""}${projectRelativePath}${pattern}`)}mergedGitIgnoreFile=`${mergedGitIgnoreFile}\n${lines.join("\n")}`}else mergedGitIgnoreFile=`${mergedGitIgnoreFile}\n${filter.gitIgnoreContent}`}return mergedGitIgnoreFile}async function _watchProjectRoot(rootPath){let gitIgnoreContent;FileSystem.on("change",_fileSystemChange),FileSystem.on("rename",_fileSystemRename);const gitIgnoreFilter=`${_mergeProjectGitIgnores(rootPath,await model.computeProjectGitIgnoreAsync())}\n${ProjectModel.defaultIgnoreGlobs.join("\n")}`;FileSystem.watch(FileSystem.getDirectoryForPath(rootPath),ProjectModel._shouldShowName,gitIgnoreFilter,function(err){err===FileSystemError.TOO_MANY_ENTRIES?_projectWarnedForTooManyFiles||(_showErrorDialog(ERR_TYPE_MAX_FILES),_projectWarnedForTooManyFiles=!0):err&&console.error("Error watching project root: ",rootPath,err)}),model._resetCache()}function _unwatchProjectRoot(){var result=new $.Deferred;return model.projectRoot?(FileSystem.off("change",_fileSystemChange),FileSystem.off("rename",_fileSystemRename),FileSystem.unwatch(model.projectRoot,function(err){err?(console.error("Error unwatching project root: ",model.projectRoot.fullPath,err),result.reject(err)):result.resolve()}),model._resetCache()):result.reject(),result.promise()}_renderTreeSync=function(forceRender){var projectRoot=getProjectRoot();projectRoot&&(model.setScrollerInfo($projectTreeContainer[0].scrollWidth,$projectTreeContainer.scrollTop(),$projectTreeContainer.scrollLeft(),$projectTreeContainer.offset().top),FileTreeView.render(fileTreeViewContainer,model._viewModel,projectRoot,actionCreator,forceRender,brackets.platform))},_renderTree=_.debounce(_renderTreeSync,100);const PREF_OK="prefOK",PREF_JSON_ERR="jsonERR",PREF_NO_FILE="noFile";function _validateProjectPreferencesFile(filePath){return new Promise(resolve=>{const file=FileSystem.getFileForPath(filePath);FileUtils.readAsText(file).done(function(text){try{text&&JSON.parse(text),resolve(PREF_OK)}catch(err){resolve(PREF_JSON_ERR)}}).fail(()=>{resolve(PREF_NO_FILE)})})}async function _reloadProjectPreferencesScope(){const root=getProjectRoot();if(root){const phoenixPrefFile=root.fullPath+SETTINGS_FILENAME,bracketsPrefFile=root.fullPath+SETTINGS_FILENAME_BRACKETS,statusPhoenix=await _validateProjectPreferencesFile(phoenixPrefFile),statusBrackets=await _validateProjectPreferencesFile(bracketsPrefFile);let prefFileToUse=phoenixPrefFile;statusPhoenix===PREF_NO_FILE&&statusBrackets!==PREF_NO_FILE&&(prefFileToUse=bracketsPrefFile),_alertBrokenPreferenceFile(),PreferencesManager._setProjectSettingsFile(prefFileToUse)}else PreferencesManager._setProjectSettingsFile()}let alertIsShown=!1;async function _alertBrokenPreferenceFile(){if(alertIsShown)return;const root=getProjectRoot(),phoenixPrefFile=root.fullPath+SETTINGS_FILENAME,bracketsPrefFile=root.fullPath+SETTINGS_FILENAME_BRACKETS,statusPhoenix=await _validateProjectPreferencesFile(phoenixPrefFile),statusBrackets=await _validateProjectPreferencesFile(bracketsPrefFile);let errorPrefFile=null;if(statusPhoenix===PREF_JSON_ERR)errorPrefFile=phoenixPrefFile;else{if(statusPhoenix!==PREF_NO_FILE||statusBrackets!==PREF_JSON_ERR)return;errorPrefFile=bracketsPrefFile}const info=MainViewManager.findInAllWorkingSets(errorPrefFile);let paneId;info.length&&(paneId=info[0].paneId),alertIsShown||(alertIsShown=!0,FileViewController.openFileAndAddToWorkingSet(errorPrefFile,paneId).done(function(){Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,Strings.ERROR_PREFS_CORRUPT_TITLE,Strings.ERROR_PROJ_PREFS_CORRUPT).done(function(){alertIsShown=!1,MainViewManager.focusActivePane()})}))}function _loadExistingProject(rootEntry){const rootPath=rootEntry.fullPath,result=new $.Deferred;var projectRootChanged=!model.projectRoot||!rootEntry||model.projectRoot.fullPath!==rootEntry.fullPath,perfTimerName=PerfUtils.markStart("Load Project: "+rootPath);return _projectWarnedForTooManyFiles=!1,_setProjectRoot(rootEntry).always(function(){model.setBaseUrl(PreferencesManager.getViewState("project.baseUrl",PreferencesManager.STATE_PROJECT_CONTEXT)||""),projectRootChanged&&(_reloadProjectPreferencesScope(),PreferencesManager._setCurrentFile(rootPath)),_watchProjectRoot(rootPath),rootPath===getWelcomeProjectPath()&&addWelcomeProjectPath(rootPath),projectRootChanged?(exports.trigger(EVENT_PROJECT_OPEN,model.projectRoot),result.resolve(),exports.trigger(EVENT_AFTER_PROJECT_OPEN,model.projectRoot)):(exports.trigger(EVENT_PROJECT_REFRESH,model.projectRoot),result.resolve());let projectLoadTime=PerfUtils.addMeasurement(perfTimerName);Metrics.valueEvent(Metrics.EVENT_TYPE.PERFORMANCE,"projectLoad","timeMs",Number(projectLoadTime))}),result.promise()}const _SAMPLE_HTML="<!DOCTYPE html>\n<html>\n <head>\n <title>Phoenix Editor for the web</title>\n </head>\n\n <body>\n <h1>Welcome to Phoenix</h1>\n <p> Modern, Open-source, IDE For The Web.</p>\n </body>\n</html>";function _createDefaultProject(){return new Promise((resolve,reject)=>{let projectDir=getWelcomeProjectPath();Phoenix.VFS.exists(projectDir,exists=>{exists?resolve():Phoenix.VFS.ensureExistsDir(projectDir,err=>{if(err)return window.logger.reportError(err,"Error creating default project"),void reject(err);let indexFile=Phoenix.VFS.path.normalize(`${projectDir}/index.html`);Phoenix.VFS.fs.writeFile(indexFile,_SAMPLE_HTML,"utf8",()=>{}),resolve()})})})}function _loadWelcomeProject(){const welcomeProjectPath=getWelcomeProjectPath(),result=new $.Deferred,rootEntry=FileSystem.getDirectoryForPath(welcomeProjectPath);function _loadRootEntry(){_loadExistingProject(rootEntry).done(result.resolve).fail(result.reject)}function _loadPlaceholderProject(){Phoenix.VFS.ensureExistsDir("/no_project_loaded/",placeHolderErr=>{if(placeHolderErr)return window.logger.reportError(placeHolderErr,"Error creating /no_project_loaded"),void alert("Unrecoverable error, startup project could not be created.");const placeholderProject=FileSystem.getDirectoryForPath("/no_project_loaded/");_loadExistingProject(placeholderProject).done(result.resolve).fail(result.reject)})}return rootEntry.exists(function(err,exists){if(exists)_loadRootEntry();else{if(Phoenix.isNativeApp&&!Phoenix.firstBoot)return void _loadPlaceholderProject();_createDefaultProject().then(_loadRootEntry).catch(_loadPlaceholderProject)}}),result.promise()}function _loadProjectInternal(rootPath){const result=new $.Deferred,rootEntry=FileSystem.getDirectoryForPath(rootPath);return rootEntry.exists(function(err,exists){exists?_loadExistingProject(rootEntry).done(result.resolve).fail(result.reject):(console.error("error loading project"),exports.trigger(EVENT_PROJECT_OPEN_FAILED,rootPath),_showErrorDialog(ERR_TYPE_LOADING_PROJECT_NATIVE,!0,FileSystemError.NOT_FOUND,rootPath).done(function(){model.projectRoot=null,_loadProject("/no_project_loaded/").always(function(){result.reject()})}))}),result.promise()}function _loadProject(rootPath){if(Metrics.valueEvent(Metrics.EVENT_TYPE.PROJECT,"Load",isWelcomeProjectPath(rootPath)?"default":"other",1),rootPath=ProjectModel._ensureTrailingSlash(rootPath),model.projectRoot&&model.projectRoot.fullPath===rootPath)return(new $.Deferred).resolve().promise();if(model.projectRoot){const vetoPromises=[];if(exports.trigger(EVENT_PROJECT_BEFORE_CLOSE,model.projectRoot,vetoPromises),vetoPromises.length>0){const deferred=new $.Deferred;return Promise.all(vetoPromises).then(function(){_continueLoadProject(rootPath).done(deferred.resolve).fail(deferred.reject)}).catch(function(){deferred.reject()}),deferred.promise()}}return _continueLoadProject(rootPath)}function _continueLoadProject(rootPath){return MainViewManager._closeAll(MainViewManager.ALL_PANES),_unwatchProjectRoot().fail(console.error),model.projectRoot&&(LanguageManager._resetPathLanguageOverrides(),PreferencesManager._reloadUserPrefs(model.projectRoot),exports.trigger(EVENT_PROJECT_CLOSE,model.projectRoot)),rootPath===getWelcomeProjectPath()?_loadWelcomeProject():_loadProjectInternal(rootPath)}var _refreshDelay=1e3,refreshFileTree=function refreshFileTree(){return FileSystem.clearAllCaches(),(new $.Deferred).resolve().promise()};function _showFolderFirst(){const newPref=!PreferencesManager.get(SORT_DIRECTORIES_FIRST);PreferencesManager.set(SORT_DIRECTORIES_FIRST,newPref)}function showInTree(entry){return model.showInTree(entry).then(_saveTreeState)}function _filePickerSupported(){return Phoenix.isNativeApp||window.showOpenFilePicker}function _openProject(path,result){CommandManager.execute(Commands.FILE_CLOSE_ALL,{promptOnly:!0}).done(function(){path?_loadProject(path).then(result.resolve,result.reject):FileSystem.showOpenDialog(!1,!0,Strings.CHOOSE_FOLDER,model.projectRoot.fullPath,null,function(err,files){!err&&files.length>0?_loadProject(files[0]).then(result.resolve,result.reject):result.reject()})}).fail(function(){result.reject()})}function openProject(path){const result=new $.Deferred;if(!path&&!_filePickerSupported())return Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,Strings.UNSUPPORTED_BROWSER_OPEN_FOLDER_TITLE,Strings.UNSUPPORTED_BROWSER_OPEN_FOLDER),result.reject(),result.promise();if(!path)return _openProject(null,result),result.promise();const rootPath=ProjectModel._ensureTrailingSlash(path);if(rootPath===getWelcomeProjectPath())return _openProject(rootPath,result),result.promise();const rootEntry=FileSystem.getDirectoryForPath(path);return rootEntry.exists(function(err,exists){exists?_openProject(path,result):(console.error("error project open path doesnt exist: ",path,err),exports.trigger(EVENT_PROJECT_OPEN_FAILED,path),_showErrorDialog(ERR_TYPE_LOADING_PROJECT_NATIVE,!0,FileSystemError.NOT_FOUND,path).done(function(){result.reject()}))}),result.promise()}function _projectSettings(){return PreferencesDialogs.showProjectPreferencesDialog(getBaseUrl()).getPromise()}function createNewItem(baseDir,initialName,skipRename,isFolder){return baseDir=model.getDirectoryInProject(baseDir),skipRename?isFolder?model.createAtPath(baseDir+initialName+"/"):model.createAtPath(baseDir+initialName):actionCreator.startCreating(baseDir,initialName,isFolder)}function moveToTrash(entry){const result=new $.Deferred,canMoveToTrash=Phoenix.app.canMoveToTrash(entry.fullPath);if(!canMoveToTrash)return console.error("Only tauri paths can be moved to trash, but got",entry.fullPath),result.reject(FileSystemError.NOT_SUPPORTED),result.promise();let name=_getProjectDisplayNameOrPath(entry.fullPath);const messageTemplate="win"===Phoenix.platform?Strings.DELETE_TO_RECYCLE_BIN:Strings.DELETE_TO_TRASH;let message=StringUtils.format(messageTemplate,name);return setProjectBusy(!0,message),Phoenix.app.moveToTrash(entry.fullPath).then(()=>{let parent;DocumentManager.notifyPathDeleted(entry.fullPath),_updateModelWithChange(window.path.dirname(entry.fullPath)),result.resolve()}).catch(err=>{_showErrorDialog(ERR_TYPE_DELETE,entry.isDirectory,FileUtils.getFileErrorString(err),entry.fullPath),result.reject(err)}).finally(()=>{setProjectBusy(!1,message)}),result.promise()}function deleteItem(entry){var result=new $.Deferred;let name=_getProjectDisplayNameOrPath(entry.fullPath),message=StringUtils.format(Strings.DELETING,name);return setProjectBusy(!0,message),entry.unlink(function(err){if(setProjectBusy(!1,message),err)_showErrorDialog(ERR_TYPE_DELETE,entry.isDirectory,FileUtils.getFileErrorString(err),entry.fullPath),result.reject(err);else{let parent;DocumentManager.notifyPathDeleted(entry.fullPath),_updateModelWithChange(window.path.dirname(entry.fullPath)),result.resolve()}}),result.promise()}function getLanguageFilter(languageId){return function languageFilter(file){var id=LanguageManager.getLanguageForPath(file.fullPath).getId();return"string"==typeof languageId?id===languageId:-1!==languageId.indexOf(id)}}function _updateModelWithChange(path){FileSystem.resolve(path,(err,entry)=>{err||model.handleFSEvent(entry)})}function forceFinishRename(){actionCreator.performRename()}function _setFileTreeSelectionWidth(width){model.setSelectionWidth(width),_renderTreeSync()}refreshFileTree=_.debounce(refreshFileTree,1e3),_fileSystemChange=function(event,entry,added,removed){FileSyncManager.syncOpenDocuments(),model.handleFSEvent(entry,added,removed);let removedInProject=[],addedInProject=[];if(removed&&removed.forEach(function(file){DocumentManager.notifyPathDeleted(file.fullPath),isWithinProject(file)&&removedInProject.push(file)}),addedInProject=filterProjectFiles(added),entry&&!isWithinProject(entry))if(addedInProject&&addedInProject.length&&isWithinProject(addedInProject[0].parentPath))entry=FileSystem.getDirectoryForPath(addedInProject[0].parentPath);else{if(!(removedInProject&&removedInProject.length&&isWithinProject(removedInProject[0].parentPath)))return;entry=FileSystem.getDirectoryForPath(removedInProject[0].parentPath)}exports.trigger("projectFileChanged",entry,addedInProject,removedInProject)},_fileSystemRename=function(event,oldName,newName){let oldParent=window.path.dirname(oldName),newParent=window.path.dirname(newName);_updateModelWithChange(oldParent),newParent!==oldParent&&_updateModelWithChange(newParent),DocumentManager.notifyPathNameChanged(oldName,newName),exports.trigger("projectFileRenamed",oldName,newName)};let _numPendingOperations=0,projectBusyMessages=[];function setProjectBusy(isBusy,message){const $projectSpinner=$("#project-operations-spinner");if(message=message||Strings.PROJECT_BUSY,isBusy)_numPendingOperations++,projectBusyMessages.push(message);else{_numPendingOperations--,console.log("ProjectBusy marked by: ",projectBusyMessages),console.log("removing busy status: ",message);const index=projectBusyMessages.indexOf(message);index>-1&&projectBusyMessages.splice(index,1),console.log(projectBusyMessages)}projectBusyMessages.length>0&&$projectSpinner.attr("title",projectBusyMessages.join(", ")),_numPendingOperations>0?$projectSpinner.removeClass("forced-hidden"):$projectSpinner.addClass("forced-hidden")}let queuePathForSelection=null;function _duplicateFileCMD(){let context=getContext(),fullPath=context&&context.fullPath;if(fullPath||(fullPath=MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE)),fullPath&&isWithinProject(fullPath)){let name=_getProjectDisplayNameOrPath(fullPath),message=StringUtils.format(Strings.DUPLICATING,name);setProjectBusy(!0,message),FileSystem.getFreePath(fullPath,(err,dupePath)=>{FileSystem.copy(fullPath,dupePath,(err,copiedStats)=>{setProjectBusy(!1,message),err?_showErrorDialog(ERR_TYPE_DUPLICATE_FAILED,!1,"err",_getProjectDisplayNameOrPath(fullPath)):FileSystem.resolve(dupePath,function(err,file){err||setTimeout(()=>{showInTree(file)},200)})})})}else Dialogs.showModalDialog(DefaultDialogs.DIALOG_ID_ERROR,Strings.CANNOT_DUPLICATE_TITLE,Strings.ERR_TYPE_DUPLICATE_FAILED_NO_FILE)}function _zipFailed(fullPath){_showErrorDialog(ERR_TYPE_DOWNLOAD_FAILED,!1,"err",_getProjectDisplayNameOrPath(fullPath))}function _downloadFolderCommand(downloadPath){downloadPath=downloadPath||getProjectRoot().fullPath;let projectName=path.basename(downloadPath),message=StringUtils.format(Strings.DOWNLOADING_FILE,projectName);setProjectBusy(!0,message),ZipUtils.zipFolder(downloadPath).then(zip=>zip.generateAsync({type:"blob"})).then(function(blob){window.saveAs(blob,`${projectName}.zip`)}).catch(()=>{_zipFailed(downloadPath)}).finally(()=>{setProjectBusy(!1,message)})}function _downloadCommand(entryToDownload){let context=entryToDownload||getContext(),fullPath=context&&context.fullPath;fullPath||(fullPath=MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE)),fullPath&&FileSystem.resolve(fullPath,function(err,fileOrFolder){if(err)return void _zipFailed(fullPath);let name=_getProjectDisplayNameOrPath(fullPath),message=StringUtils.format(Strings.DOWNLOADING_FILE,name);fileOrFolder.isFile?(setProjectBusy(!0,message),fileOrFolder.read({encoding:window.fs.BYTE_ARRAY_ENCODING},function(err,blobContent){if(err)return void _zipFailed(fullPath);setProjectBusy(!1,message);let blob=new Blob([blobContent],{type:"application/octet-stream"});window.saveAs(blob,path.basename(fullPath))})):_downloadFolderCommand(fullPath)})}model.on(ProjectModel.EVENT_CHANGE,async()=>{if(queuePathForSelection){let entry;(await FileSystem.resolveAsync(queuePathForSelection)).entry.isFile&&actionCreator.setSelected(queuePathForSelection),queuePathForSelection=null}}),model.on(ProjectModel.EVENT_FS_RENAME_STARTED,()=>{setProjectBusy(!0,Strings.RENAMING)}),model.on(ProjectModel.EVENT_FS_RENAME_END,()=>{setProjectBusy(!1,Strings.RENAMING)});const OPERATION_CUT="cut",OPERATION_COPY="copy";function _registerPathWithClipboard(path,operation){const clipboardText=window.path.basename(path);Phoenix.app.copyToClipboard(clipboardText),PhStore.setItem(CLIPBOARD_SYNC_KEY,{operation:operation,path:path,clipboardText:clipboardText})}function getProjectRelativePath(path){let projectRootParent=window.path.dirname(getProjectRoot().fullPath),relativePath;return window.path.relative(projectRootParent,path)}function _getProjectDisplayNameOrPath(path){let projectRootParent=window.path.dirname(getProjectRoot().fullPath),displayPath=window.path.relative(projectRootParent,path);return path.startsWith(Phoenix.VFS.getMountDir())?displayPath=window.path.relative(Phoenix.VFS.getMountDir(),path):path.startsWith(Phoenix.VFS.getTauriDir())?displayPath=window.fs.getTauriPlatformPath(path):path.startsWith(Phoenix.VFS._getVirtualDocumentsDirectory())&&(displayPath=window.path.relative(Phoenix.VFS._getVirtualDocumentsDirectory(),path)),displayPath}function _copyProjectRelativePath(){let context=getContext(),fullPath=context&&context.fullPath;if(fullPath||(fullPath=MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE)),fullPath){let pathToCopy=makeProjectRelativeIfPossible(fullPath);Phoenix.app.copyToClipboard(pathToCopy),PhStore.setItem(CLIPBOARD_SYNC_KEY,{})}}function _cutFileCMD(){let context=getContext(),fullPath=context&&context.fullPath;fullPath||(fullPath=MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE)),fullPath&&_registerPathWithClipboard(fullPath,OPERATION_CUT)}function _copyFileCMD(){let context=getContext(),fullPath=context&&context.fullPath;fullPath||(fullPath=MainViewManager.getCurrentlyViewedPath(MainViewManager.ACTIVE_PANE)),fullPath&&_registerPathWithClipboard(fullPath,OPERATION_COPY)}function _getPasteTarget(dstThatExists){return new Promise(async(resolve,reject)=>{try{let entry=(await FileSystem.resolveAsync(dstThatExists)).entry;if(entry.isFile){let parent=window.path.dirname(dstThatExists),parentEntry;resolve((await FileSystem.resolveAsync(parent)).entry)}else resolve(entry)}catch(e){reject(e)}})}function _isSameOrSubPathOf(dir,subDir){if(dir===subDir)return!0;const relative=window.path.relative(dir,subDir);return relative&&!relative.startsWith("..")&&!window.path.isAbsolute(relative)}async function _validatePasteTarget(srcEntry,targetEntry){if(_isSameOrSubPathOf(srcEntry.fullPath,targetEntry.fullPath))return _showErrorDialog(ERR_TYPE_PASTE_FAILED,srcEntry.isDirectory,"err",_getProjectDisplayNameOrPath(srcEntry.fullPath),_getProjectDisplayNameOrPath(targetEntry.fullPath)),!1;let baseName=window.path.basename(srcEntry.fullPath),targetPath=window.path.normalize(`${targetEntry.fullPath}/${baseName}`),exists;return!await FileSystem.existsAsync(targetPath)||(_showErrorDialog(ERR_TYPE_PASTE,srcEntry.isDirectory,"err",_getProjectDisplayNameOrPath(targetPath)),!1)}async function _performCut(src,dst){let target=await _getPasteTarget(dst),srcEntry=(await FileSystem.resolveAsync(src)).entry,canPaste;if(await _validatePasteTarget(srcEntry,target)){let baseName=window.path.basename(srcEntry.fullPath),targetPath=window.path.normalize(`${target.fullPath}/${baseName}`),message=StringUtils.format(Strings.MOVING,_getProjectDisplayNameOrPath(srcEntry.fullPath));setProjectBusy(!0,message),srcEntry.rename(targetPath,err=>{setProjectBusy(!1,message),err?_showErrorDialog(ERR_TYPE_PASTE_FAILED,srcEntry.isDirectory,"err",_getProjectDisplayNameOrPath(srcEntry.fullPath),_getProjectDisplayNameOrPath(target.fullPath)):queuePathForSelection=targetPath})}}async function _performCopy(src,dst){let target=await _getPasteTarget(dst),srcEntry=(await FileSystem.resolveAsync(src)).entry,canPaste;if(await _validatePasteTarget(srcEntry,target)){let name=_getProjectDisplayNameOrPath(srcEntry.fullPath),message=StringUtils.format(Strings.COPYING,name);setProjectBusy(!0,message),FileSystem.copy(srcEntry.fullPath,target.fullPath,(err,targetStat)=>{setProjectBusy(!1,message),err?_showErrorDialog(ERR_TYPE_PASTE_FAILED,srcEntry.isDirectory,"err",_getProjectDisplayNameOrPath(srcEntry.fullPath),_getProjectDisplayNameOrPath(target.fullPath)):queuePathForSelection=targetStat.realPath})}}async function _pasteFileCMD(){let targetPath=getProjectRoot().fullPath,context=getContext();context&&(targetPath=context.fullPath);const copiedFiles=await Phoenix.app.clipboardReadFiles();if(copiedFiles){for(let copiedFileOrFolderPath of copiedFiles)_performCopy(copiedFileOrFolderPath,targetPath);return}const clipboardText=await Phoenix.app.clipboardReadText(),clipboard=PhStore.getItem(CLIPBOARD_SYNC_KEY);if(clipboard&&clipboard.clipboardText===clipboardText)switch(clipboard.operation){case OPERATION_CUT:await _performCut(clipboard.path,targetPath);break;case OPERATION_COPY:await _performCopy(clipboard.path,targetPath);break;default:console.error("Clipboard unknown Operation: ",clipboard,targetPath)}}function _setProjectDownloadCommandEnabled(_event,projectRoot){CommandManager.get(Commands.FILE_DOWNLOAD_PROJECT).setEnabled(!Phoenix.VFS.isLocalDiscPath(projectRoot.fullPath)),CommandManager.get(Commands.FILE_DOWNLOAD).setEnabled(!Phoenix.VFS.isLocalDiscPath(projectRoot.fullPath))}AppInit.htmlReady(function(){PhStore.watchExternalChanges(CLIPBOARD_SYNC_KEY),($projectTreeContainer=$("#project-files-container")).addClass("jstree jstree-brackets"),$projectTreeContainer.css("overflow","auto"),$projectTreeContainer.css("position","relative"),fileTreeViewContainer=$("<div>").appendTo($projectTreeContainer)[0],model.setSelectionWidth($projectTreeContainer.width()),$(".main-view").click(function(jqEvent){jqEvent.target.classList.contains("jstree-rename-input")||(forceFinishRename(),actionCreator.setContext(null))}),$("#working-set-list-container").on("contentChanged",function(){$projectTreeContainer.trigger("contentChanged")}),Menus.getContextMenu(Menus.ContextMenuIds.PROJECT_MENU).on("beforeContextMenuOpen",function(){actionCreator.restoreContext()}),Menus.getContextMenu(Menus.ContextMenuIds.PROJECT_MENU).on("beforeContextMenuClose",function(){model.setContext(null,!1,!0)}),$projectTreeContainer.on("contextmenu",function(){forceFinishRename()}),$projectTreeContainer.on("dragover",function(e){e.preventDefault()}),$projectTreeContainer.on("drop",function(e){var data=JSON.parse(e.originalEvent.dataTransfer.getData("text"));actionCreator.moveItem(data.path,getProjectRoot().fullPath),e.stopPropagation()}),$("#project-context-menu").on("click.dropdown-menu",function(){model.setContext(null,!0)}),$projectTreeContainer.on("scroll",function(){$(".dropdown.open").length>0&&(Menus.closeAll(),actionCreator.setContext(null)),_renderTreeSync()}),_renderTree(),ViewUtils.addScrollerShadow($projectTreeContainer[0])}),EventDispatcher.makeEventDispatcher(exports),PreferencesManager.stateManager.definePreference("projectPath","string",getWelcomeProjectPath());const UNSAFE_PROJECT_EXIT_PREFIX="_Unafe_project_exit_";function _flagProjectNotExitedSafely(projectRootPath){PhStore.setItem(UNSAFE_PROJECT_EXIT_PREFIX+projectRootPath,!0),PhStore.persistDBForReboot()}function _flagProjectExitedSafely(projectRootPath){PhStore.removeItem(UNSAFE_PROJECT_EXIT_PREFIX+projectRootPath)}function _isProjectSafeToStartup(projectRootPath){const unsafeExit=!0===PhStore.getItem(UNSAFE_PROJECT_EXIT_PREFIX+projectRootPath);return unsafeExit&&console.error(`Project ${projectRootPath} marked as not safe to startup during`+"previous exit. Starting default project"),!unsafeExit}function _entryToPathSet(entryArray){return entryArray&&entryArray.length?new Set(entryArray.map(entry=>path.normalize(entry.fullPath))):new Set}exports.on("projectFileChanged",(_evt,entry,addedInProject,removedInProject)=>{if(!entry&&!addedInProject&&!removedInProject)return;const addedSet=_entryToPathSet(addedInProject),removedSet=_entryToPathSet(removedInProject);(entry||addedSet.size||removedSet.size)&&exports.trigger("projectChangedPath",entry&&path.normalize(entry.fullPath),addedSet,removedSet)}),exports.on("projectFileRenamed",(_evt,oldPath,newPath)=>{if((oldPath=path.normalize(oldPath))===(newPath=path.normalize(newPath)))return;const oldParent=path.dirname(oldPath),newParent=path.dirname(newPath);oldParent===newParent?exports.trigger("projectChangedPath",newParent,new Set([newPath]),new Set([oldPath])):(exports.trigger("projectChangedPath",oldParent,new Set,new Set([oldPath])),exports.trigger("projectChangedPath",newParent,new Set([newPath]),new Set))}),exports.on(EVENT_PROJECT_OPEN,(_evt,projectRoot)=>{_reloadProjectPreferencesScope(),_saveProjectPath(),_setProjectDownloadCommandEnabled(_evt,projectRoot),_flagProjectNotExitedSafely(projectRoot.fullPath)}),exports.on(EVENT_PROJECT_CLOSE,(_evt,projectRoot)=>{_flagProjectExitedSafely(projectRoot.fullPath)}),exports.on("beforeAppClose",()=>{_saveProjectPath(),_flagProjectExitedSafely(getProjectRoot().fullPath),_unwatchProjectRoot()});let startupFilesLoaded=!1;function isStartupFilesLoaded(){return startupFilesLoaded}function getContext(){return model.getContext()}function renameItemInline(entry,isMoved){var d=new $.Deferred;return model.startRename(entry,isMoved).done(function(){d.resolve()}).fail(function(errorInfo){window.setTimeout(function(){if(isMoved)switch(errorInfo.type){case FileSystemError.ALREADY_EXISTS:_showErrorDialog(ERR_TYPE_MOVE,errorInfo.isFolder,Strings.FILE_EXISTS_ERR,errorInfo.fullPath);break;case ProjectModel.ERROR_NOT_IN_PROJECT:_showErrorDialog(ERR_TYPE_MOVE,errorInfo.isFolder,Strings.ERROR_MOVING_NOT_IN_PROJECT,errorInfo.fullPath);break;default:_showErrorDialog(ERR_TYPE_MOVE,errorInfo.isFolder,FileUtils.getFileErrorString(errorInfo.type),errorInfo.fullPath)}else switch(errorInfo.type){case ProjectModel.ERROR_INVALID_FILENAME:_showErrorDialog(ERR_TYPE_INVALID_FILENAME,errorInfo.isFolder,ProjectModel._invalidChars);break;case FileSystemError.ALREADY_EXISTS:_showErrorDialog(ERR_TYPE_RENAME,errorInfo.isFolder,Strings.FILE_EXISTS_ERR,errorInfo.fullPath);break;case ProjectModel.ERROR_NOT_IN_PROJECT:_showErrorDialog(ERR_TYPE_RENAME,errorInfo.isFolder,Strings.ERROR_RENAMING_NOT_IN_PROJECT,errorInfo.fullPath);break;default:_showErrorDialog(ERR_TYPE_RENAME,errorInfo.isFolder,FileUtils.getFileErrorString(errorInfo.type),errorInfo.fullPath)}},10),d.reject(errorInfo)}),d.promise()}function getAllFiles(filter,includeWorkingSet,sort,options){var viewFiles,deferred;return"function"!=typeof filter&&(options=sort,sort=includeWorkingSet,includeWorkingSet=filter,filter=null),options=options||{},includeWorkingSet&&(viewFiles=MainViewManager.getWorkingSet(MainViewManager.ALL_PANES)),deferred=new $.Deferred,model.getAllFiles(filter,viewFiles,sort,{scope:options.scope}).done(function(fileList){deferred.resolve(fileList)}).fail(function(err){err!==FileSystemError.TOO_MANY_ENTRIES||_projectWarnedForTooManyFiles||(_showErrorDialog(ERR_TYPE_MAX_FILES),_projectWarnedForTooManyFiles=!0),deferred.resolve([])}),deferred.promise()}function addIconProvider(callback,priority=0){WorkingSetView.addIconProvider(callback,priority),FileTreeView.addIconProvider(callback,priority),rerenderTree()}function addClassesProvider(callback,priority){WorkingSetView.addClassProvider(callback,priority),FileTreeView.addClassesProvider(callback,priority),rerenderTree()}function rerenderTree(){_renderTree(!0)}exports.on("startupFilesLoaded",()=>{startupFilesLoaded=!0}),EventDispatcher.on_duringInit(FileViewController,"documentSelectionFocusChange",_documentSelectionFocusChange),EventDispatcher.on_duringInit(FileViewController,"fileViewFocusChange",_fileViewControllerChange),EventDispatcher.on_duringInit(MainViewManager,"currentFileChange",_currentFileChange),CommandManager.register(Strings.CMD_OPEN_FOLDER,Commands.FILE_OPEN_FOLDER,openProject),CommandManager.register(Strings.CMD_PROJECT_SETTINGS,Commands.FILE_PROJECT_SETTINGS,_projectSettings),CommandManager.register(Strings.CMD_FILE_REFRESH,Commands.FILE_REFRESH,refreshFileTree),CommandManager.register(Strings.CMD_FILE_CUT,Commands.FILE_CUT,_cutFileCMD),CommandManager.register(Strings.CMD_FILE_COPY,Commands.FILE_COPY,_copyFileCMD),CommandManager.register(Strings.CMD_FILE_COPY_PATH,Commands.FILE_COPY_PATH,_copyProjectRelativePath),CommandManager.register(Strings.CMD_FILE_PASTE,Commands.FILE_PASTE,_pasteFileCMD),CommandManager.register(Strings.CMD_FILE_DUPLICATE,Commands.FILE_DUPLICATE,_duplicateFileCMD),CommandManager.register(Strings.CMD_FILE_DUPLICATE_FILE,Commands.FILE_DUPLICATE_FILE,_duplicateFileCMD),CommandManager.register(Strings.CMD_FILE_DOWNLOAD_PROJECT,Commands.FILE_DOWNLOAD_PROJECT,_downloadFolderCommand),CommandManager.register(Strings.CMD_FILE_DOWNLOAD,Commands.FILE_DOWNLOAD,_downloadCommand),PreferencesManager.definePreference(SORT_DIRECTORIES_FIRST,"boolean",!0,{description:Strings.DESCRIPTION_SORT_DIRECTORIES_FIRST}).on("change",function(){let sortPref=PreferencesManager.get(SORT_DIRECTORIES_FIRST);actionCreator.setSortDirectoriesFirst(sortPref),CommandManager.get(Commands.FILE_SHOW_FOLDERS_FIRST).setChecked(sortPref)}),CommandManager.register(Strings.CMD_FILE_SHOW_FOLDERS_FIRST,Commands.FILE_SHOW_FOLDERS_FIRST,_showFolderFirst),CommandManager.get(Commands.FILE_SHOW_FOLDERS_FIRST).setChecked(PreferencesManager.get(SORT_DIRECTORIES_FIRST)),actionCreator.setSortDirectoriesFirst(PreferencesManager.get(SORT_DIRECTORIES_FIRST)),exports._actionCreator=actionCreator,exports._RENDER_DEBOUNCE_TIME=100,exports._setFileTreeSelectionWidth=_setFileTreeSelectionWidth,exports.getProjectRoot=getProjectRoot,exports.getBaseUrl=getBaseUrl,exports.setBaseUrl=setBaseUrl,exports.isWithinProject=isWithinProject,exports.filterProjectFiles=filterProjectFiles,exports.makeProjectRelativeIfPossible=makeProjectRelativeIfPossible,exports.shouldShow=ProjectModel.shouldShow,exports.shouldIndex=ProjectModel.shouldIndex,exports.openProject=openProject,exports.getFileTreeContext=getFileTreeContext,exports.getSelectedItem=getSelectedItem,exports.getContext=getContext,exports.getInitialProjectPath=getInitialProjectPath,exports.getStartupProjectPath=getStartupProjectPath,exports.getProjectRelativePath=getProjectRelativePath,exports.getProjectRelativeOrDisplayPath=getProjectRelativeOrDisplayPath,exports.getWelcomeProjectPath=getWelcomeProjectPath,exports.getPlaceholderProjectPath=getPlaceholderProjectPath,exports.getExploreProjectPath=getExploreProjectPath,exports.getLocalProjectsPath=getLocalProjectsPath,exports.isWelcomeProjectPath=isWelcomeProjectPath,exports.updateWelcomeProjectPath=updateWelcomeProjectPath,exports.createNewItem=createNewItem,exports.renameItemInline=renameItemInline,exports.deleteItem=deleteItem,exports.moveToTrash=moveToTrash,exports.forceFinishRename=forceFinishRename,exports.showInTree=showInTree,exports.shouldShowFileNameInTree=ProjectModel._shouldShowName,exports.refreshFileTree=refreshFileTree,exports.getAllFiles=getAllFiles,exports.getLanguageFilter=getLanguageFilter,exports.addIconProvider=addIconProvider,exports.addClassesProvider=addClassesProvider,exports.rerenderTree=rerenderTree,exports.setProjectBusy=setProjectBusy,exports.isStartupFilesLoaded=isStartupFilesLoaded,exports.EVENT_PROJECT_BEFORE_CLOSE=EVENT_PROJECT_BEFORE_CLOSE,exports.EVENT_PROJECT_CLOSE=EVENT_PROJECT_CLOSE,exports.EVENT_PROJECT_OPEN=EVENT_PROJECT_OPEN,exports.EVENT_AFTER_PROJECT_OPEN=EVENT_AFTER_PROJECT_OPEN,exports.EVENT_AFTER_STARTUP_FILES_LOADED="startupFilesLoaded",exports.EVENT_PROJECT_REFRESH=EVENT_PROJECT_REFRESH,exports.EVENT_CONTENT_CHANGED="contentChanged",exports.EVENT_PROJECT_FILE_CHANGED="projectFileChanged",exports.EVENT_PROJECT_FILE_RENAMED="projectFileRenamed",exports.EVENT_PROJECT_CHANGED_OR_RENAMED_PATH="projectChangedPath",exports.EVENT_PROJECT_OPEN_FAILED=EVENT_PROJECT_OPEN_FAILED});