display_overscan_handler.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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
5#include "chrome/browser/ui/webui/options/chromeos/display_overscan_handler.h"
6
7#include <string>
8
9#include "ash/display/display_controller.h"
10#include "ash/screen_ash.h"
11#include "ash/shell.h"
12#include "base/bind.h"
13#include "base/logging.h"
14#include "base/strings/string_number_conversions.h"
15#include "base/values.h"
16#include "chrome/browser/chromeos/display/overscan_calibrator.h"
17#include "content/public/browser/web_ui.h"
18#include "grit/generated_resources.h"
19#include "ui/base/l10n/l10n_util.h"
20#include "ui/gfx/display.h"
21
22namespace chromeos {
23namespace options {
24namespace {
25
26// The value for the orientation of overscan operations.
27const char kOrientationHorizontal[] = "horizontal";
28const char kOrientationVertical[] = "vertical";
29
30}
31
32DisplayOverscanHandler::DisplayOverscanHandler() {
33  ash::Shell::GetScreen()->AddObserver(this);
34}
35
36DisplayOverscanHandler::~DisplayOverscanHandler() {
37  ash::Shell::GetScreen()->RemoveObserver(this);
38}
39
40void DisplayOverscanHandler::GetLocalizedValues(
41    DictionaryValue* localized_strings) {
42  RegisterTitle(localized_strings, "displayOverscanPage",
43                IDS_OPTIONS_SETTINGS_DISPLAY_OVERSCAN_TAB_TITLE);
44  localized_strings->SetString("shrinkAndExpand", l10n_util::GetStringUTF16(
45      IDS_OPTIONS_SETTINGS_DISPLAY_OVERSCAN_SHRINK_EXPAND));
46  localized_strings->SetString("move", l10n_util::GetStringUTF16(
47      IDS_OPTIONS_SETTINGS_DISPLAY_OVERSCAN_MOVE));
48  localized_strings->SetString("overscanReset", l10n_util::GetStringUTF16(
49      IDS_OPTIONS_SETTINGS_DISPLAY_OVERSCAN_RESET_BUTTON_LABEL));
50  localized_strings->SetString("overscanOK", l10n_util::GetStringUTF16(
51      IDS_OPTIONS_SETTINGS_DISPLAY_OVERSCAN_OK_BUTTON_LABEL));
52  localized_strings->SetString("overscanCancel", l10n_util::GetStringUTF16(
53      IDS_OPTIONS_SETTINGS_DISPLAY_OVERSCAN_CANCEL_BUTTON_LABEL));
54}
55
56void DisplayOverscanHandler::RegisterMessages() {
57  web_ui()->RegisterMessageCallback(
58      "start",
59      base::Bind(&DisplayOverscanHandler::HandleStart,
60                 base::Unretained(this)));
61  web_ui()->RegisterMessageCallback(
62      "commit",
63      base::Bind(&DisplayOverscanHandler::HandleCommit,
64                 base::Unretained(this)));
65  web_ui()->RegisterMessageCallback(
66      "reset",
67      base::Bind(&DisplayOverscanHandler::HandleReset,
68                 base::Unretained(this)));
69  web_ui()->RegisterMessageCallback(
70      "cancel",
71      base::Bind(&DisplayOverscanHandler::HandleCancel,
72                 base::Unretained(this)));
73  web_ui()->RegisterMessageCallback(
74      "move",
75      base::Bind(&DisplayOverscanHandler::HandleMove,
76                 base::Unretained(this)));
77  web_ui()->RegisterMessageCallback(
78      "resize",
79      base::Bind(&DisplayOverscanHandler::HandleResize,
80                 base::Unretained(this)));
81}
82
83void DisplayOverscanHandler::OnDisplayBoundsChanged(
84    const gfx::Display& display) {
85}
86
87void DisplayOverscanHandler::OnDisplayAdded(const gfx::Display& new_display) {
88  web_ui()->CallJavascriptFunction(
89      "options.DisplayOverscan.onOverscanCanceled");
90}
91
92void DisplayOverscanHandler::OnDisplayRemoved(const gfx::Display& old_display) {
93  web_ui()->CallJavascriptFunction(
94      "options.DisplayOverscan.onOverscanCanceled");
95}
96
97void DisplayOverscanHandler::HandleStart(const base::ListValue* args) {
98  int64 display_id = gfx::Display::kInvalidDisplayID;
99  std::string id_value;
100  if (!args->GetString(0, &id_value)) {
101    LOG(ERROR) << "Can't find ID";
102    return;
103  }
104
105  if (!base::StringToInt64(id_value, &display_id) ||
106      display_id == gfx::Display::kInvalidDisplayID) {
107    LOG(ERROR) << "Invalid parameter: " << id_value;
108    return;
109  }
110
111  const gfx::Display& display = ash::ScreenAsh::GetDisplayForId(display_id);
112  DCHECK(display.is_valid());
113  if (!display.is_valid())
114    return;
115
116  ash::DisplayController* display_controller =
117      ash::Shell::GetInstance()->display_controller();
118  overscan_calibrator_.reset(new OverscanCalibrator(
119      display,
120      display_controller->GetOverscanInsets(display_id)));
121}
122
123void DisplayOverscanHandler::HandleCommit(const base::ListValue* unused_args) {
124  if (overscan_calibrator_.get()) {
125    overscan_calibrator_->Commit();
126    overscan_calibrator_.reset();
127  }
128}
129
130void DisplayOverscanHandler::HandleReset(const base::ListValue* unused_args) {
131  if (overscan_calibrator_.get())
132    overscan_calibrator_->Reset();
133}
134
135void DisplayOverscanHandler::HandleCancel(const base::ListValue* unused_args) {
136  overscan_calibrator_.reset();
137}
138
139void DisplayOverscanHandler::HandleMove(const base::ListValue* args) {
140  std::string orientation;
141  double length;
142  if (!args->GetString(0, &orientation)) {
143    LOG(ERROR) << "The first argument must be orientation";
144    return;
145  }
146  if (!args->GetDouble(1, &length)) {
147    LOG(ERROR) << "The second argument must be a numeric";
148    return;
149  }
150
151  if (!overscan_calibrator_.get())
152    return;
153
154  gfx::Insets insets = overscan_calibrator_->insets();
155  if (orientation == kOrientationHorizontal) {
156    insets.Set(insets.top(), insets.left() + length,
157               insets.bottom(), insets.right() - length);
158  } else if (orientation == kOrientationVertical) {
159    insets.Set(insets.top() + length, insets.left(),
160               insets.bottom() - length, insets.right());
161  } else {
162    LOG(ERROR) << "The orientation must be '" << kOrientationHorizontal
163               << "' or '" << kOrientationVertical << "': "
164               << orientation;
165    return;
166  }
167  overscan_calibrator_->UpdateInsets(insets);
168}
169
170void DisplayOverscanHandler::HandleResize(const base::ListValue* args) {
171  std::string orientation;
172  double length;
173  if (!args->GetString(0, &orientation)) {
174    LOG(ERROR) << "The first argument must be orientation";
175    return;
176  }
177  if (!args->GetDouble(1, &length)) {
178    LOG(ERROR) << "The second argument must be a numeric";
179    return;
180  }
181
182  if (!overscan_calibrator_.get())
183    return;
184
185  gfx::Insets insets = overscan_calibrator_->insets();
186  if (orientation == kOrientationHorizontal) {
187    insets.Set(insets.top(), insets.left() + length,
188               insets.bottom(), insets.right() + length);
189  } else if (orientation == kOrientationVertical) {
190    insets.Set(insets.top() + length, insets.left(),
191               insets.bottom() + length, insets.right());
192  } else {
193    LOG(ERROR) << "The orientation must be '" << kOrientationHorizontal
194               << "' or '" << kOrientationVertical << "': "
195               << orientation;
196    return;
197  }
198  overscan_calibrator_->UpdateInsets(insets);
199}
200
201}  // namespace options
202}  // namespace chromeos
203