Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 /** | |
| 6 * @fileoverview | |
| 7 * Apps v2 custom title bar implementation | |
| 8 */ | |
| 9 | |
| 10 'use strict'; | |
| 11 | |
| 12 /** @suppress {duplicate} */ | |
| 13 var remoting = remoting || {}; | |
| 14 | |
| 15 /** | |
| 16 * @constructor | |
| 17 */ | |
| 18 remoting.TitleBar = function() { | |
| 19 /** | |
| 20 * @type {remoting.ClientSession} | |
| 21 * @private | |
| 22 */ | |
| 23 this.clientSession_ = null; | |
|
kelvinp
2014/05/06 04:42:15
It seems like this is only used as a boolean to in
Jamie
2014/05/06 21:11:08
I've renamed it to setConnected. I had originally
| |
| 24 | |
| 25 /** | |
| 26 * @type {Array.<{id:string, fn: function()}>} | |
| 27 */ | |
| 28 var handlers = [ | |
| 29 { id: 'window-disconnect', fn: this.disconnectSession_.bind(this) }, | |
| 30 { id: 'window-maximize-restore', | |
| 31 fn: this.maximizeOrRestoreWindow_.bind(this) }, | |
| 32 { id: 'window-minimize', fn: this.minimizeWindow_.bind(this) }, | |
| 33 { id: 'window-close', fn: window.close.bind(window) }, | |
| 34 { id: 'window-controls-stub', fn: this.toggleWindowControls_.bind(this) } | |
| 35 ]; | |
| 36 for (var i = 0; i < handlers.length; ++i) { | |
| 37 var element = document.getElementById(handlers[i].id); | |
| 38 element.addEventListener('click', handlers[i].fn, false); | |
| 39 } | |
| 40 | |
| 41 // Ensure that tool-tips are always correct. | |
| 42 this.updateMaximizeOrRestoreIconTitle_(); | |
| 43 chrome.app.window.current().onMaximized.addListener( | |
| 44 this.updateMaximizeOrRestoreIconTitle_.bind(this)); | |
| 45 chrome.app.window.current().onRestored.addListener( | |
| 46 this.updateMaximizeOrRestoreIconTitle_.bind(this)); | |
| 47 chrome.app.window.current().onFullscreened.addListener( | |
| 48 this.updateMaximizeOrRestoreIconTitle_.bind(this)); | |
| 49 }; | |
| 50 | |
| 51 /** | |
| 52 * @param {remoting.ClientSession} clientSession The current session, or null | |
| 53 * if there is no active session. | |
| 54 */ | |
| 55 remoting.TitleBar.prototype.setClientSession = function(clientSession) { | |
| 56 this.clientSession_ = clientSession; | |
| 57 if (this.clientSession_) { | |
| 58 document.body.classList.add('connected'); | |
| 59 } else { | |
| 60 document.body.classList.remove('connected'); | |
| 61 } | |
| 62 this.updateMaximizeOrRestoreIconTitle_(); | |
| 63 }; | |
| 64 | |
| 65 /** | |
| 66 * @return {{width: number, height: number}} The size of the window, ignoring | |
| 67 * the title-bar and window borders, if visible. | |
| 68 */ | |
| 69 remoting.TitleBar.prototype.getClientArea = function() { | |
|
kelvinp
2014/05/06 04:42:15
It seems a bit odd to have a getClientArea method
Jamie
2014/05/06 21:11:08
I've gone with WindowFrame instead, since AppWindo
| |
| 70 if (chrome.app.window.current().isFullscreen()) { | |
| 71 return { 'height': window.innerHeight, 'width': window.innerWidth }; | |
| 72 } else { | |
| 73 var kBorderWidth = 1; | |
| 74 var titleBar = document.getElementById('title-bar'); | |
| 75 base.debug.assert(titleBar != null); | |
| 76 return { | |
| 77 'height': window.innerHeight - titleBar.clientHeight - 2 * kBorderWidth, | |
| 78 'width': window.innerWidth - 2 * kBorderWidth | |
| 79 }; | |
| 80 } | |
| 81 }; | |
| 82 | |
| 83 /** | |
| 84 * @private | |
| 85 */ | |
| 86 remoting.TitleBar.prototype.disconnectSession_ = function() { | |
| 87 remoting.disconnect(); | |
| 88 }; | |
| 89 | |
| 90 /** | |
| 91 * @private | |
| 92 */ | |
| 93 remoting.TitleBar.prototype.maximizeOrRestoreWindow_ = function() { | |
| 94 /** @type {boolean} */ | |
| 95 var restore = | |
| 96 chrome.app.window.current().isFullscreen() || | |
|
kelvinp
2014/05/06 04:42:15
It seems a bit odd that some of the fullscreen man
Jamie
2014/05/06 21:11:08
Since we don't encapsulate the maximized state, I
| |
| 97 chrome.app.window.current().isMaximized(); | |
| 98 if (restore) { | |
| 99 // Restore twice: once to exit full-screen and once to exit maximized. | |
| 100 // If the app is not full-screen, or went full-screen without first | |
| 101 // being maximized, then the second restore has no effect. | |
| 102 chrome.app.window.current().restore(); | |
| 103 chrome.app.window.current().restore(); | |
| 104 } else { | |
| 105 chrome.app.window.current().maximize(); | |
| 106 } | |
| 107 }; | |
| 108 | |
| 109 /** | |
| 110 * @private | |
| 111 */ | |
| 112 remoting.TitleBar.prototype.minimizeWindow_ = function() { | |
| 113 chrome.app.window.current().minimize(); | |
| 114 }; | |
| 115 | |
| 116 /** | |
| 117 * @private | |
| 118 */ | |
| 119 remoting.TitleBar.prototype.restoreWindow_ = function() { | |
| 120 chrome.app.window.current().restore(); | |
| 121 }; | |
| 122 | |
| 123 /** | |
| 124 * @private | |
| 125 */ | |
| 126 remoting.TitleBar.prototype.toggleWindowControls_ = function() { | |
| 127 document.getElementById('window-controls').classList.toggle('opened'); | |
| 128 }; | |
| 129 | |
| 130 /** | |
| 131 * Update the tool-top for the maximize/full-screen/restore icon to reflect | |
| 132 * its current behaviour. | |
| 133 * | |
| 134 * @private | |
| 135 */ | |
| 136 remoting.TitleBar.prototype.updateMaximizeOrRestoreIconTitle_ = function() { | |
| 137 var icon = document.getElementById('window-maximize-restore'); | |
| 138 /** @type {string} */ | |
| 139 var tag = ''; | |
| 140 if (chrome.app.window.current().isFullscreen()) { | |
| 141 tag = /*i18n-content*/'EXIT_FULL_SCREEN'; | |
| 142 } else if (chrome.app.window.current().isMaximized()) { | |
| 143 tag = /*i18n-content*/'RESTORE_WINDOW'; | |
| 144 } else if (this.clientSession_) { | |
| 145 tag = /*i18n-content*/'FULL_SCREEN'; | |
| 146 } else { | |
| 147 tag = /*i18n-content*/'MAXIMIZE_WINDOW'; | |
| 148 } | |
| 149 icon.title = l10n.getTranslationOrError(tag); | |
| 150 }; | |
| 151 | |
| 152 /** @type {remoting.TitleBar} */ | |
| 153 remoting.titleBar = null; | |
| OLD | NEW |