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