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