1// Copyright (c) 2011 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#ifndef CHROME_BROWSER_UI_VIEWS_ABOUT_CHROME_VIEW_H_
6#define CHROME_BROWSER_UI_VIEWS_ABOUT_CHROME_VIEW_H_
7#pragma once
8
9#include "views/controls/image_view.h"
10#include "views/controls/label.h"
11#include "views/controls/link.h"
12#include "views/view.h"
13#include "views/window/dialog_delegate.h"
14
15#if defined(OS_WIN) || defined(OS_CHROMEOS)
16#include "chrome/browser/google/google_update.h"
17#endif
18#if defined(OS_CHROMEOS)
19#include "chrome/browser/chromeos/version_loader.h"
20#endif
21
22namespace views {
23class Textfield;
24class Throbber;
25class Window;
26}
27
28class Profile;
29
30////////////////////////////////////////////////////////////////////////////////
31//
32// The AboutChromeView class is responsible for drawing the UI controls of the
33// About Chrome dialog that allows the user to see what version is installed
34// and check for updates.
35//
36////////////////////////////////////////////////////////////////////////////////
37class AboutChromeView : public views::View,
38                        public views::DialogDelegate,
39                        public views::LinkController
40#if defined(OS_WIN) || defined(OS_CHROMEOS)
41                        , public GoogleUpdateStatusListener
42#endif
43                        {
44 public:
45  explicit AboutChromeView(Profile* profile);
46  virtual ~AboutChromeView();
47
48  // Initialize the controls on the dialog.
49  void Init();
50
51  // Overridden from views::View:
52  virtual gfx::Size GetPreferredSize();
53  virtual void Layout();
54  virtual void OnPaint(gfx::Canvas* canvas);
55  virtual void ViewHierarchyChanged(bool is_add,
56                                    views::View* parent,
57                                    views::View* child);
58
59  // Overridden from views::DialogDelegate:
60  virtual std::wstring GetDialogButtonLabel(
61      MessageBoxFlags::DialogButton button) const;
62  virtual bool IsDialogButtonEnabled(
63      MessageBoxFlags::DialogButton button) const;
64  virtual bool IsDialogButtonVisible(
65      MessageBoxFlags::DialogButton button) const;
66  virtual int GetDefaultDialogButton() const;
67  virtual bool CanResize() const;
68  virtual bool CanMaximize() const;
69  virtual bool IsAlwaysOnTop() const;
70  virtual bool HasAlwaysOnTopMenu() const;
71  virtual bool IsModal() const;
72  virtual std::wstring GetWindowTitle() const;
73  virtual bool Accept();
74  virtual views::View* GetContentsView();
75
76  // Overridden from views::LinkController:
77  virtual void LinkActivated(views::Link* source, int event_flags);
78#if defined(OS_WIN) || defined(OS_CHROMEOS)
79  // Overridden from GoogleUpdateStatusListener:
80  virtual void OnReportResults(GoogleUpdateUpgradeResult result,
81                               GoogleUpdateErrorCode error_code,
82                               const std::wstring& version);
83#endif
84
85 private:
86#if defined(OS_WIN) || defined(OS_CHROMEOS)
87  // Update the UI to show the status of the upgrade.
88  void UpdateStatus(GoogleUpdateUpgradeResult result,
89                    GoogleUpdateErrorCode error_code);
90#endif
91
92#if defined(OS_CHROMEOS)
93  // Callback from chromeos::VersionLoader giving the version.
94  void OnOSVersion(chromeos::VersionLoader::Handle handle,
95                   std::string version);
96#endif
97
98
99  Profile* profile_;
100
101  // UI elements on the dialog.
102  views::ImageView* about_dlg_background_logo_;
103  views::Label* about_title_label_;
104  views::Textfield* version_label_;
105#if defined(OS_CHROMEOS)
106  views::Textfield* os_version_label_;
107#endif
108  views::Label* copyright_label_;
109  views::Label* main_text_label_;
110  int main_text_label_height_;
111  views::Link* chromium_url_;
112  gfx::Rect chromium_url_rect_;
113  views::Link* open_source_url_;
114  gfx::Rect open_source_url_rect_;
115  views::Link* terms_of_service_url_;
116  gfx::Rect terms_of_service_url_rect_;
117  // UI elements we add to the parent view.
118  scoped_ptr<views::Throbber> throbber_;
119  views::ImageView success_indicator_;
120  views::ImageView update_available_indicator_;
121  views::ImageView timeout_indicator_;
122  views::Label update_label_;
123
124  // The dialog dimensions.
125  gfx::Size dialog_dimensions_;
126
127  // Keeps track of the visible state of the Restart Now button.
128  bool restart_button_visible_;
129
130  // The text to display as the main label of the About box. We draw this text
131  // word for word with the help of the WordIterator, and make room for URLs
132  // which are drawn using views::Link. See also |url_offsets_|.
133  std::wstring main_label_chunk1_;
134  std::wstring main_label_chunk2_;
135  std::wstring main_label_chunk3_;
136  std::wstring main_label_chunk4_;
137  std::wstring main_label_chunk5_;
138  // Determines the order of the two links we draw in the main label.
139  bool chromium_url_appears_first_;
140
141#if defined(OS_WIN) || defined(OS_CHROMEOS)
142  // The class that communicates with Google Update to find out if an update is
143  // available and asks it to start an upgrade.
144  scoped_refptr<GoogleUpdate> google_updater_;
145#endif
146
147  // Our current version.
148  std::string current_version_;
149
150  // Additional information about the version (channel and build number).
151  std::string version_details_;
152
153  // The version Google Update reports is available to us.
154  std::wstring new_version_available_;
155
156  // Whether text direction is left-to-right or right-to-left.
157  bool text_direction_is_rtl_;
158
159#if defined(OS_CHROMEOS)
160  // Handles asynchronously loading the version.
161  chromeos::VersionLoader loader_;
162
163  // Used to request the version.
164  CancelableRequestConsumer consumer_;
165#endif
166
167  DISALLOW_COPY_AND_ASSIGN(AboutChromeView);
168};
169
170#endif  // CHROME_BROWSER_UI_VIEWS_ABOUT_CHROME_VIEW_H_
171