Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(263)

Side by Side Diff: chrome/browser/resources/file_manager/js/file_manager.js

Issue 10411018: [FileBrowser] Added DefaultAction dialog to choose default action. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed comments. Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 /** 5 /**
6 * FileManager constructor. 6 * FileManager constructor.
7 * 7 *
8 * FileManager objects encapsulate the functionality of the file selector 8 * FileManager objects encapsulate the functionality of the file selector
9 * dialogs, as well as the full screen file manager application (though the 9 * dialogs, as well as the full screen file manager application (though the
10 * latter is not yet implemented). 10 * latter is not yet implemented).
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 /** 522 /**
523 * One-time initialization of dialogs. 523 * One-time initialization of dialogs.
524 */ 524 */
525 FileManager.prototype.initDialogs_ = function() { 525 FileManager.prototype.initDialogs_ = function() {
526 var d = cr.ui.dialogs; 526 var d = cr.ui.dialogs;
527 d.BaseDialog.OK_LABEL = str('OK_LABEL'); 527 d.BaseDialog.OK_LABEL = str('OK_LABEL');
528 d.BaseDialog.CANCEL_LABEL = str('CANCEL_LABEL'); 528 d.BaseDialog.CANCEL_LABEL = str('CANCEL_LABEL');
529 this.alert = new d.AlertDialog(this.dialogDom_); 529 this.alert = new d.AlertDialog(this.dialogDom_);
530 this.confirm = new d.ConfirmDialog(this.dialogDom_); 530 this.confirm = new d.ConfirmDialog(this.dialogDom_);
531 this.prompt = new d.PromptDialog(this.dialogDom_); 531 this.prompt = new d.PromptDialog(this.dialogDom_);
532 this.defaultTaskPicker =
533 new cr.filebrowser.DefaultActionDialog(this.dialogDom_);
532 }; 534 };
533 535
534 /** 536 /**
535 * One-time initialization of various DOM nodes. 537 * One-time initialization of various DOM nodes.
536 */ 538 */
537 FileManager.prototype.initDom_ = function() { 539 FileManager.prototype.initDom_ = function() {
538 // Cache nodes we'll be manipulating. 540 // Cache nodes we'll be manipulating.
539 this.previewThumbnails_ = 541 this.previewThumbnails_ =
540 this.dialogDom_.querySelector('.preview-thumbnails'); 542 this.dialogDom_.querySelector('.preview-thumbnails');
541 this.previewPanel_ = this.dialogDom_.querySelector('.preview-panel'); 543 this.previewPanel_ = this.dialogDom_.querySelector('.preview-panel');
(...skipping 1950 matching lines...) Expand 10 before | Expand all | Expand 10 after
2492 return path && 2494 return path &&
2493 this.isGDataEnabled() && 2495 this.isGDataEnabled() &&
2494 DirectoryModel.getRootType(path) == DirectoryModel.RootType.GDATA; 2496 DirectoryModel.getRootType(path) == DirectoryModel.RootType.GDATA;
2495 }; 2497 };
2496 2498
2497 FileManager.prototype.getMetadataProvider = function() { 2499 FileManager.prototype.getMetadataProvider = function() {
2498 return this.metadataProvider_; 2500 return this.metadataProvider_;
2499 }; 2501 };
2500 2502
2501 /** 2503 /**
2504 * Creates combobox item based on task.
2505 * @param {Object} task Task to convert.
2506 * @return {Object} Item appendable to combobox drop-down list.
2507 */
2508 FileManager.prototype.createComboboxItem_ = function(task) {
2509 return { label: task.title, iconUrl: task.iconUrl, task: task };
2510 }
2511
2512 /**
2502 * Callback called when tasks for selected files are determined. 2513 * Callback called when tasks for selected files are determined.
2503 * @param {Object} selection Selection is passed here, since this.selection 2514 * @param {Object} selection Selection is passed here, since this.selection
2504 * can change before tasks were found, and we should be accurate. 2515 * can change before tasks were found, and we should be accurate.
2505 * @param {Array.<Task>} tasksList The tasks list. 2516 * @param {Array.<Task>} tasksList The tasks list.
2506 */ 2517 */
2507 FileManager.prototype.onTasksFound_ = function(selection, tasksList) { 2518 FileManager.prototype.onTasksFound_ = function(selection, tasksList) {
2508 this.taskItems_.clear(); 2519 this.taskItems_.clear();
2509 2520
2510 var defaultTask = null; 2521 var defaultTask = null;
2511 var tasksCount = 0; 2522 var dropDownItems = [];
2523
2512 for (var i = 0; i < tasksList.length; i++) { 2524 for (var i = 0; i < tasksList.length; i++) {
2513 var task = tasksList[i]; 2525 var task = tasksList[i];
2514 2526
2515 // Tweak images, titles of internal tasks. 2527 // Tweak images, titles of internal tasks.
2516 var task_parts = task.taskId.split('|'); 2528 var task_parts = task.taskId.split('|');
2517 if (task_parts[0] == this.getExtensionId_()) { 2529 if (task_parts[0] == this.getExtensionId_()) {
2518 if (task_parts[1] == 'play') { 2530 if (task_parts[1] == 'play') {
2519 // TODO(serya): This hack needed until task.iconUrl is working 2531 // TODO(serya): This hack needed until task.iconUrl is working
2520 // (see GetFileTasksFileBrowserFunction::RunImpl). 2532 // (see GetFileTasksFileBrowserFunction::RunImpl).
2521 task.iconUrl = 2533 task.iconUrl =
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2560 } else if (task_parts[1] == 'view-in-browser') { 2572 } else if (task_parts[1] == 'view-in-browser') {
2561 task.iconUrl = 2573 task.iconUrl =
2562 chrome.extension.getURL('images/filetype_generic.png'); 2574 chrome.extension.getURL('images/filetype_generic.png');
2563 task.title = str('ACTION_VIEW'); 2575 task.title = str('ACTION_VIEW');
2564 } else if (task_parts[1] == 'install-crx') { 2576 } else if (task_parts[1] == 'install-crx') {
2565 task.iconUrl = 2577 task.iconUrl =
2566 chrome.extension.getURL('images/filetype_generic.png'); 2578 chrome.extension.getURL('images/filetype_generic.png');
2567 task.title = str('INSTALL_CRX'); 2579 task.title = str('INSTALL_CRX');
2568 } 2580 }
2569 } 2581 }
2570 this.taskItems_.addItem(this.renderTaskItem_(task)); 2582
2571 tasksCount++; 2583 if (defaultTask == null) {
2572 if (defaultTask == null) defaultTask = task; 2584 defaultTask = task;
2585 this.taskItems_.defaultItem = this.createComboboxItem_(task);
2586 task.title = task.title + ' ' + str('DEFAULT_ACTION_LABEL');
2587 dropDownItems.push(this.createComboboxItem_(task));
2588 } else {
2589 dropDownItems.push(this.createComboboxItem_(task));
2590 }
2573 } 2591 }
2574 2592
2575 this.taskItems_.hidden = tasksCount == 0; 2593 var defaultIdx = 0;
2576 if (tasksCount > 1) { 2594 this.taskItems_.hidden = dropDownItems.length == 0;
2577 // Duplicate default task in drop-down list. 2595
2578 this.taskItems_.addItem(this.renderTaskItem_(defaultTask)); 2596 if (dropDownItems.length > 1) {
2597 dropDownItems.sort(function(a, b) {
2598 return a.label.localeCompare(b.label);
2599 });
2600
2601 for (var j = 0; j < dropDownItems.length; j++) {
2602 this.taskItems_.addDropDownItem(dropDownItems[j]);
2603 if (dropDownItems[j].task.taskId == defaultTask.taskId) {
2604 defaultIdx = j;
2605 }
2606 }
2607
2608 this.taskItems_.addSeparator();
2609 this.taskItems_.addDropDownItem({
2610 label: str('CHANGE_DEFAULT_MENU_ITEM'),
2611 items: dropDownItems,
2612 defaultIdx: defaultIdx
2613 });
2579 } 2614 }
2580 2615
2581 selection.tasksList = tasksList; 2616 selection.tasksList = tasksList;
2582 if (selection.dispatchDefault) { 2617 if (selection.dispatchDefault) {
2583 // We got a request to dispatch the default task for the selection. 2618 // We got a request to dispatch the default task for the selection.
2584 selection.dispatchDefault = false; 2619 selection.dispatchDefault = false;
2585 this.dispatchDefaultTask_(selection); 2620 this.dispatchDefaultTask_(selection);
2586 } 2621 }
2587 }; 2622 };
2588 2623
2589 FileManager.prototype.renderTaskItem_ = function(task) {
2590 var item = this.document_.createElement('div');
2591 item.className = 'task-item';
2592 item.task = task;
2593
2594 var img = this.document_.createElement('img');
2595 img.src = task.iconUrl;
2596 item.appendChild(img);
2597
2598 var label = this.document_.createElement('div');
2599 label.appendChild(this.document_.createTextNode(task.title));
2600 item.appendChild(label);
2601
2602 return item;
2603 };
2604
2605 FileManager.prototype.getExtensionId_ = function() { 2624 FileManager.prototype.getExtensionId_ = function() {
2606 return chrome.extension.getURL('').split('/')[2]; 2625 return chrome.extension.getURL('').split('/')[2];
2607 }; 2626 };
2608 2627
2609 FileManager.prototype.onExternalLinkClick_ = function(url) { 2628 FileManager.prototype.onExternalLinkClick_ = function(url) {
2610 chrome.tabs.create({url: url}); 2629 chrome.tabs.create({url: url});
2611 if (this.dialogType_ != FileManager.DialogType.FULL_PAGE) { 2630 if (this.dialogType_ != FileManager.DialogType.FULL_PAGE) {
2612 this.onCancel_(); 2631 this.onCancel_();
2613 } 2632 }
2614 }; 2633 };
2615 2634
2635 /**
2636 * Task combobox handler.
2637 *
2638 * @param {Object} event Event containing task which was clicked.
2639 */
2616 FileManager.prototype.onTaskItemClicked_ = function(event) { 2640 FileManager.prototype.onTaskItemClicked_ = function(event) {
2617 this.dispatchFileTask_(event.item.task.taskId, this.selection.urls); 2641 if (event.item.task) {
2642 // Task field doesn't exist on change-default dropdown item.
2643 this.dispatchFileTask_(event.item.task.taskId, this.selection.urls);
2644 } else {
2645 var extensions = [];
2646
2647 for (var i = 0; i < this.selection.urls.length; i++) {
2648 var match = /\.(\w+)$/g.exec(this.selection.urls[i]);
2649 if (match) {
2650 var ext = match[1].toUpperCase();
2651 if (extensions.indexOf(ext) == -1) {
2652 extensions.push(ext);
2653 }
2654 }
2655 }
2656
2657 var format = '';
2658
2659 if (extensions.length != 1) {
2660 format = extensions[0];
2661 }
2662
2663 // Change default was clicked. We should open "change default" dialog.
2664 this.defaultTaskPicker.show(
2665 strf('CHANGE_DEFAULT_CAPTION', format),
2666 event.item.items, event.item.defaultIdx,
2667 this.onDefaultTaskDone_.bind(this));
2668 }
2618 }; 2669 };
2619 2670
2671
2672 /**
2673 * Set's given task as default, when this task is applicable.
2674 * @param {Object} task Task to set as default.
2675 */
2676 FileManager.prototype.onDefaultTaskDone_ = function(task) {
2677 chrome.fileBrowserPrivate.setDefaultTask(task.taskId);
2678
2679 chrome.fileBrowserPrivate.getFileTasks(
2680 this.selection.urls,
2681 this.onTasksFound_.bind(this, this.selection));
2682 }
2683
2620 /** 2684 /**
2621 * Dispatches default task for the current selection. If tasks are not ready 2685 * Dispatches default task for the current selection. If tasks are not ready
2622 * yet, dispatches after task are available. 2686 * yet, dispatches after task are available.
2623 * @param {Object=} opt_selection Object similar to this.selection. 2687 * @param {Object=} opt_selection Object similar to this.selection.
2624 */ 2688 */
2625 FileManager.prototype.dispatchDefaultTask_ = function(opt_selection) { 2689 FileManager.prototype.dispatchDefaultTask_ = function(opt_selection) {
2626 var selection = opt_selection || this.selection; 2690 var selection = opt_selection || this.selection;
2627 2691
2628 if (selection.urls.length == 0) 2692 if (selection.urls.length == 0)
2629 return; 2693 return;
(...skipping 2117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4747 4811
4748 function closeBanner() { 4812 function closeBanner() {
4749 self.cleanupGDataWelcome_(); 4813 self.cleanupGDataWelcome_();
4750 // Stop showing the welcome banner. 4814 // Stop showing the welcome banner.
4751 localStorage[WELCOME_HEADER_COUNTER_KEY] = WELCOME_HEADER_COUNTER_LIMIT; 4815 localStorage[WELCOME_HEADER_COUNTER_KEY] = WELCOME_HEADER_COUNTER_LIMIT;
4752 } 4816 }
4753 4817
4754 return maybeShowBanner; 4818 return maybeShowBanner;
4755 }; 4819 };
4756 })(); 4820 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698