2 // Armadillo File Manager
3 // Copyright (c) 2010-2011, Robert Sesek <http://www.bluestatic.org>
5 // This program is free software: you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free Software
7 // Foundation, either version 3 of the License, or any later version.
10 $.namespace('armadillo.PathControl');
13 * Creates a new path editing control for a given path.
14 * @param {string} path The path to create an editor for
15 * @param {bool} editLastComponent Whether the last component should be shown as an edit box
16 * @param {DomHelper} opt_domHelper Optional DOM helper
19 armadillo
.PathControl
= function(path
, editLastComponent
, opt_domHelper
) {
21 * Full path of the control.
27 * The name of the file at the |path_|.
34 * Whether or not the last component is editable.
37 this.editableLastComponent_
= editLastComponent
;
40 * Control UI for the name component of the path.
41 * @type {goog.ui.Control}
43 this.nameControl_
= null;
48 * @param {string} path
50 armadillo
.PathControl
.prototype.setPath
= function(path
) {
51 this.path_
= app
.stripLastPathComponent(path
);
52 this.name_
= path
.substr(this.path_
.length
);
59 armadillo
.PathControl
.prototype.getPath
= function() {
60 return app
.joinPath(this.path_
, this.name_
);
64 * Gets the name control.
65 * @returns {goog.ui.Control}
67 armadillo
.PathControl
.prototype.getNameControl
= function() {
68 return this.nameControl_
;
72 * Creates a new path control object.
74 armadillo
.PathControl
.prototype.createDom
= function() {
75 this.decorateInternal($.createDom('div'));
80 * Decorates the given element into a path control.
81 * @param {Element} element
83 armadillo
.PathControl
.prototype.decorateInternal
= function(element
) {
84 this.element_
= element
;
85 var components
= this.path_
.split('/');
87 // If this is an item that lives at the root, generate a special node for
88 // moving between items at the top level.
91 // If the last component is emtpy, do not use it because it means a directory
93 if (components
[components
.length
- 1] == '') {
94 components
.splice(-1);
98 $.each(components
, function (i
, part
) {
99 this.element_
.append(this.createComponentNode_(path
, part
), true);
100 path
= app
.joinPath(path
, part
);
103 if (this.editableLastComponent_
) {
104 this.nameControl_
= $.createDom('input');
105 this.nameControl_
.attr({
111 this.nameControl_
.bind('change keydown', this.nameChanged_
.bind(this));
113 this.nameControl_
= $.createDom('span').text(this.name_
);
116 this.element_
.append(this.nameControl_
);
122 armadillo
.PathControl
.prototype.enterDocument
= function() {
123 armadillo
.PathControl
.superClass_
.enterDocument
.call(this);
124 this.nameControl_
.getElement().focus();
128 * Creates a node for a single path component.
129 * @param {string} path The path up to this point.
130 * @param {string} name The current component after |path|.
132 armadillo
.PathControl
.prototype.createComponentNode_
= function(path
, name
) {
133 var menu
= $.createDom('select');
134 this.fetchMenuContents_(path
, name
, menu
);
136 var option
= $.createDom('option');
137 option
.text(name
).attr('selected', 'selected');
140 menu
.change(this.componentChanged_
.bind(this));
146 * Queries the back-end for all the items at a given path and attaches them to
148 * @param {string} path The path to get a list of items in
149 * @param {string} name The name to select
150 * @param {goog.ui.Menu} The menu to attach items to
152 armadillo
.PathControl
.prototype.fetchMenuContents_
= function(path
, name
, menu
) {
153 var callback
= function(data
, status
, xhr
) {
155 app
.showError(data
['message']);
159 // If this is the root path element, make sure the root is accessible for
161 data
.splice(0, 1, '/');
164 $.each(data
, function (i
, caption
) {
165 // It only makes sense to be able to move into directories.
166 if (!app
.isDirectory(caption
)) {
169 var item
= $.createDom('option');
170 item
.val(app
.joinPath(path
, name
, caption
)).text(caption
);
172 if (caption
== name
) {
173 item
.attr('selected', 'selected');
177 app
.sendRequest('list', {'path' : app
.joinPath(path
, name
)}, callback
);
181 * Handler for changing a component of the control.
184 armadillo
.PathControl
.prototype.componentChanged_
= function(e
) {
185 this.path_
= $(e
.target
).val();
186 this.element_
.empty();
187 this.decorateInternal(this.element_
);
191 * Handler for changing the editable name component.
194 armadillo
.PathControl
.prototype.nameChanged_
= function(e
) {
196 // TODO: assert(this.editableLastComponent_)
197 this.name_
= e
.target
.value
;