OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 'use strict'; | 5 'use strict'; |
6 | 6 |
7 /** | 7 /** |
8 * FileGrid constructor. | 8 * FileGrid constructor. |
9 * | 9 * |
10 * Represents grid for the Grid Vew in the File Manager. | 10 * Represents grid for the Grid Vew in the File Manager. |
(...skipping 17 matching lines...) Expand all Loading... |
28 /** | 28 /** |
29 * Inherits from cr.ui.Grid. | 29 * Inherits from cr.ui.Grid. |
30 */ | 30 */ |
31 FileGrid.prototype.__proto__ = cr.ui.Grid.prototype; | 31 FileGrid.prototype.__proto__ = cr.ui.Grid.prototype; |
32 | 32 |
33 /** | 33 /** |
34 * Decorates an HTML element to be a FileGrid. | 34 * Decorates an HTML element to be a FileGrid. |
35 * @param {HTMLElement} self The grid to decorate. | 35 * @param {HTMLElement} self The grid to decorate. |
36 * @param {MetadataCache} metadataCache Metadata cache to find entries | 36 * @param {MetadataCache} metadataCache Metadata cache to find entries |
37 * metadata. | 37 * metadata. |
| 38 * @param {VolumeManagerWrapper} volumeManager Volume manager instance. |
38 */ | 39 */ |
39 FileGrid.decorate = function(self, metadataCache) { | 40 FileGrid.decorate = function(self, metadataCache, volumeManager) { |
40 cr.ui.Grid.decorate(self); | 41 cr.ui.Grid.decorate(self); |
41 self.__proto__ = FileGrid.prototype; | 42 self.__proto__ = FileGrid.prototype; |
42 self.metadataCache_ = metadataCache; | 43 self.metadataCache_ = metadataCache; |
| 44 self.volumeManager_ = volumeManager; |
43 | 45 |
44 self.scrollBar_ = new MainPanelScrollBar(); | 46 self.scrollBar_ = new MainPanelScrollBar(); |
45 self.scrollBar_.initialize(self.parentNode, self); | 47 self.scrollBar_.initialize(self.parentNode, self); |
46 self.setBottomMarginForPanel(0); | 48 self.setBottomMarginForPanel(0); |
47 | 49 |
48 self.itemConstructor = function(entry) { | 50 self.itemConstructor = function(entry) { |
49 var item = self.ownerDocument.createElement('LI'); | 51 var item = self.ownerDocument.createElement('LI'); |
50 FileGrid.Item.decorate(item, entry, self); | 52 FileGrid.Item.decorate(item, entry, self); |
51 return item; | 53 return item; |
52 }; | 54 }; |
(...skipping 11 matching lines...) Expand all Loading... |
64 var boxes = this.querySelectorAll('.img-container'); | 66 var boxes = this.querySelectorAll('.img-container'); |
65 for (var i = 0; i < boxes.length; i++) { | 67 for (var i = 0; i < boxes.length; i++) { |
66 var box = boxes[i]; | 68 var box = boxes[i]; |
67 var entry = this.dataModel.item(this.getListItemAncestor(box)); | 69 var entry = this.dataModel.item(this.getListItemAncestor(box)); |
68 if (!entry || !(entry.toURL() in props)) | 70 if (!entry || !(entry.toURL() in props)) |
69 continue; | 71 continue; |
70 | 72 |
71 FileGrid.decorateThumbnailBox(box, | 73 FileGrid.decorateThumbnailBox(box, |
72 entry, | 74 entry, |
73 this.metadataCache_, | 75 this.metadataCache_, |
| 76 this.volumeManager_, |
74 ThumbnailLoader.FillMode.FIT, | 77 ThumbnailLoader.FillMode.FIT, |
75 FileGrid.ThumbnailQuality.HIGH); | 78 FileGrid.ThumbnailQuality.HIGH); |
76 } | 79 } |
77 }; | 80 }; |
78 | 81 |
79 /** | 82 /** |
80 * Redraws the UI. Skips multiple consecutive calls. | 83 * Redraws the UI. Skips multiple consecutive calls. |
81 */ | 84 */ |
82 FileGrid.prototype.relayout = function() { | 85 FileGrid.prototype.relayout = function() { |
83 this.relayoutAggregation_.run(); | 86 this.relayoutAggregation_.run(); |
84 }; | 87 }; |
85 | 88 |
86 /** | 89 /** |
87 * Redraws the UI immediately. | 90 * Redraws the UI immediately. |
88 * @private | 91 * @private |
89 */ | 92 */ |
90 FileGrid.prototype.relayoutImmediately_ = function() { | 93 FileGrid.prototype.relayoutImmediately_ = function() { |
91 this.startBatchUpdates(); | 94 this.startBatchUpdates(); |
92 this.columns = 0; | 95 this.columns = 0; |
93 this.redraw(); | 96 this.redraw(); |
94 this.endBatchUpdates(); | 97 this.endBatchUpdates(); |
95 cr.dispatchSimpleEvent(this, 'relayout'); | 98 cr.dispatchSimpleEvent(this, 'relayout'); |
96 }; | 99 }; |
97 | 100 |
98 /** | 101 /** |
99 * Decorates thumbnail. | 102 * Decorates thumbnail. |
100 * @param {HTMLElement} li List item. | 103 * @param {HTMLElement} li List item. |
101 * @param {Entry} entry Entry to render a thumbnail for. | 104 * @param {Entry} entry Entry to render a thumbnail for. |
102 * @param {MetadataCache} metadataCache To retrieve metadata. | 105 * @param {MetadataCache} metadataCache To retrieve metadata. |
| 106 * @param {VolumeManagerWrapper} volumeManager Volume manager instance. |
103 */ | 107 */ |
104 FileGrid.decorateThumbnail = function(li, entry, metadataCache) { | 108 FileGrid.decorateThumbnail = function(li, entry, metadataCache, volumeManager) { |
105 li.className = 'thumbnail-item'; | 109 li.className = 'thumbnail-item'; |
106 if (entry) | 110 if (entry) |
107 filelist.decorateListItem(li, entry, metadataCache); | 111 filelist.decorateListItem(li, entry, metadataCache); |
108 | 112 |
109 var frame = li.ownerDocument.createElement('div'); | 113 var frame = li.ownerDocument.createElement('div'); |
110 frame.className = 'thumbnail-frame'; | 114 frame.className = 'thumbnail-frame'; |
111 li.appendChild(frame); | 115 li.appendChild(frame); |
112 | 116 |
113 var box = li.ownerDocument.createElement('div'); | 117 var box = li.ownerDocument.createElement('div'); |
114 if (entry) { | 118 if (entry) { |
115 FileGrid.decorateThumbnailBox(box, | 119 FileGrid.decorateThumbnailBox(box, |
116 entry, | 120 entry, |
117 metadataCache, | 121 metadataCache, |
| 122 volumeManager, |
118 ThumbnailLoader.FillMode.AUTO, | 123 ThumbnailLoader.FillMode.AUTO, |
119 FileGrid.ThumbnailQuality.HIGH); | 124 FileGrid.ThumbnailQuality.HIGH); |
120 } | 125 } |
121 frame.appendChild(box); | 126 frame.appendChild(box); |
122 | 127 |
123 var bottom = li.ownerDocument.createElement('div'); | 128 var bottom = li.ownerDocument.createElement('div'); |
124 bottom.className = 'thumbnail-bottom'; | 129 bottom.className = 'thumbnail-bottom'; |
125 bottom.appendChild(filelist.renderFileNameLabel(li.ownerDocument, entry)); | 130 bottom.appendChild(filelist.renderFileNameLabel(li.ownerDocument, entry)); |
126 frame.appendChild(bottom); | 131 frame.appendChild(bottom); |
127 }; | 132 }; |
128 | 133 |
129 /** | 134 /** |
130 * Decorates the box containing a centered thumbnail image. | 135 * Decorates the box containing a centered thumbnail image. |
131 * | 136 * |
132 * @param {HTMLDivElement} box Box to decorate. | 137 * @param {HTMLDivElement} box Box to decorate. |
133 * @param {Entry} entry Entry which thumbnail is generating for. | 138 * @param {Entry} entry Entry which thumbnail is generating for. |
134 * @param {MetadataCache} metadataCache To retrieve metadata. | 139 * @param {MetadataCache} metadataCache To retrieve metadata. |
| 140 * @param {VolumeManagerWrapper} volumeManager Volume manager instance. |
135 * @param {ThumbnailLoader.FillMode} fillMode Fill mode. | 141 * @param {ThumbnailLoader.FillMode} fillMode Fill mode. |
136 * @param {FileGrid.ThumbnailQuality} quality Thumbnail quality. | 142 * @param {FileGrid.ThumbnailQuality} quality Thumbnail quality. |
137 * @param {function(HTMLElement)=} opt_imageLoadCallback Callback called when | 143 * @param {function(HTMLElement)=} opt_imageLoadCallback Callback called when |
138 * the image has been loaded before inserting it into the DOM. | 144 * the image has been loaded before inserting it into the DOM. |
139 */ | 145 */ |
140 FileGrid.decorateThumbnailBox = function( | 146 FileGrid.decorateThumbnailBox = function( |
141 box, entry, metadataCache, fillMode, quality, opt_imageLoadCallback) { | 147 box, entry, metadataCache, volumeManager, fillMode, quality, |
| 148 opt_imageLoadCallback) { |
142 box.className = 'img-container'; | 149 box.className = 'img-container'; |
143 if (entry.isDirectory) { | 150 if (entry.isDirectory) { |
144 box.setAttribute('generic-thumbnail', 'folder'); | 151 box.setAttribute('generic-thumbnail', 'folder'); |
145 if (opt_imageLoadCallback) | 152 if (opt_imageLoadCallback) |
146 setTimeout(opt_imageLoadCallback, 0, null /* callback parameter */); | 153 setTimeout(opt_imageLoadCallback, 0, null /* callback parameter */); |
147 return; | 154 return; |
148 } | 155 } |
149 | 156 |
150 var metadataTypes = 'thumbnail|filesystem'; | 157 var metadataTypes = 'thumbnail|filesystem'; |
151 | 158 |
152 // TODO(mtomasz): Use Entry instead of paths. | 159 var locationInfo = volumeManager.getLocationInfo(entry); |
153 if (PathUtil.isDriveBasedPath(entry.fullPath)) { | 160 if (locationInfo && locationInfo.isDriveBased) { |
154 metadataTypes += '|drive'; | 161 metadataTypes += '|drive'; |
155 } else { | 162 } else { |
156 // TODO(dgozman): If we ask for 'media' for a Drive file we fall into an | 163 // TODO(dgozman): If we ask for 'media' for a Drive file we fall into an |
157 // infinite loop. | 164 // infinite loop. |
158 metadataTypes += '|media'; | 165 metadataTypes += '|media'; |
159 } | 166 } |
160 | 167 |
161 // Drive provides high quality thumbnails via USE_EMBEDDED, however local | 168 // Drive provides high quality thumbnails via USE_EMBEDDED, however local |
162 // images usually provide very tiny thumbnails, therefore USE_EMBEDDE can't | 169 // images usually provide very tiny thumbnails, therefore USE_EMBEDDE can't |
163 // be used to obtain high quality output. | 170 // be used to obtain high quality output. |
164 var useEmbedded; | 171 var useEmbedded; |
165 switch (quality) { | 172 switch (quality) { |
166 case FileGrid.ThumbnailQuality.LOW: | 173 case FileGrid.ThumbnailQuality.LOW: |
167 useEmbedded = ThumbnailLoader.UseEmbedded.USE_EMBEDDED; | 174 useEmbedded = ThumbnailLoader.UseEmbedded.USE_EMBEDDED; |
168 break; | 175 break; |
169 case FileGrid.ThumbnailQuality.HIGH: | 176 case FileGrid.ThumbnailQuality.HIGH: |
170 // TODO(mtomasz): Use Entry instead of paths. | 177 // TODO(mtomasz): Use Entry instead of paths. |
171 useEmbedded = PathUtil.isDriveBasedPath(entry.fullPath) ? | 178 useEmbedded = (locationInfo && locationInfo.isDriveBased) ? |
172 ThumbnailLoader.UseEmbedded.USE_EMBEDDED : | 179 ThumbnailLoader.UseEmbedded.USE_EMBEDDED : |
173 ThumbnailLoader.UseEmbedded.NO_EMBEDDED; | 180 ThumbnailLoader.UseEmbedded.NO_EMBEDDED; |
174 break; | 181 break; |
175 } | 182 } |
176 | 183 |
177 metadataCache.get(entry, metadataTypes, | 184 metadataCache.get(entry, metadataTypes, |
178 function(metadata) { | 185 function(metadata) { |
179 new ThumbnailLoader(entry, | 186 new ThumbnailLoader(entry, |
180 ThumbnailLoader.LoaderType.IMAGE, | 187 ThumbnailLoader.LoaderType.IMAGE, |
181 metadata, | 188 metadata, |
(...skipping 29 matching lines...) Expand all Loading... |
211 } | 218 } |
212 }); | 219 }); |
213 | 220 |
214 /** | 221 /** |
215 * @param {Element} li List item element. | 222 * @param {Element} li List item element. |
216 * @param {Entry} entry File entry. | 223 * @param {Entry} entry File entry. |
217 * @param {FileGrid} grid Owner. | 224 * @param {FileGrid} grid Owner. |
218 */ | 225 */ |
219 FileGrid.Item.decorate = function(li, entry, grid) { | 226 FileGrid.Item.decorate = function(li, entry, grid) { |
220 li.__proto__ = FileGrid.Item.prototype; | 227 li.__proto__ = FileGrid.Item.prototype; |
221 FileGrid.decorateThumbnail(li, entry, grid.metadataCache_, true); | 228 // TODO(mtomasz): Pass the metadata cache and the volume manager directly |
| 229 // instead of accessing private members of grid. |
| 230 FileGrid.decorateThumbnail( |
| 231 li, entry, grid.metadataCache_, grid.volumeManager_, true); |
222 | 232 |
223 // Override the default role 'listitem' to 'option' to match the parent's | 233 // Override the default role 'listitem' to 'option' to match the parent's |
224 // role (listbox). | 234 // role (listbox). |
225 li.setAttribute('role', 'option'); | 235 li.setAttribute('role', 'option'); |
226 }; | 236 }; |
227 | 237 |
228 /** | 238 /** |
229 * Sets the margin height for the transparent preview panel at the bottom. | 239 * Sets the margin height for the transparent preview panel at the bottom. |
230 * @param {number} margin Margin to be set in px. | 240 * @param {number} margin Margin to be set in px. |
231 */ | 241 */ |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 for (var horizontalIndex = horizontalStartIndex; | 305 for (var horizontalIndex = horizontalStartIndex; |
296 horizontalIndex < horizontalEndIndex; | 306 horizontalIndex < horizontalEndIndex; |
297 horizontalIndex++) { | 307 horizontalIndex++) { |
298 var index = indexBase + horizontalIndex; | 308 var index = indexBase + horizontalIndex; |
299 if (0 <= index && index < this.dataModel.length) | 309 if (0 <= index && index < this.dataModel.length) |
300 currentSelection.push(index); | 310 currentSelection.push(index); |
301 } | 311 } |
302 } | 312 } |
303 return currentSelection; | 313 return currentSelection; |
304 }; | 314 }; |
OLD | NEW |