Index: chrome/browser/resources/file_manager/js/ui/preview_panel.js |
diff --git a/chrome/browser/resources/file_manager/js/ui/preview_panel.js b/chrome/browser/resources/file_manager/js/ui/preview_panel.js |
deleted file mode 100644 |
index b26a9527bbfebeba9a775808aa3b52946f155493..0000000000000000000000000000000000000000 |
--- a/chrome/browser/resources/file_manager/js/ui/preview_panel.js |
+++ /dev/null |
@@ -1,500 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-'use strict'; |
- |
-/** |
- * PreviewPanel UI class. |
- * @param {HTMLElement} element DOM Element of preview panel. |
- * @param {PreviewPanel.VisibilityType} visibilityType Initial value of the |
- * visibility type. |
- * @param {string} currentPath Initial value of the current path. |
- * @param {MetadataCache} metadataCache Metadata cache. |
- * @constructor |
- * @extends {cr.EventTarget} |
- */ |
-var PreviewPanel = function(element, |
- visibilityType, |
- currentPath, |
- metadataCache) { |
- /** |
- * The cached height of preview panel. |
- * @type {number} |
- * @private |
- */ |
- this.height_ = 0; |
- |
- /** |
- * Visibility type of the preview panel. |
- * @type {PreviewPanel.VisiblityType} |
- * @private |
- */ |
- this.visibilityType_ = visibilityType; |
- |
- /** |
- * Current path to be displayed. |
- * @type {string} |
- * @private |
- */ |
- this.currentPath_ = currentPath || '/'; |
- |
- /** |
- * Dom element of the preview panel. |
- * @type {HTMLElement} |
- * @private |
- */ |
- this.element_ = element; |
- |
- /** |
- * @type {BreadcrumbsController} |
- */ |
- this.breadcrumbs = new BreadcrumbsController( |
- element.querySelector('#search-breadcrumbs'), metadataCache); |
- |
- /** |
- * @type {PreviewPanel.Thumbnails} |
- */ |
- this.thumbnails = new PreviewPanel.Thumbnails( |
- element.querySelector('.preview-thumbnails'), metadataCache); |
- |
- /** |
- * @type {HTMLElement} |
- * @private |
- */ |
- this.summaryElement_ = element.querySelector('.preview-summary'); |
- |
- /** |
- * @type {PreviewPanel.CalculatingSizeLabel} |
- * @private |
- */ |
- this.calculatingSizeLabel_ = new PreviewPanel.CalculatingSizeLabel( |
- this.summaryElement_.querySelector('.calculating-size')); |
- |
- /** |
- * @type {HTMLElement} |
- * @private |
- */ |
- this.previewText_ = element.querySelector('.preview-text'); |
- |
- /** |
- * FileSelection to be displayed. |
- * @type {FileSelection} |
- * @private |
- */ |
- this.selection_ = {entries: [], computeBytes: function() {}}; |
- |
- /** |
- * Sequence value that is incremented by every selection update and is used to |
- * check if the callback is up to date or not. |
- * @type {number} |
- * @private |
- */ |
- this.sequence_ = 0; |
- |
- cr.EventTarget.call(this); |
-}; |
- |
-/** |
- * Name of PreviewPanels's event. |
- * @enum {string} |
- * @const |
- */ |
-PreviewPanel.Event = Object.freeze({ |
- // Event to be triggered at the end of visibility change. |
- VISIBILITY_CHANGE: 'visibilityChange' |
-}); |
- |
-/** |
- * Visibility type of the preview panel. |
- */ |
-PreviewPanel.VisibilityType = Object.freeze({ |
- // Preview panel always shows. |
- ALWAYS_VISIBLE: 'alwaysVisible', |
- // Preview panel shows when the selection property are set. |
- AUTO: 'auto', |
- // Preview panel does not show. |
- ALWAYS_HIDDEN: 'alwaysHidden' |
-}); |
- |
-/** |
- * @private |
- */ |
-PreviewPanel.Visibility_ = Object.freeze({ |
- VISIBLE: 'visible', |
- HIDING: 'hiding', |
- HIDDEN: 'hidden' |
-}); |
- |
-PreviewPanel.prototype = { |
- __proto__: cr.EventTarget.prototype, |
- |
- /** |
- * Setter for the current path. |
- * @param {string} path New path. |
- */ |
- set currentPath(path) { |
- this.currentPath_ = path; |
- this.updateVisibility_(); |
- this.updatePreviewArea_(); |
- }, |
- |
- /** |
- * Setter for the visibility type. |
- * @param {PreviewPanel.VisibilityType} visibilityType New value of visibility |
- * type. |
- */ |
- set visibilityType(visibilityType) { |
- this.visibilityType_ = visibilityType; |
- this.updateVisibility_(); |
- }, |
- |
- get visible() { |
- return this.element_.getAttribute('visibility') == |
- PreviewPanel.Visibility_.VISIBLE; |
- }, |
- |
- /** |
- * Obtains the height of preview panel. |
- * @return {number} Height of preview panel. |
- */ |
- get height() { |
- this.height_ = this.height_ || this.element_.clientHeight; |
- return this.height_; |
- } |
-}; |
- |
-/** |
- * Initializes the element. |
- */ |
-PreviewPanel.prototype.initialize = function() { |
- this.element_.addEventListener('webkitTransitionEnd', |
- this.onTransitionEnd_.bind(this)); |
- this.updatePreviewArea_(); |
- this.updateVisibility_(); |
-}; |
- |
-/** |
- * Apply the selection and update the view of the preview panel. |
- * @param {FileSelection} selection Selection to be applied. |
- */ |
-PreviewPanel.prototype.setSelection = function(selection) { |
- this.sequence_++; |
- this.selection_ = selection; |
- this.updateVisibility_(); |
- this.updatePreviewArea_(); |
-}; |
- |
-/** |
- * Update the visibility of the preview panel. |
- * @private |
- */ |
-PreviewPanel.prototype.updateVisibility_ = function() { |
- // Get the new visibility value. |
- var visibility = this.element_.getAttribute('visibility'); |
- var newVisible = null; |
- switch (this.visibilityType_) { |
- case PreviewPanel.VisibilityType.ALWAYS_VISIBLE: |
- newVisible = true; |
- break; |
- case PreviewPanel.VisibilityType.AUTO: |
- newVisible = this.selection_.entries.length != 0 || |
- !PathUtil.isRootPath(this.currentPath_); |
- break; |
- case PreviewPanel.VisibilityType.ALWAYS_HIDDEN: |
- newVisible = false; |
- break; |
- default: |
- console.error('Invalid visibilityType.'); |
- return; |
- } |
- |
- // If the visibility has been already the new value, just return. |
- if ((visibility == PreviewPanel.Visibility_.VISIBLE && newVisible) || |
- (visibility == PreviewPanel.Visibility_.HIDDEN && !newVisible)) |
- return; |
- |
- // Set the new visibility value. |
- if (newVisible) { |
- this.element_.setAttribute('visibility', PreviewPanel.Visibility_.VISIBLE); |
- cr.dispatchSimpleEvent(this, PreviewPanel.Event.VISIBILITY_CHANGE); |
- } else { |
- this.element_.setAttribute('visibility', PreviewPanel.Visibility_.HIDING); |
- } |
-}; |
- |
-/** |
- * Update the text in the preview panel. |
- * |
- * @param {boolean} breadCrumbsVisible Whether the bread crumbs is visible or |
- * not. |
- * @private |
- */ |
-PreviewPanel.prototype.updatePreviewArea_ = function(breadCrumbsVisible) { |
- var selection = this.selection_; |
- |
- // Check if the breadcrumb list should show instead on the preview text. |
- var path; |
- if (this.selection_.totalCount == 1) |
- path = this.selection_.entries[0].fullPath; |
- else if (this.selection_.totalCount == 0) |
- path = this.currentPath_; |
- |
- if (path) { |
- this.breadcrumbs.show(PathUtil.getRootPath(path), path); |
- this.calculatingSizeLabel_.hidden = true; |
- this.previewText_.textContent = ''; |
- return; |
- } |
- this.breadcrumbs.hide(); |
- |
- // Obtains the preview text. |
- var text; |
- if (selection.directoryCount == 0) |
- text = strf('MANY_FILES_SELECTED', selection.fileCount); |
- else if (selection.fileCount == 0) |
- text = strf('MANY_DIRECTORIES_SELECTED', selection.directoryCount); |
- else |
- text = strf('MANY_ENTRIES_SELECTED', selection.totalCount); |
- |
- // Obtains the size of files. |
- this.calculatingSizeLabel_.hidden = selection.bytesKnown; |
- if (selection.bytesKnown && selection.showBytes) |
- text += ', ' + util.bytesToString(selection.bytes); |
- |
- // Set the preview text to the element. |
- this.previewText_.textContent = text; |
- |
- // Request the byte calculation if needed. |
- if (!selection.bytesKnown) { |
- this.selection_.computeBytes(function(sequence) { |
- // Selection has been already updated. |
- if (this.sequence_ != sequence) |
- return; |
- this.updatePreviewArea_(); |
- }.bind(this, this.sequence_)); |
- } |
-}; |
- |
-/** |
- * Event handler to be called at the end of hiding transition. |
- * @param {Event} event The webkitTransitionEnd event. |
- * @private |
- */ |
-PreviewPanel.prototype.onTransitionEnd_ = function(event) { |
- if (event.target != this.element_ || event.propertyName != 'opacity') |
- return; |
- var visibility = this.element_.getAttribute('visibility'); |
- if (visibility != PreviewPanel.Visibility_.HIDING) |
- return; |
- this.element_.setAttribute('visibility', PreviewPanel.Visibility_.HIDDEN); |
- cr.dispatchSimpleEvent(this, PreviewPanel.Event.VISIBILITY_CHANGE); |
-}; |
- |
-/** |
- * Animating label that is shown during the bytes of selection entries is being |
- * calculated. |
- * |
- * This label shows dots and varying the number of dots every |
- * CalculatingSizeLabel.PERIOD milliseconds. |
- * @param {HTMLElement} element DOM element of the label. |
- * @constructor |
- */ |
-PreviewPanel.CalculatingSizeLabel = function(element) { |
- this.element_ = element; |
- this.count_ = 0; |
- this.intervalID_ = null; |
- Object.seal(this); |
-}; |
- |
-/** |
- * Time period in milliseconds. |
- * @const {number} |
- */ |
-PreviewPanel.CalculatingSizeLabel.PERIOD = 500; |
- |
-PreviewPanel.CalculatingSizeLabel.prototype = { |
- /** |
- * Set visibility of the label. |
- * When it is displayed, the text is animated. |
- * @param {boolean} hidden Whether to hide the label or not. |
- */ |
- set hidden(hidden) { |
- this.element_.hidden = hidden; |
- if (!hidden) { |
- if (this.intervalID_ != null) |
- return; |
- this.count_ = 2; |
- this.intervalID_ = |
- setInterval(this.onStep_.bind(this), |
- PreviewPanel.CalculatingSizeLabel.PERIOD); |
- this.onStep_(); |
- } else { |
- if (this.intervalID_ == null) |
- return; |
- clearInterval(this.intervalID_); |
- this.intervalID_ = null; |
- } |
- } |
-}; |
- |
-/** |
- * Increments the counter and updates the number of dots. |
- * @private |
- */ |
-PreviewPanel.CalculatingSizeLabel.prototype.onStep_ = function() { |
- var text = str('CALCULATING_SIZE'); |
- for (var i = 0; i < ~~(this.count_ / 2) % 4; i++) { |
- text += '.'; |
- } |
- this.element_.textContent = text; |
- this.count_++; |
-}; |
- |
-/** |
- * Thumbnails on the preview panel. |
- * |
- * @param {HTMLElement} element DOM Element of thumbnail container. |
- * @param {MetadataCache} metadataCache MetadataCache. |
- * @constructor |
- */ |
-PreviewPanel.Thumbnails = function(element, metadataCache) { |
- this.element_ = element; |
- this.metadataCache_ = metadataCache; |
- this.sequence_ = 0; |
- Object.seal(this); |
-}; |
- |
-/** |
- * Maximum number of thumbnails. |
- * @const {number} |
- */ |
-PreviewPanel.Thumbnails.MAX_THUMBNAIL_COUNT = 4; |
- |
-/** |
- * Edge length of the thumbnail square. |
- * @const {number} |
- */ |
-PreviewPanel.Thumbnails.THUMBNAIL_SIZE = 35; |
- |
-/** |
- * Longer edge length of zoomed thumbnail rectangle. |
- * @const {number} |
- */ |
-PreviewPanel.Thumbnails.ZOOMED_THUMBNAIL_SIZE = 200; |
- |
-PreviewPanel.Thumbnails.prototype = { |
- /** |
- * Sets entries to be displayed in the view. |
- * @param {Array.<Entry>} value Entries. |
- */ |
- set selection(value) { |
- this.sequence_++; |
- this.loadThumbnails_(value); |
- } |
-}; |
- |
-/** |
- * Loads thumbnail images. |
- * @param {FileSelection} selection Selection containing entries that are |
- * sources of images. |
- * @private |
- */ |
-PreviewPanel.Thumbnails.prototype.loadThumbnails_ = function(selection) { |
- var entries = selection.entries; |
- this.element_.classList.remove('has-zoom'); |
- this.element_.innerText = ''; |
- var clickHandler = selection.tasks && |
- selection.tasks.executeDefault.bind(selection.tasks); |
- var length = Math.min(entries.length, |
- PreviewPanel.Thumbnails.MAX_THUMBNAIL_COUNT); |
- for (var i = 0; i < length; i++) { |
- // Create a box. |
- var box = this.element_.ownerDocument.createElement('div'); |
- box.style.zIndex = PreviewPanel.Thumbnails.MAX_THUMBNAIL_COUNT + 1 - i; |
- |
- // Load the image. |
- if (entries[i]) { |
- FileGrid.decorateThumbnailBox(box, |
- entries[i], |
- this.metadataCache_, |
- ThumbnailLoader.FillMode.FILL, |
- FileGrid.ThumbnailQuality.LOW, |
- i == 0 && length == 1 && |
- this.setZoomedImage_.bind(this)); |
- } |
- |
- // Register the click handler. |
- if (clickHandler) |
- box.addEventListener('click', clickHandler); |
- |
- // Append |
- this.element_.appendChild(box); |
- } |
-}; |
- |
-/** |
- * Create the zoomed version of image and set it to the DOM element to show the |
- * zoomed image. |
- * |
- * @param {Image} image Image to be source of the zoomed image. |
- * @param {transform} transform Transformation to be applied to the image. |
- * @private |
- */ |
-PreviewPanel.Thumbnails.prototype.setZoomedImage_ = |
- function(image, transform) { |
- if (!image) |
- return; |
- var width = image.width || 0; |
- var height = image.height || 0; |
- if (width == 0 || |
- height == 0 || |
- (width < PreviewPanel.Thumbnails.THUMBNAIL_SIZE * 2 && |
- height < PreviewPanel.Thumbnails.THUMBNAIL_SIZE * 2)) |
- return; |
- |
- var scale = Math.min(1, |
- PreviewPanel.Thumbnails.ZOOMED_THUMBNAIL_SIZE / |
- Math.max(width, height)); |
- var imageWidth = ~~(width * scale); |
- var imageHeight = ~~(height * scale); |
- var zoomedImage = this.element_.ownerDocument.createElement('img'); |
- |
- if (scale < 0.3) { |
- // Scaling large images kills animation. Downscale it in advance. |
- // Canvas scales images with liner interpolation. Make a larger |
- // image (but small enough to not kill animation) and let IMAGE |
- // scale it smoothly. |
- var INTERMEDIATE_SCALE = 3; |
- var canvas = this.element_.ownerDocument.createElement('canvas'); |
- canvas.width = imageWidth * INTERMEDIATE_SCALE; |
- canvas.height = imageHeight * INTERMEDIATE_SCALE; |
- var ctx = canvas.getContext('2d'); |
- ctx.drawImage(image, 0, 0, canvas.width, canvas.height); |
- // Using bigger than default compression reduces image size by |
- // several times. Quality degradation compensated by greater resolution. |
- zoomedImage.src = canvas.toDataURL('image/jpeg', 0.6); |
- } else { |
- zoomedImage.src = image.src; |
- } |
- |
- var boxWidth = Math.max(PreviewPanel.Thumbnails.THUMBNAIL_SIZE, imageWidth); |
- var boxHeight = Math.max(PreviewPanel.Thumbnails.THUMBNAIL_SIZE, imageHeight); |
- if (transform && transform.rotate90 % 2 == 1) { |
- var t = boxWidth; |
- boxWidth = boxHeight; |
- boxHeight = t; |
- } |
- |
- util.applyTransform(zoomedImage, transform); |
- |
- var zoomedBox = this.element_.ownerDocument.createElement('div'); |
- zoomedBox.className = 'popup'; |
- zoomedBox.style.width = boxWidth + 'px'; |
- zoomedBox.style.height = boxHeight + 'px'; |
- zoomedBox.appendChild(zoomedImage); |
- |
- this.element_.appendChild(zoomedBox); |
- this.element_.classList.add('has-zoom'); |
- return; |
-}; |