Index: ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js |
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js |
index a49d2d959746c384dd357bfa116316916ac8c925..98b40e6ef50ac08a3d8b4607f6096fa17ac0bbf3 100644 |
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js |
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js |
@@ -107,6 +107,27 @@ function FileManagerUI(element, dialogType) { |
this.toggleViewButton = queryRequiredElement(this.element_, '#view-button'); |
/** |
+ * The button to open gear menu. |
+ * @type {!cr.ui.MenuButton} |
+ */ |
+ this.gearButton = FileManagerUI.queryDecoratedElement_( |
+ '#gear-button', cr.ui.MenuButton); |
+ |
+ /** |
+ * Directory tree. |
+ * @type {DirectoryTree} |
+ */ |
+ this.directoryTree = null; |
+ |
+ /** |
+ * Progress center panel. |
+ * @type {!ProgressCenterPanel} |
+ * @const |
+ */ |
+ this.progressCenterPanel = new ProgressCenterPanel( |
+ queryRequiredElement(this.element_, '#progress-center')); |
+ |
+ /** |
* List container. |
* @type {ListContainer} |
*/ |
@@ -118,6 +139,14 @@ function FileManagerUI(element, dialogType) { |
this.previewPanel = null; |
/** |
+ * The combo button to specify the task. |
+ * @type {!cr.ui.ComboButton} |
+ * @const |
+ */ |
+ this.taskMenuButton = FileManagerUI.queryDecoratedElement_( |
+ '#tasks', cr.ui.ComboButton); |
+ |
+ /** |
* Dialog footer. |
* @type {!DialogFooter} |
*/ |
@@ -141,6 +170,21 @@ function FileManagerUI(element, dialogType) { |
} |
/** |
+ * Obtains the element that should exist, decorates it with given type, and |
+ * returns it. |
+ * @param {string} query Query for the element. |
+ * @param {function(new: T, ...)} type Type used to decorate. |
+ * @private |
+ * @template T |
+ * @return {!T} Decorated element. |
+ */ |
+FileManagerUI.queryDecoratedElement_ = function(query, type) { |
+ var element = queryRequiredElement(document, query); |
+ type.decorate(element); |
+ return element; |
+}; |
+ |
+/** |
* Initialize the dialogs. |
*/ |
FileManagerUI.prototype.initDialogs = function() { |
@@ -171,10 +215,11 @@ FileManagerUI.prototype.initDialogs = function() { |
* |
* @param {!FileTable} table |
* @param {!FileGrid} grid |
- * @param {PreviewPanel} previewPanel |
- * |
+ * @param {!PreviewPanel} previewPanel |
+ * @param {!LocationLine} locationLine |
*/ |
-FileManagerUI.prototype.initAdditionalUI = function(table, grid, previewPanel) { |
+FileManagerUI.prototype.initAdditionalUI = function( |
+ table, grid, previewPanel, locationLine) { |
// Listen to drag events to hide preview panel while user is dragging files. |
// Files.app prevents default actions in 'dragstart' in some situations, |
// so we listen to 'drag' to know the list is actually being dragged. |
@@ -196,23 +241,52 @@ FileManagerUI.prototype.initAdditionalUI = function(table, grid, previewPanel) { |
this.listContainer = new ListContainer( |
queryRequiredElement(this.element_, '#list-container'), table, grid); |
+ // Splitter. |
+ this.decorateSplitter_( |
+ queryRequiredElement(this.element_, '#navigation-list-splitter')); |
+ |
// Preview panel. |
this.previewPanel = previewPanel; |
this.previewPanel.addEventListener( |
PreviewPanel.Event.VISIBILITY_CHANGE, |
this.onPreviewPanelVisibilityChange_.bind(this)); |
this.previewPanel.initialize(); |
+ |
+ // Location line. |
+ this.locationLine = locationLine; |
+ |
+ // Add handlers. |
+ document.defaultView.addEventListener('resize', this.relayout.bind(this)); |
}; |
/** |
- * Relayout the UI. |
+ * TODO(hirono): Merge the method into initAdditionalUI. |
+ * @param {!DirectoryTree} directoryTree |
+ */ |
+FileManagerUI.prototype.initDirectoryTree = function(directoryTree) { |
+ this.directoryTree = directoryTree; |
+ // Visible height of the directory tree depends on the size of progress |
+ // center panel. When the size of progress center panel changes, directory |
+ // tree has to be notified to adjust its components (e.g. progress bar). |
+ var observer = |
+ new MutationObserver(directoryTree.relayout.bind(directoryTree)); |
+ observer.observe(this.progressCenterPanel.element, |
+ /** @type {MutationObserverInit} */ |
+ ({subtree: true, attributes: true, childList: true})); |
+}; |
+ |
+/** |
+ * Relayouts the UI. |
*/ |
FileManagerUI.prototype.relayout = function() { |
this.locationLine.truncate(); |
+ // May not be available during initialization. |
if (this.listContainer.currentListType !== |
ListContainer.ListType.UNINITIALIZED) { |
this.listContainer.currentView.relayout(); |
} |
+ if (this.directoryTree) |
+ this.directoryTree.relayout(); |
}; |
/** |
@@ -237,6 +311,8 @@ FileManagerUI.prototype.setCurrentListType = function(listType) { |
assertNotReached(); |
break; |
} |
+ |
+ this.relayout(); |
}; |
/** |
@@ -274,3 +350,35 @@ FileManagerUI.prototype.onPreviewPanelVisibilityChange_ = function() { |
this.listContainer.table.setBottomMarginForPanel(panelHeight); |
this.listContainer.grid.setBottomMarginForPanel(panelHeight); |
}; |
+ |
+/** |
+ * Decorates the given splitter element. |
+ * @param {!HTMLElement} splitterElement |
+ * @private |
+ */ |
+FileManagerUI.prototype.decorateSplitter_ = function(splitterElement) { |
+ var self = this; |
+ var Splitter = cr.ui.Splitter; |
+ var customSplitter = cr.ui.define('div'); |
+ |
+ customSplitter.prototype = { |
+ __proto__: Splitter.prototype, |
+ |
+ handleSplitterDragStart: function(e) { |
+ Splitter.prototype.handleSplitterDragStart.apply(this, arguments); |
+ this.ownerDocument.documentElement.classList.add('col-resize'); |
+ }, |
+ |
+ handleSplitterDragMove: function(deltaX) { |
+ Splitter.prototype.handleSplitterDragMove.apply(this, arguments); |
+ self.relayout(); |
+ }, |
+ |
+ handleSplitterDragEnd: function(e) { |
+ Splitter.prototype.handleSplitterDragEnd.apply(this, arguments); |
+ this.ownerDocument.documentElement.classList.remove('col-resize'); |
+ } |
+ }; |
+ |
+ customSplitter.decorate(splitterElement); |
+}; |