blob: b24883021cd368242e67d427dda963c28fc99cdf [file] [log] [blame]
// Copyright 2014 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_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_
#include "base/macros.h"
#include "chrome/browser/extensions/extension_install_prompt.h"
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/animation/slide_animation.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/link_listener.h"
#include "ui/views/view.h"
#include "ui/views/window/dialog_delegate.h"
typedef std::vector<base::string16> PermissionDetails;
class Profile;
namespace content {
class PageNavigator;
}
namespace extensions {
class ExperienceSamplingEvent;
}
namespace ui {
class ResourceBundle;
}
namespace views {
class GridLayout;
class ImageButton;
class Link;
}
// Implements the extension installation dialog for TOOLKIT_VIEWS.
class ExtensionInstallDialogView : public views::DialogDelegateView,
public views::LinkListener {
public:
ExtensionInstallDialogView(
Profile* profile,
content::PageNavigator* navigator,
const ExtensionInstallPrompt::DoneCallback& done_callback,
scoped_ptr<ExtensionInstallPrompt::Prompt> prompt);
~ExtensionInstallDialogView() override;
// Returns the interior ScrollView of the dialog. This allows us to inspect
// the contents of the DialogView.
const views::ScrollView* scroll_view() const { return scroll_view_; }
private:
// views::DialogDelegateView:
int GetDialogButtons() const override;
base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
int GetDefaultDialogButton() const override;
bool Cancel() override;
bool Accept() override;
ui::ModalType GetModalType() const override;
void Layout() override;
gfx::Size GetPreferredSize() const override;
// views::LinkListener:
void LinkClicked(views::Link* source, int event_flags) override;
// Initializes the dialog view, adding in permissions if they exist.
void InitView();
// Adds permissions of |perm_type| to the dialog view if they exist.
bool AddPermissions(views::GridLayout* layout,
ui::ResourceBundle& rb,
int column_set_id,
int left_column_width,
ExtensionInstallPrompt::PermissionsType perm_type);
// Creates a layout consisting of dialog header, extension name and icon.
views::GridLayout* CreateLayout(int left_column_width, int column_set_id);
bool is_bundle_install() const {
return prompt_->type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT ||
prompt_->type() ==
ExtensionInstallPrompt::DELEGATED_BUNDLE_PERMISSIONS_PROMPT;
}
bool is_external_install() const {
return prompt_->type() == ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT;
}
// Updates the histogram that holds installation accepted/aborted data.
void UpdateInstallResultHistogram(bool accepted) const;
Profile* profile_;
content::PageNavigator* navigator_;
ExtensionInstallPrompt::DoneCallback done_callback_;
scoped_ptr<ExtensionInstallPrompt::Prompt> prompt_;
// The container view that contains all children (heading, icon, webstore
// data, and the scroll view with permissions etc.), excluding the buttons,
// which are added automatically by the dialog system.
View* container_;
// The scroll view containing all the details for the dialog (including all
// collapsible/expandable sections).
views::ScrollView* scroll_view_;
// The preferred size of the dialog.
gfx::Size dialog_size_;
// ExperienceSampling: Track this UI event.
scoped_ptr<extensions::ExperienceSamplingEvent> sampling_event_;
// Set to true once the user's selection has been received and the callback
// has been run.
bool handled_result_;
DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogView);
};
// A simple view that prepends a view with a bullet with the help of a grid
// layout.
class BulletedView : public views::View {
public:
explicit BulletedView(views::View* view);
private:
DISALLOW_COPY_AND_ASSIGN(BulletedView);
};
// A simple view that prepends a view with an icon with the help of a grid
// layout.
class IconedView : public views::View {
public:
IconedView(views::View* view, const gfx::ImageSkia& image);
private:
DISALLOW_COPY_AND_ASSIGN(IconedView);
};
// A view to display text with an expandable details section.
class ExpandableContainerView : public views::View,
public views::ButtonListener,
public views::LinkListener,
public gfx::AnimationDelegate {
public:
ExpandableContainerView(ExtensionInstallDialogView* owner,
const base::string16& description,
const PermissionDetails& details,
int horizontal_space,
bool parent_bulleted);
~ExpandableContainerView() override;
// views::View:
void ChildPreferredSizeChanged(views::View* child) override;
// views::ButtonListener:
void ButtonPressed(views::Button* sender, const ui::Event& event) override;
// views::LinkListener:
void LinkClicked(views::Link* source, int event_flags) override;
// gfx::AnimationDelegate:
void AnimationProgressed(const gfx::Animation* animation) override;
void AnimationEnded(const gfx::Animation* animation) override;
private:
// A view which displays all the details of an IssueAdviceInfoEntry.
class DetailsView : public views::View {
public:
DetailsView(int horizontal_space, bool parent_bulleted);
~DetailsView() override {}
// views::View:
gfx::Size GetPreferredSize() const override;
void AddDetail(const base::string16& detail);
// Animates this to be a height proportional to |state|.
void AnimateToState(double state);
private:
views::GridLayout* layout_;
double state_;
DISALLOW_COPY_AND_ASSIGN(DetailsView);
};
// Expand/Collapse the detail section for this ExpandableContainerView.
void ToggleDetailLevel();
// Updates |arrow_toggle_| according to the given state.
void UpdateArrowToggle(bool expanded);
// The dialog that owns |this|. It's also an ancestor in the View hierarchy.
ExtensionInstallDialogView* owner_;
// A view for showing |issue_advice.details|.
DetailsView* details_view_;
gfx::SlideAnimation slide_animation_;
// The 'more details' link shown under the heading (changes to 'hide details'
// when the details section is expanded).
views::Link* more_details_;
// The up/down arrow next to the 'more detail' link (points up/down depending
// on whether the details section is expanded).
views::ImageButton* arrow_toggle_;
// Whether the details section is expanded.
bool expanded_;
DISALLOW_COPY_AND_ASSIGN(ExpandableContainerView);
};
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_INSTALL_DIALOG_VIEW_H_