docs: function FileExplorer(options) {
  		EventTarget.attach(this);
  		this.registry = options.serviceRegistry;
  		if(this.registry) {
  			this.preferences = this.registry.getService('orion.core.preference');
  		}
  		if(this.preferences) {
  			this.generalPrefs = new mGeneralPrefs.GeneralPreferences(this.preferences);
  		}
  		this.treeRoot = options.treeRoot;
  		this.selection = options.selection;
  		this.fileClient = options.fileClient;
  		this.excludeFiles = options.excludeFiles;
  		this.excludeFolders = options.excludeFolders;
  		this.navHandlerFactory = options.navHandlerFactory;
  		this.parentId = options.parentId;
  		this.renderer = options.rendererFactory(this);
  		this.dragAndDrop = options.dragAndDrop;
  		this.setFocus = options.setFocus;
  		this.role = options.role || "treegrid";
  		this.name = options.name;
  		this.model = null;
  		this.myTree = null;
  		this.checkbox = false;
  		this._hookedDrag = false;
  		this.filteredResources = options.filteredResources;
  		this._annotations = [];
  		var modelEventDispatcher = options.modelEventDispatcher ? options.modelEventDispatcher : new EventTarget();
  		this.modelEventDispatcher = modelEventDispatcher;
  		// Listen to all resource changed events
  		this.fileClient.addEventListener("Changed", this._resourceChangedHandler = this.handleResourceChange.bind(this));
  		// Listen to annotation changed events
  		this.fileClient.addEventListener('AnnotationChanged', this._annotationChangedHandler = this._handleAnnotationChanged.bind(this));
  		// Listen to model changes from fileCommands
  		var _self = this;
  		this._modelListeners = {};
  		//We still need to listen to the "create project" events.
  		//Refer to projectCommnads.js for details on how special UI model calculation is done for the event.
  		["create"].forEach(function(eventType) { //$NON-NLS-1$//$NON-NLS-0$
  			modelEventDispatcher.addEventListener(eventType, _self._modelListeners[eventType] = _self.modelHandler[eventType].bind(_self));
  		});
  
  		var parentNode = lib.node(this.parentId);
  		this._clickListener = function(evt) {
  			if (!(evt.metaKey || evt.altKey || evt.shiftKey || evt.ctrlKey)) {
  				var navHandler = _self.getNavHandler();
  				if (navHandler && navHandler.getSelectionPolicy() !== "cursorOnly") {
  					var temp = evt.target;
  					while (temp && temp !== parentNode) {
  						if (temp._item) {
  							break;
  						}
  						temp = temp.parentNode;
  					}
  					if (temp && temp._item) {
  						var link = lib.$("a", evt.target);
  						if (link) {
  							if (evt.type === "click") {
  								window.location.href = urlModifier(link.href);
  								//_self._clickLink(link);
  							} else if (evt.type === "dblclick") {
  								this.isEditorTabsEnabled().then(function(editorTabsEnabled) {
  									if(editorTabsEnabled){
  										var target = evt.target || evt.srcElement;
  										var href = target.querySelector("a").href;
  										this.dispatchEvent({
  											type: "fileDoubleClicked",
  											href: href
  										});
  									}else{
  										this.isDesktopSelectionMode().then(function(desktopMode){
  											if(desktopMode){
  												this.handleLinkDoubleClick(link, evt);
  											}
  										}.bind(this));
  									}
  								}.bind(this));
  							}
  						}
  					}
  				}
  			}
  		};
  		if (parentNode) {
  			parentNode.addEventListener("click", this._clickListener.bind(this));
  			parentNode.addEventListener("dblclick", this._clickListener.bind(this));
  		}
  		
  		// Set general preferences
  		if(this.generalPrefs) {
  			this.generalPrefs.getPrefs().then(function(generalPrefs) {
  				generalPreferences = generalPrefs;
  			});
  		}
  	}