// Copyright (c) 2006-2008 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_VIEWS_ABOUT_CHROME_VIEW_H_ #define CHROME_BROWSER_VIEWS_ABOUT_CHROME_VIEW_H_ #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_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 Paint(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 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: // The visible state of the Check For Updates button. enum CheckButtonStatus { CHECKBUTTON_HIDDEN = 0, CHECKBUTTON_DISABLED, CHECKBUTTON_ENABLED, }; #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 // Draws a string onto the canvas (wrapping if needed) while also keeping // track of where it ends so we can position a URL after the text. The // parameter |bounds| represents the boundary we have to work with, |position| // specifies where to draw the string (relative to the top left corner of the // |bounds| rectangle and |font| specifies the font to use when drawing. When // the function returns, the parameter |rect| contains where to draw the URL // (to the right of where we just drew the text) and |position| is updated to // reflect where to draw the next string after the URL. // NOTE: The reason why we need this function is because while Skia knows how // to wrap text appropriately, it doesn't tell us where it drew the last // character, which we need to position the URLs within the text. void DrawTextAndPositionUrl(gfx::Canvas* canvas, const std::wstring& text, views::Link* link, gfx::Rect* rect, gfx::Size* position, const gfx::Rect& bounds, const gfx::Font& font); // A helper function for DrawTextAndPositionUrl, which simply draws the text // from a certain starting point |position| and wraps within bounds. // |word_for_word| specifies whether to draw the text word for word or wheter // to treat the text as one blurb (similar to the way url's are treated inside // RTL text. For details on the other parameters, see DrawTextAndPositionUrl. void DrawTextStartingFrom(gfx::Canvas* canvas, const std::wstring& text, gfx::Size* position, const gfx::Rect& bounds, const gfx::Font& font, bool word_for_word); // A simply utility function that calculates whether a word of width // |word_width| fits at position |position| within the |bounds| rectangle. If // not, |position| is updated to wrap to the beginning of the next line. void WrapIfWordDoesntFit(int word_width, int font_height, gfx::Size* position, const gfx::Rect& bounds); 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 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 Check For Updates button. CheckButtonStatus check_button_status_; // 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 google_updater_; #endif // Our current version. std::wstring current_version_; // Additional information about the version (channel and build number). std::wstring 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_VIEWS_ABOUT_CHROME_VIEW_H_