1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_dialog_views.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/bind.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/metrics/histogram.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/ui/views/app_list/app_list_dialog_container.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_header_panel.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_summary_panel.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/extension.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/common/manifest.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/app_list/app_list_constants.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/geometry/rect.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/geometry/size.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/border.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/controls/scroll_view.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/widget/widget.h"
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/views/window/dialog_delegate.h"
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ShowAppInfoDialog(gfx::NativeWindow parent,
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       const gfx::Rect& bounds,
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       Profile* profile,
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       const extensions::Extension* app,
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       const base::Closure& close_callback) {
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialogOpenedForType",
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            app->GetType(),
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            extensions::Manifest::NUM_LOAD_TYPES);
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Apps.AppInfoDialogOpenedForLocation",
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            app->location(),
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            extensions::Manifest::NUM_LOCATIONS);
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  views::View* app_info_view = new AppInfoDialog(parent, profile, app);
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  views::Widget* dialog_widget = views::DialogDelegate::CreateDialogWidget(
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new AppListDialogContainer(app_info_view, close_callback), NULL, parent);
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  dialog_widget->SetBounds(bounds);
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_widget->Show();
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AppInfoDialog::AppInfoDialog(gfx::NativeWindow parent_window,
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                             Profile* profile,
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                             const extensions::Extension* app)
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : dialog_header_(NULL), dialog_body_(NULL), dialog_footer_(NULL) {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  views::BoxLayout* layout =
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0);
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetLayoutManager(layout);
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const int kHorizontalSeparatorHeight = 1;
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_header_ = new AppInfoHeaderPanel(profile, app);
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_header_->SetBorder(views::Border::CreateSolidSidedBorder(
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0, 0, kHorizontalSeparatorHeight, 0, app_list::kDialogSeparatorColor));
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  dialog_footer_ = new AppInfoFooterPanel(parent_window, profile, app);
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_footer_->SetBorder(views::Border::CreateSolidSidedBorder(
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      kHorizontalSeparatorHeight, 0, 0, 0, app_list::kDialogSeparatorColor));
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!dialog_footer_->has_children()) {
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // If there are no controls in the footer, don't add it to the dialog.
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    delete dialog_footer_;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    dialog_footer_ = NULL;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Make a vertically stacked view of all the panels we want to display in the
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // dialog.
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  views::View* dialog_body_contents = new views::View();
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_body_contents->SetLayoutManager(
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new views::BoxLayout(views::BoxLayout::kVertical,
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           views::kButtonHEdgeMarginNew,
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           views::kPanelVertMargin,
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           views::kUnrelatedControlVerticalSpacing));
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_body_contents->AddChildView(new AppInfoSummaryPanel(profile, app));
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_body_contents->AddChildView(new AppInfoPermissionsPanel(profile, app));
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Clip the scrollable view so that the scrollbar appears. As long as this
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // is larger than the height of the dialog, it will be resized to the dialog's
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // actual height.
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(sashab): Add ClipHeight() as a parameter-less method to
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // views::ScrollView() to mimic this behaviour.
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const int kMaxDialogHeight = 1000;
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_body_ = new views::ScrollView();
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_body_->ClipHeightTo(kMaxDialogHeight, kMaxDialogHeight);
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dialog_body_->SetContents(dialog_body_contents);
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddChildView(dialog_header_);
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AddChildView(dialog_body_);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  layout->SetFlexForView(dialog_body_, 1);
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (dialog_footer_)
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AddChildView(dialog_footer_);
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)AppInfoDialog::~AppInfoDialog() {
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
101