15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_FIRST_RUN_TRY_CHROME_DIALOG_VIEW_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_FIRST_RUN_TRY_CHROME_DIALOG_VIEW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link_listener.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProcessSingleton; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RadioButton; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Checkbox; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Widget; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class displays a modal dialog using the views system. The dialog asks 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the user to give chrome another try. This class only handles the UI so the 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resulting actions are up to the caller. One flavor looks like this: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-----------------------------------------------+ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | |icon| There is a new, safer version [x] | 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | |icon| of Google Chrome available | 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | [o] Try it out (already installed) | 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | [ ] Uninstall Google Chrome | 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | [ OK ] [Don't bug me] | 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | _why_am_I_seeing this?_ | 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-----------------------------------------------+ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Another flavor looks like: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-----------------------------------------------+ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | |icon| There is a new, safer version [x] | 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | |icon| of Google Chrome available | 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | [o] Try it out (already installed) | 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | [ ] Don't bug me | 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | [ OK ] | 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// +-----------------------------------------------+ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// And the 2013 version looks like: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// +-----------------------------------------------+ 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// | |icon| There is a new version of [x] | 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// | |icon| Google Chrome available | 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// | [o] Try it out (already installed) | 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// | [ ] Don't bug me | 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// | --------------------------------------------- | 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// | [x] Make it the default browser [ OK ] | 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// +-----------------------------------------------+ 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TryChromeDialogView : public views::ButtonListener, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::LinkListener { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Receives a handle to the active modal dialog, or NULL when the active 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // dialog is dismissed. 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(gfx::NativeWindow active_dialog)> 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ActiveModalDialogListener; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Result { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRY_CHROME, // Launch chrome right now. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRY_CHROME_AS_DEFAULT, // Launch chrome and make it the default. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOT_NOW, // Don't launch chrome. Exit now. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNINSTALL_CHROME, // Initiate chrome uninstall and exit. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIALOG_ERROR, // An error occurred creating the dialog. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COUNT 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows a modal dialog asking the user to give chrome another try. See 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // above for the possible outcomes of the function. This is an experimental, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-localized dialog. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |flavor| can be 0, 1, 2 or 3 and selects what strings to present. 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // |listener| will be notified when the dialog becomes active and when it is 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // dismissed. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the dialog has no parent and it will position itself in a lower 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corner of the screen. The dialog does not steal focus and does not have an 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entry in the taskbar. 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static Result Show(size_t flavor, const ActiveModalDialogListener& listener); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TryChromeDialogView(size_t flavor); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TryChromeDialogView(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Result ShowModal(const ActiveModalDialogListener& listener); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a screen rectangle that is fit to show the window. In particular 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it has the following properties: a) is visible and b) is attached to the 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bottom of the working area. For LTR machines it returns a left side 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rectangle and for RTL it returns a right side rectangle so that the dialog 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does not compete with the standar place of the start menu. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect ComputeWindowPosition(int width, int height, bool is_RTL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a windows region that looks like a toast of width |w| and height 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |h|. This is best effort, so we don't care much if the operation fails. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetToastRegion(HWND window, int w, int h); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::ButtonListener: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have two buttons and according to what the user clicked we set |result_| 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and we should always close and end the modal loop. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // views::LinkListener: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the user selects the link we need to fire off the default browser that 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by some convoluted logic should not be chrome. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Controls which flavor of the heading text to use. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t flavor_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't own any of these pointers. The |popup_| owns itself and owns the 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // other views. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* popup_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::RadioButton* try_chrome_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::RadioButton* kill_chrome_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::RadioButton* dont_try_chrome_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Checkbox* make_default_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Result result_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TryChromeDialogView); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_FIRST_RUN_TRY_CHROME_DIALOG_VIEW_H_ 130