Deprecated: Assigning the return value of new by reference is deprecated in /home/bluestat/public_html/source/index.php on line 477
// // Armadillo File Manager // Copyright (c) 2010-2011, Robert Sesek // // This program is free software: you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free Software // Foundation, either version 3 of the License, or any later version. // $.namespace('armadillo.PathControl'); /** * Creates a new path editing control for a given path. * @param {string} path The path to create an editor for * @param {bool} editLastComponent Whether the last component should be shown as an edit box * @param {DomHelper} opt_domHelper Optional DOM helper * @constructor */ armadillo.PathControl = function(path, editLastComponent, opt_domHelper) { /** * Full path of the control. * @type {string} */ this.path_ = null; /** * The name of the file at the |path_|. * @type {string} */ this.name_ = null; this.setPath(path); /** * Whether or not the last component is editable. * @type {bool} */ this.editableLastComponent_ = editLastComponent; /** * Control UI for the name component of the path. * @type {Element} */ this.nameControl_ = null; }; /** * Sets the path. * @param {string} path */ armadillo.PathControl.prototype.setPath = function(path) { this.path_ = app.stripLastPathComponent(path); this.name_ = path.substr(this.path_.length); }; /** * Gets the new path. * @returns {string} */ armadillo.PathControl.prototype.getPath = function() { return app.joinPath(this.path_, this.name_); }; /** * Gets the name control. * @returns {Element} */ armadillo.PathControl.prototype.getNameControl = function() { return this.nameControl_; }; /** * Creates a new path control object. * @returns {Element} */ armadillo.PathControl.prototype.createDom = function() { this.element_ = $.createDom('div'); this.createDom_(this.element_); return this.element_; }; /** * Decorates the given element into a path control. * @param {Element} element */ armadillo.PathControl.prototype.createDom_ = function(element) { var components = this.path_.split('/'); // If this is an item that lives at the root, generate a special node for // moving between items at the top level. components[0] = '/'; // If the last component is emtpy, do not use it because it means a directory // is being moved. if (components[components.length - 1] == '') { components.splice(-1); } var path = ''; $.each(components, function (i, part) { element.append(this.createComponentNode_(path, part)); path = app.joinPath(path, part); }.bind(this)); if (this.editableLastComponent_) { this.nameControl_ = $.createDom('input'); this.nameControl_.attr({ 'type' : 'text', 'name' : 'pathName', 'value' : this.name_ }); this.nameControl_.bind('change keydown', this.nameChanged_.bind(this)); } else { this.nameControl_ = $.createDom('span').text(this.name_); } element.append(this.nameControl_); }; /** * @inheritDoc */ armadillo.PathControl.prototype.enterDocument = function() { armadillo.PathControl.superClass_.enterDocument.call(this); this.nameControl_.getElement().focus(); }; /** * Creates a node for a single path component. * @param {string} path The path up to this point. * @param {string} name The current component after |path|. */ armadillo.PathControl.prototype.createComponentNode_ = function(path, name) { var menu = $.createDom('select'); this.fetchMenuContents_(path, name, menu); var option = $.createDom('option'); option.text('Loading...').attr('selected', 'selected'); menu.append(option); menu.change(this.componentChanged_.bind(this)); return menu; }; /** * Queries the back-end for all the items at a given path and attaches them to * the given menu. * @param {string} path The path to get a list of items in * @param {string} name The name to select * @param {Element} The menu to attach items to */ armadillo.PathControl.prototype.fetchMenuContents_ = function(path, name, menu) { var fullPath = this.path_; var callback = function(data, status, xhr) { if (data['error']) { app.showError(data['message']); return; } // Create an empty node for the current directory. data.unshift('/'); menu.empty(); $.each(data, function (i, caption) { // It only makes sense to be able to move into directories. if (!app.isDirectory(caption)) { return; } var item = $.createDom('option'); var componentPath = app.joinPath(path, name, caption); item.val(componentPath).text(caption); menu.append(item); if (fullPath.substr(0, componentPath.length) == componentPath) { item.attr('selected', 'selected'); } }); }; app.sendRequest('list', {'path' : app.joinPath(path, name)}, callback); }; /** * Handler for changing a component of the control. * @param {Event} e */ armadillo.PathControl.prototype.componentChanged_ = function(e) { this.path_ = $(e.target).val(); this.element_.empty(); this.createDom_(this.element_); }; /** * Handler for changing the editable name component. * @param {Event} e */ armadillo.PathControl.prototype.nameChanged_ = function(e) { console.log(e); // TODO: assert(this.editableLastComponent_) this.name_ = e.target.value; e.stopPropagation(); return true; };