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 cr.exportPath('options'); | 5 cr.exportPath('options'); |
6 | 6 |
7 /** | 7 /** |
8 * Enumeration of multi display mode. These values must match the C++ values in | 8 * Enumeration of multi display mode. These values must match the C++ values in |
9 * ash::DisplayManager. | 9 * ash::DisplayManager. |
10 * @enum {number} | 10 * @enum {number} |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 var container = $('display-options-displays-view-host'); | 199 var container = $('display-options-displays-view-host'); |
200 container.onmousemove = this.onMouseMove_.bind(this); | 200 container.onmousemove = this.onMouseMove_.bind(this); |
201 window.addEventListener('mouseup', this.endDragging_.bind(this), true); | 201 window.addEventListener('mouseup', this.endDragging_.bind(this), true); |
202 container.ontouchmove = this.onTouchMove_.bind(this); | 202 container.ontouchmove = this.onTouchMove_.bind(this); |
203 container.ontouchend = this.endDragging_.bind(this); | 203 container.ontouchend = this.endDragging_.bind(this); |
204 | 204 |
205 $('display-options-set-primary').onclick = (function() { | 205 $('display-options-set-primary').onclick = (function() { |
206 chrome.send('setPrimary', [this.focusedId_]); | 206 chrome.send('setPrimary', [this.focusedId_]); |
207 }).bind(this); | 207 }).bind(this); |
208 $('display-options-resolution-selection').onchange = (function(ev) { | 208 $('display-options-resolution-selection').onchange = (function(ev) { |
209 var display = this.getDisplayInfoFromId(this.focusedId_); | 209 var display = this.getDisplayInfoFromId_(this.focusedId_); |
| 210 if (!display) |
| 211 return; |
210 var resolution = display.resolutions[ev.target.value]; | 212 var resolution = display.resolutions[ev.target.value]; |
211 chrome.send('setDisplayMode', [this.focusedId_, resolution]); | 213 chrome.send('setDisplayMode', [this.focusedId_, resolution]); |
212 }).bind(this); | 214 }).bind(this); |
213 $('display-options-orientation-selection').onchange = (function(ev) { | 215 $('display-options-orientation-selection').onchange = (function(ev) { |
214 var rotation = parseInt(ev.target.value, 10); | 216 var rotation = parseInt(ev.target.value, 10); |
215 chrome.send('setRotation', [this.focusedId_, rotation]); | 217 chrome.send('setRotation', [this.focusedId_, rotation]); |
216 }).bind(this); | 218 }).bind(this); |
217 $('display-options-color-profile-selection').onchange = (function(ev) { | 219 $('display-options-color-profile-selection').onchange = (function(ev) { |
218 chrome.send('setColorProfile', [this.focusedId_, ev.target.value]); | 220 chrome.send('setColorProfile', [this.focusedId_, ev.target.value]); |
219 }).bind(this); | 221 }).bind(this); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 var touch = e.touches[0]; | 341 var touch = e.touches[0]; |
340 this.lastTouchLocation_ = {x: touch.pageX, y: touch.pageY}; | 342 this.lastTouchLocation_ = {x: touch.pageX, y: touch.pageY}; |
341 var target = assertInstanceof(e.target, HTMLElement); | 343 var target = assertInstanceof(e.target, HTMLElement); |
342 return this.startDragging_(target, this.lastTouchLocation_); | 344 return this.startDragging_(target, this.lastTouchLocation_); |
343 }, | 345 }, |
344 | 346 |
345 /** | 347 /** |
346 * @param {string} id | 348 * @param {string} id |
347 * @return {options.DisplayInfo} | 349 * @return {options.DisplayInfo} |
348 */ | 350 */ |
349 getDisplayInfoFromId(id) { | 351 getDisplayInfoFromId_(id) { |
350 return this.displays_.find(function(display) { | 352 return this.displays_.find(function(display) { |
351 return display.id == id; | 353 return display.id == id; |
352 }); | 354 }); |
353 }, | 355 }, |
354 | 356 |
355 /** | 357 /** |
356 * Sends the display layout for the secondary display to Chrome. | 358 * Sends the display layout for the secondary display to Chrome. |
357 * @private | 359 * @private |
358 */ | 360 */ |
359 sendDragResult_: function() { | 361 sendDragResult_: function() { |
(...skipping 29 matching lines...) Expand all Loading... |
389 var dragInfo = this.dragInfo_; | 391 var dragInfo = this.dragInfo_; |
390 | 392 |
391 /** @type {options.DisplayPosition} */ var newPosition = { | 393 /** @type {options.DisplayPosition} */ var newPosition = { |
392 x: dragInfo.originalLocation.x + | 394 x: dragInfo.originalLocation.x + |
393 (eventLocation.x - dragInfo.eventLocation.x), | 395 (eventLocation.x - dragInfo.eventLocation.x), |
394 y: dragInfo.originalLocation.y + | 396 y: dragInfo.originalLocation.y + |
395 (eventLocation.y - dragInfo.eventLocation.y) | 397 (eventLocation.y - dragInfo.eventLocation.y) |
396 }; | 398 }; |
397 | 399 |
398 this.displayLayoutManager_.updatePosition( | 400 this.displayLayoutManager_.updatePosition( |
399 this.dragInfo_.displayId, newPosition); | 401 dragInfo.displayId, newPosition); |
400 | 402 |
401 return false; | 403 return false; |
402 }, | 404 }, |
403 | 405 |
404 /** | 406 /** |
405 * Start dragging of a display rectangle. | 407 * Start dragging of a display rectangle. |
406 * @param {!HTMLElement} target The event target. | 408 * @param {!HTMLElement} target The event target. |
407 * @param {!options.DisplayPosition} eventLocation The event location. | 409 * @param {!options.DisplayPosition} eventLocation The event location. |
408 * @private | 410 * @private |
409 */ | 411 */ |
410 startDragging_: function(target, eventLocation) { | 412 startDragging_: function(target, eventLocation) { |
411 var oldFocusedId = this.focusedId_; | 413 var focused = this.displayLayoutManager_.getFocusedLayoutForDiv(target); |
412 var newFocusedId; | 414 if (!focused) |
413 var willUpdateDisplayDescription = false; | |
414 for (var i = 0; i < this.displays_.length; i++) { | |
415 var displayLayout = | |
416 this.displayLayoutManager_.getDisplayLayout(this.displays_[i].id); | |
417 if (displayLayout.div == target || | |
418 (target.offsetParent && target.offsetParent == displayLayout.div)) { | |
419 newFocusedId = displayLayout.id; | |
420 break; | |
421 } | |
422 } | |
423 if (!newFocusedId) | |
424 return false; | 415 return false; |
425 | 416 |
426 this.focusedId_ = newFocusedId; | 417 var updateDisplayDescription = focused.id != this.focusedId_; |
427 willUpdateDisplayDescription = newFocusedId != oldFocusedId; | 418 this.focusedId_ = focused.id; |
| 419 this.displayLayoutManager_.setFocusedId(focused.id); |
428 | 420 |
429 for (var i = 0; i < this.displays_.length; i++) { | 421 if (this.displayLayoutManager_.getDisplayLayoutCount() > 1) { |
430 var displayLayout = | 422 this.dragInfo_ = { |
431 this.displayLayoutManager_.getDisplayLayout(this.displays_[i].id); | 423 displayId: focused.id, |
432 displayLayout.div.className = 'displays-display'; | 424 originalLocation: { |
433 if (displayLayout.id != this.focusedId_) | 425 x: focused.div.offsetLeft, |
434 continue; | 426 y: focused.div.offsetTop |
435 | 427 }, |
436 displayLayout.div.classList.add('displays-focused'); | 428 eventLocation: {x: eventLocation.x, y: eventLocation.y} |
437 if (this.displays_.length > 1) { | 429 }; |
438 this.dragInfo_ = { | |
439 displayId: displayLayout.id, | |
440 originalLocation: { | |
441 x: displayLayout.div.offsetLeft, | |
442 y: displayLayout.div.offsetTop | |
443 }, | |
444 eventLocation: {x: eventLocation.x, y: eventLocation.y} | |
445 }; | |
446 } | |
447 } | 430 } |
448 | 431 |
449 if (willUpdateDisplayDescription) | 432 if (updateDisplayDescription) |
450 this.updateSelectedDisplayDescription_(); | 433 this.updateSelectedDisplayDescription_(); |
| 434 |
451 return false; | 435 return false; |
452 }, | 436 }, |
453 | 437 |
454 /** | 438 /** |
455 * finish the current dragging of displays. | 439 * finish the current dragging of displays. |
456 * @param {Event} e The event which triggers this. | 440 * @param {Event} e The event which triggers this. |
457 * @private | 441 * @private |
458 */ | 442 */ |
459 endDragging_: function(e) { | 443 endDragging_: function(e) { |
460 this.lastTouchLocation_ = null; | 444 this.lastTouchLocation_ = null; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 var orientation = $('display-options-orientation-selection'); | 589 var orientation = $('display-options-orientation-selection'); |
606 var orientationOptions = orientation.getElementsByTagName('option'); | 590 var orientationOptions = orientation.getElementsByTagName('option'); |
607 for (var i = 0; i < orientationOptions.length; i++) | 591 for (var i = 0; i < orientationOptions.length; i++) |
608 orientationOptions[i].selected = false; | 592 orientationOptions[i].selected = false; |
609 | 593 |
610 if (this.mirroring_) { | 594 if (this.mirroring_) { |
611 this.updateSelectedDisplaySectionMirroring_(); | 595 this.updateSelectedDisplaySectionMirroring_(); |
612 } else if (this.focusedId_ == '') { | 596 } else if (this.focusedId_ == '') { |
613 this.updateSelectedDisplaySectionNoSelected_(); | 597 this.updateSelectedDisplaySectionNoSelected_(); |
614 } else { | 598 } else { |
615 this.updateSelectedDisplaySectionForDisplay_( | 599 var focusedDisplay = this.getDisplayInfoFromId_(this.focusedId_); |
616 this.getDisplayInfoFromId(this.focusedId_)); | 600 if (focusedDisplay) |
| 601 this.updateSelectedDisplaySectionForDisplay_(focusedDisplay); |
617 } | 602 } |
618 }, | 603 }, |
619 | 604 |
620 /** | 605 /** |
621 * Clears the drawing area for display rectangles. | 606 * Clears the drawing area for display rectangles. |
622 * @private | 607 * @private |
623 */ | 608 */ |
624 resetDisplaysView_: function() { | 609 resetDisplaysView_: function() { |
625 var displaysViewHost = $('display-options-displays-view-host'); | 610 var displaysViewHost = $('display-options-displays-view-host'); |
626 displaysViewHost.removeChild(displaysViewHost.firstChild); | 611 displaysViewHost.removeChild(displaysViewHost.firstChild); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 parentId: parentId | 679 parentId: parentId |
695 }; | 680 }; |
696 }, | 681 }, |
697 | 682 |
698 /** | 683 /** |
699 * Layouts the display rectangles according to the current layout_. | 684 * Layouts the display rectangles according to the current layout_. |
700 * @param {options.DisplayLayoutType} layoutType | 685 * @param {options.DisplayLayoutType} layoutType |
701 * @private | 686 * @private |
702 */ | 687 */ |
703 layoutDisplays_: function(layoutType) { | 688 layoutDisplays_: function(layoutType) { |
704 var maxWidth = 0; | 689 // Create the layout manager. |
705 var maxHeight = 0; | 690 this.displayLayoutManager_ = new options.DisplayLayoutManager(); |
706 var boundingBox = {left: 0, right: 0, top: 0, bottom: 0}; | 691 |
| 692 // Create the display layouts. Child displays are parented to the primary. |
| 693 // TODO(stevenjb): DisplayInfo should provide the parent id for displays. |
707 var primaryDisplayId = ''; | 694 var primaryDisplayId = ''; |
708 for (var i = 0; i < this.displays_.length; i++) { | 695 for (var i = 0; i < this.displays_.length; i++) { |
709 var display = this.displays_[i]; | 696 var display = this.displays_[i]; |
710 if (display.isPrimary && primaryDisplayId == '') | 697 if (display.isPrimary) { |
711 primaryDisplayId = display.id; | 698 primaryDisplayId = display.id; |
712 | 699 break; |
713 var bounds = display.bounds; | 700 } |
714 boundingBox.left = Math.min(boundingBox.left, bounds.left); | |
715 boundingBox.right = | |
716 Math.max(boundingBox.right, bounds.left + bounds.width); | |
717 boundingBox.top = Math.min(boundingBox.top, bounds.top); | |
718 boundingBox.bottom = | |
719 Math.max(boundingBox.bottom, bounds.top + bounds.height); | |
720 maxWidth = Math.max(maxWidth, bounds.width); | |
721 maxHeight = Math.max(maxHeight, bounds.height); | |
722 } | 701 } |
723 if (primaryDisplayId == '') | |
724 return; | |
725 | |
726 // Make the margin around the bounding box. | |
727 var areaWidth = boundingBox.right - boundingBox.left + maxWidth; | |
728 var areaHeight = boundingBox.bottom - boundingBox.top + maxHeight; | |
729 | |
730 // Calculates the scale by the width since horizontal size is more strict. | |
731 // TODO(mukai): Adds the check of vertical size in case. | |
732 this.visualScale_ = Math.min( | |
733 VISUAL_SCALE, this.displaysView_.offsetWidth / areaWidth); | |
734 | |
735 // Prepare enough area for thisplays_view by adding the maximum height. | |
736 this.displaysView_.style.height = | |
737 Math.ceil(areaHeight * this.visualScale_) + 'px'; | |
738 | |
739 // Centering the bounding box of the display rectangles. | |
740 var offset = { | |
741 x: Math.floor( | |
742 this.displaysView_.offsetWidth / 2 - | |
743 (boundingBox.right + boundingBox.left) * this.visualScale_ / 2), | |
744 y: Math.floor( | |
745 this.displaysView_.offsetHeight / 2 - | |
746 (boundingBox.bottom + boundingBox.top) * this.visualScale_ / 2) | |
747 }; | |
748 | |
749 // Create the layout manager. | |
750 this.displayLayoutManager_ = | |
751 new options.DisplayLayoutManager(this.visualScale_); | |
752 | |
753 // Create the display layouts. | |
754 for (var i = 0; i < this.displays_.length; i++) { | 702 for (var i = 0; i < this.displays_.length; i++) { |
755 var display = this.displays_[i]; | 703 var display = this.displays_[i]; |
756 var parentId = display.isPrimary ? '' : primaryDisplayId; | 704 var parentId = display.isPrimary ? '' : primaryDisplayId; |
757 var layout = this.createDisplayLayout_(display, layoutType, parentId); | 705 var layout = this.createDisplayLayout_(display, layoutType, parentId); |
758 this.displayLayoutManager_.addDisplayLayout(layout); | 706 this.displayLayoutManager_.addDisplayLayout(layout); |
759 } | 707 } |
760 | 708 |
761 // Create the display divs. | 709 // Calculate the display area bounds and create the divs for each display. |
762 this.displayLayoutManager_.createDisplayLayoutDivs( | 710 this.visualScale_ = this.displayLayoutManager_.createDisplayArea( |
763 this.displaysView_, offset); | 711 /** @type {!Element} */(this.displaysView_), VISUAL_SCALE); |
764 | 712 |
765 // Set the div callbacks and highlight the focused div. | 713 this.displayLayoutManager_.setFocusedId(this.focusedId_); |
766 for (var i = 0; i < this.displays_.length; i++) { | 714 this.displayLayoutManager_.setDivCallbacks( |
767 var id = this.displays_[i].id; | 715 this.onMouseDown_.bind(this), this.onTouchStart_.bind(this)); |
768 var div = this.displayLayoutManager_.getDisplayLayout(id).div; | |
769 div.onmousedown = this.onMouseDown_.bind(this); | |
770 div.ontouchstart = this.onTouchStart_.bind(this); | |
771 div.classList.toggle('displays-focused', id == this.focusedId_); | |
772 } | |
773 }, | 716 }, |
774 | 717 |
775 /** | 718 /** |
776 * Called when the display arrangement has changed. | 719 * Called when the display arrangement has changed. |
777 * @param {options.MultiDisplayMode} mode multi display mode. | 720 * @param {options.MultiDisplayMode} mode multi display mode. |
778 * @param {!Array<!options.DisplayInfo>} displays The list of the display | 721 * @param {!Array<!options.DisplayInfo>} displays The list of the display |
779 * information. | 722 * information. |
780 * @param {options.DisplayLayoutType} layoutType The layout type for the | 723 * @param {options.DisplayLayoutType} layoutType The layout type for the |
781 * secondary display. | 724 * secondary display. |
782 * @param {number} offset The offset of the secondary display. | 725 * @param {number} offset The offset of the secondary display. |
783 * @private | 726 * @private |
784 */ | 727 */ |
785 onDisplayChanged_: function(mode, displays, layoutType, offset) { | 728 onDisplayChanged_: function(mode, displays, layoutType, offset) { |
786 if (!this.visible) | 729 if (!this.visible) |
787 return; | 730 return; |
788 | 731 |
789 this.displays_ = displays; | |
790 | |
791 var mirroring = mode == options.MultiDisplayMode.MIRRORING; | 732 var mirroring = mode == options.MultiDisplayMode.MIRRORING; |
792 var unifiedDesktopEnabled = mode == options.MultiDisplayMode.UNIFIED; | 733 var unifiedDesktopEnabled = mode == options.MultiDisplayMode.UNIFIED; |
793 | 734 |
794 // Focus to the first display next to the primary one when |displays_| | 735 // Focus to the first display next to the primary one when |displays_| |
795 // is updated. | 736 // is updated. |
796 if (mirroring) { | 737 if (mirroring) { |
797 this.focusedId_ = ''; | 738 this.focusedId_ = ''; |
798 } else if ( | 739 } else if ( |
799 this.focusedId_ == '' || this.mirroring_ != mirroring || | 740 this.focusedId_ == '' || this.mirroring_ != mirroring || |
800 this.unifiedDesktopEnabled_ != unifiedDesktopEnabled || | 741 this.unifiedDesktopEnabled_ != unifiedDesktopEnabled || |
801 this.displays_.length != displays.length) { | 742 this.displays_.length != displays.length) { |
802 this.focusedId_ = displays.length > 0 ? displays[0].id : ''; | 743 this.focusedId_ = displays.length > 0 ? displays[0].id : ''; |
803 } | 744 } |
804 | 745 |
| 746 this.displays_ = displays; |
805 this.mirroring_ = mirroring; | 747 this.mirroring_ = mirroring; |
806 this.unifiedDesktopEnabled_ = unifiedDesktopEnabled; | 748 this.unifiedDesktopEnabled_ = unifiedDesktopEnabled; |
807 | 749 |
808 this.resetDisplaysView_(); | 750 this.resetDisplaysView_(); |
809 if (this.mirroring_) | 751 if (this.mirroring_) |
810 this.layoutMirroringDisplays_(); | 752 this.layoutMirroringDisplays_(); |
811 else | 753 else |
812 this.layoutDisplays_(layoutType); | 754 this.layoutDisplays_(layoutType); |
813 | 755 |
814 $('display-options-select-mirroring').value = | 756 $('display-options-select-mirroring').value = |
815 mirroring ? 'mirroring' : 'extended'; | 757 mirroring ? 'mirroring' : 'extended'; |
816 | 758 |
817 $('display-options-unified-desktop').hidden = | 759 $('display-options-unified-desktop').hidden = |
818 !this.showUnifiedDesktopOption_; | 760 !this.showUnifiedDesktopOption_; |
819 | 761 |
820 $('display-options-toggle-unified-desktop').checked = | 762 $('display-options-toggle-unified-desktop').checked = |
821 this.unifiedDesktopEnabled_; | 763 this.unifiedDesktopEnabled_; |
822 | 764 |
823 var disableUnifiedDesktopOption = | 765 var disableUnifiedDesktopOption = |
824 (this.mirroring_ || | 766 (this.mirroring_ || |
825 (!this.unifiedDesktopEnabled_ && | 767 (!this.unifiedDesktopEnabled_ && this.displays_.length == 1)); |
826 this.displays_.length == 1)); | |
827 | 768 |
828 $('display-options-toggle-unified-desktop').disabled = | 769 $('display-options-toggle-unified-desktop').disabled = |
829 disableUnifiedDesktopOption; | 770 disableUnifiedDesktopOption; |
830 | 771 |
831 this.updateSelectedDisplayDescription_(); | 772 this.updateSelectedDisplayDescription_(); |
832 } | 773 } |
833 }; | 774 }; |
834 | 775 |
835 DisplayOptions.setDisplayInfo = function( | 776 DisplayOptions.setDisplayInfo = function( |
836 mode, displays, layoutType, offset) { | 777 mode, displays, layoutType, offset) { |
837 DisplayOptions.getInstance().onDisplayChanged_( | 778 DisplayOptions.getInstance().onDisplayChanged_( |
838 mode, displays, layoutType, offset); | 779 mode, displays, layoutType, offset); |
839 }; | 780 }; |
840 | 781 |
841 // Export | 782 // Export |
842 return { | 783 return { |
843 DisplayOptions: DisplayOptions | 784 DisplayOptions: DisplayOptions |
844 }; | 785 }; |
845 }); | 786 }); |
OLD | NEW |