// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_ABOUT_CHROME_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_ABOUT_CHROME_VIEW_H_
#pragma once
#include "views/controls/image_view.h"
#include "views/controls/label.h"
#include "views/controls/link.h"
#include "views/view.h"
#include "views/window/dialog_delegate.h"
#if defined(OS_WIN) || defined(OS_CHROMEOS)
#include "chrome/browser/google/google_update.h"
#endif
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/version_loader.h"
#endif
namespace views {
class Textfield;
class Throbber;
class Window;
}
class Profile;
////////////////////////////////////////////////////////////////////////////////
//
// The AboutChromeView class is responsible for drawing the UI controls of the
// About Chrome dialog that allows the user to see what version is installed
// and check for updates.
//
////////////////////////////////////////////////////////////////////////////////
class AboutChromeView : public views::View,
public views::DialogDelegate,
public views::LinkController
#if defined(OS_WIN) || defined(OS_CHROMEOS)
, public GoogleUpdateStatusListener
#endif
{
public:
explicit AboutChromeView(Profile* profile);
virtual ~AboutChromeView();
// Initialize the controls on the dialog.
void Init();
// Overridden from views::View:
virtual gfx::Size GetPreferredSize();
virtual void Layout();
virtual void OnPaint(gfx::Canvas* canvas);
virtual void ViewHierarchyChanged(bool is_add,
views::View* parent,
views::View* child);
// Overridden from views::DialogDelegate:
virtual std::wstring GetDialogButtonLabel(
MessageBoxFlags::DialogButton button) const;
virtual bool IsDialogButtonEnabled(
MessageBoxFlags::DialogButton button) const;
virtual bool IsDialogButtonVisible(
MessageBoxFlags::DialogButton button) const;
virtual int GetDefaultDialogButton() const;
virtual bool CanResize() const;
virtual bool CanMaximize() const;
virtual bool IsAlwaysOnTop() const;
virtual bool HasAlwaysOnTopMenu() const;
virtual bool IsModal() const;
virtual std::wstring GetWindowTitle() const;
virtual bool Accept();
virtual views::View* GetContentsView();
// Overridden from views::LinkController:
virtual void LinkActivated(views::Link* source, int event_flags);
#if defined(OS_WIN) || defined(OS_CHROMEOS)
// Overridden from GoogleUpdateStatusListener:
virtual void OnReportResults(GoogleUpdateUpgradeResult result,
GoogleUpdateErrorCode error_code,
const std::wstring& version);
#endif
private:
#if defined(OS_WIN) || defined(OS_CHROMEOS)
// Update the UI to show the status of the upgrade.
void UpdateStatus(GoogleUpdateUpgradeResult result,
GoogleUpdateErrorCode error_code);
#endif
#if defined(OS_CHROMEOS)
// Callback from chromeos::VersionLoader giving the version.
void OnOSVersion(chromeos::VersionLoader::Handle handle,
std::string version);
#endif
Profile* profile_;
// UI elements on the dialog.
views::ImageView* about_dlg_background_logo_;
views::Label* about_title_label_;
views::Textfield* version_label_;
#if defined(OS_CHROMEOS)
views::Textfield* os_version_label_;
#endif
views::Label* copyright_label_;
views::Label* main_text_label_;
int main_text_label_height_;
views::Link* chromium_url_;
gfx::Rect chromium_url_rect_;
views::Link* open_source_url_;
gfx::Rect open_source_url_rect_;
views::Link* terms_of_service_url_;
gfx::Rect terms_of_service_url_rect_;
// UI elements we add to the parent view.
scoped_ptr<views::Throbber> throbber_;
views::ImageView success_indicator_;
views::ImageView update_available_indicator_;
views::ImageView timeout_indicator_;
views::Label update_label_;
// The dialog dimensions.
gfx::Size dialog_dimensions_;
// Keeps track of the visible state of the Restart Now button.
bool restart_button_visible_;
// The text to display as the main label of the About box. We draw this text
// word for word with the help of the WordIterator, and make room for URLs
// which are drawn using views::Link. See also |url_offsets_|.
std::wstring main_label_chunk1_;
std::wstring main_label_chunk2_;
std::wstring main_label_chunk3_;
std::wstring main_label_chunk4_;
std::wstring main_label_chunk5_;
// Determines the order of the two links we draw in the main label.
bool chromium_url_appears_first_;
#if defined(OS_WIN) || defined(OS_CHROMEOS)
// The class that communicates with Google Update to find out if an update is
// available and asks it to start an upgrade.
scoped_refptr<GoogleUpdate> google_updater_;
#endif
// Our current version.
std::string current_version_;
// Additional information about the version (channel and build number).
std::string version_details_;
// The version Google Update reports is available to us.
std::wstring new_version_available_;
// Whether text direction is left-to-right or right-to-left.
bool text_direction_is_rtl_;
#if defined(OS_CHROMEOS)
// Handles asynchronously loading the version.
chromeos::VersionLoader loader_;
// Used to request the version.
CancelableRequestConsumer consumer_;
#endif
DISALLOW_COPY_AND_ASSIGN(AboutChromeView);
};
#endif // CHROME_BROWSER_UI_VIEWS_ABOUT_CHROME_VIEW_H_