display_overscan.js revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2013 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
5cr.define('options', function() {
6  var OptionsPage = options.OptionsPage;
7
8  /**
9   * Encapsulated handling of the 'DisplayOverscan' page.
10   * @constructor
11   */
12  function DisplayOverscan() {
13    OptionsPage.call(this, 'displayOverscan',
14                     loadTimeData.getString('displayOverscanPageTabTitle'),
15                     'display-overscan-page');
16  }
17
18  cr.addSingletonGetter(DisplayOverscan);
19
20  DisplayOverscan.prototype = {
21    __proto__: OptionsPage.prototype,
22
23    /**
24     * The ID of the target display.
25     * @private
26     */
27    id_: null,
28
29    /**
30     * The keyboard event handler function.
31     * @private
32     */
33    keyHandler_: null,
34
35    /**
36     * Initialize the page.
37     */
38    initializePage: function() {
39      OptionsPage.prototype.initializePage.call(this);
40
41      this.keyHandler_ = this.handleKeyevent_.bind(this);
42      $('display-overscan-operation-reset').onclick = function() {
43        chrome.send('reset');
44      };
45      $('display-overscan-operation-ok').onclick = function() {
46        chrome.send('commit');
47        OptionsPage.closeOverlay();
48      };
49      $('display-overscan-operation-cancel').onclick = function() {
50        OptionsPage.cancelOverlay();
51      };
52    },
53
54    /** @override */
55    handleCancel: function() {
56      // signals the cancel event.
57      chrome.send('cancel');
58      OptionsPage.closeOverlay();
59    },
60
61    /** @override */
62    didShowPage: function() {
63      if (this.id_ == null) {
64        OptionsPage.cancelOverlay();
65        return;
66      }
67
68      window.addEventListener('keydown', this.keyHandler_);
69      // Sets up the size of the overscan dialog based on DisplayOptions dialog.
70      var displayOptionsPage = $('display-options-page');
71      var displayOverscanPage = $('display-overscan-page');
72      displayOverscanPage.style.width =
73          displayOptionsPage.offsetWidth - 20 + 'px';
74      displayOverscanPage.style.minWidth = displayOverscanPage.style.width;
75      displayOverscanPage.style.height =
76          displayOptionsPage.offsetHeight - 50 + 'px';
77
78      // Moves the table to describe operation at the middle of the contents
79      // vertically.
80      var operationsTable = $('display-overscan-operations-table');
81      var buttonsContainer = $('display-overscan-button-strip');
82      operationsTable.style.top = buttonsContainer.offsetTop / 2 -
83          operationsTable.offsetHeight / 2 + 'px';
84
85      window.addEventListener('blur', DisplayOverscan.onWindowBlur);
86      $('display-overscan-operation-cancel').focus();
87      chrome.send('start', [this.id_]);
88    },
89
90    /** @override */
91    didClosePage: function() {
92      window.removeEventListener('blur', DisplayOverscan.onWindowBlur);
93      window.removeEventListener('keydown', this.keyHandler_);
94    },
95
96    /**
97     * Called when the overscan calibration is canceled at the system level,
98     * such like the display is disconnected.
99     * @private
100     */
101    onOverscanCanceled_: function() {
102      OptionsPage.cancelOverlay();
103    },
104
105    /**
106     * Sets the target display id. This method has to be called before
107     * navigating to this page.
108     * @param {string} id The target display id.
109     */
110    setDisplayId: function(id) {
111      this.id_ = id;
112    },
113
114    /**
115     * Key event handler to make the effect of display rectangle.
116     * @param {Event} event The keyboard event.
117     * @private
118     */
119    handleKeyevent_: function(event) {
120      switch (event.keyCode) {
121        case 37: // left arrow
122          if (event.shiftKey)
123            chrome.send('move', ['horizontal', -1]);
124          else
125            chrome.send('resize', ['horizontal', -1]);
126          event.preventDefault();
127          break;
128        case 38: // up arrow
129          if (event.shiftKey)
130            chrome.send('move', ['vertical', -1]);
131          else
132            chrome.send('resize', ['vertical', -1]);
133          event.preventDefault();
134          break;
135        case 39: // right arrow
136          if (event.shiftKey)
137            chrome.send('move', ['horizontal', 1]);
138          else
139            chrome.send('resize', ['horizontal', 1]);
140          event.preventDefault();
141          break;
142        case 40: // bottom arrow
143          if (event.shiftKey)
144            chrome.send('move', ['vertical', 1]);
145          else
146            chrome.send('resize', ['vertical', 1]);
147          event.preventDefault();
148          break;
149      }
150    }
151  };
152
153  DisplayOverscan.onWindowBlur = function() {
154    DisplayOverscan.getInstance().onOverscanCanceled_();
155  };
156
157  DisplayOverscan.onOverscanCanceled = function() {
158    DisplayOverscan.getInstance().onOverscanCanceled_();
159  };
160
161  // Export
162  return {
163    DisplayOverscan: DisplayOverscan
164  };
165});
166