diff options
Diffstat (limited to 'chrome/browser/chromeos/app_launcher.cc')
-rw-r--r-- | chrome/browser/chromeos/app_launcher.cc | 495 |
1 files changed, 0 insertions, 495 deletions
diff --git a/chrome/browser/chromeos/app_launcher.cc b/chrome/browser/chromeos/app_launcher.cc deleted file mode 100644 index d3e3fef..0000000 --- a/chrome/browser/chromeos/app_launcher.cc +++ /dev/null @@ -1,495 +0,0 @@ -// Copyright (c) 2010 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. - -#include "chrome/browser/chromeos/app_launcher.h" - -#include <string> -#include <vector> - -#include "app/gfx/canvas.h" -#include "app/resource_bundle.h" -#include "base/command_line.h" -#include "base/message_loop.h" -#include "base/string_util.h" -#include "chrome/browser/autocomplete/autocomplete_edit.h" -#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" -#include "chrome/browser/browser.h" -#include "chrome/browser/browser_list.h" -#include "chrome/browser/browser_window.h" -#include "chrome/browser/bubble_positioner.h" -#include "chrome/browser/chromeos/frame/browser_view.h" -#include "chrome/browser/chromeos/status/status_area_view.h" -#include "chrome/browser/chromeos/wm_ipc.h" -#include "chrome/browser/in_process_webkit/dom_storage_context.h" -#include "chrome/browser/in_process_webkit/webkit_context.h" -#include "chrome/browser/profile.h" -#include "chrome/browser/renderer_host/render_view_host.h" -#include "chrome/browser/renderer_host/render_view_host_factory.h" -#include "chrome/browser/renderer_host/render_widget_host_view.h" -#include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" -#include "chrome/browser/renderer_host/site_instance.h" -#include "chrome/browser/renderer_preferences_util.h" -#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h" -#include "chrome/browser/tab_contents/tab_contents.h" -#include "chrome/browser/views/bubble_border.h" -#include "gfx/insets.h" -#include "gfx/point.h" -#include "grit/app_resources.h" -#include "grit/generated_resources.h" -#include "grit/theme_resources.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "views/background.h" -#include "views/controls/native/native_view_host.h" -#include "views/painter.h" -#include "views/screen.h" -#include "views/widget/root_view.h" -#include "views/widget/widget_gtk.h" - -namespace { - -// Padding & margins for the navigation entry. -const int kNavigationEntryPadding = 2; -const int kNavigationEntryXMargin = 3; -const int kNavigationEntryYMargin = 1; - -// NavigationBar size. -const int kNavigationBarHeight = 25; - -// Padding for the bubble info window. -const int kBubbleWindowXPadding = 6; -const int kBubbleWindowYPadding = 16; - -// Command line switch for specifying url of the page. -const wchar_t kURLSwitch[] = L"main-menu-url"; - -// Command line switch for specifying the size of the main menu. The default is -// full screen. -const wchar_t kMenuSizeSwitch[] = L"main-menu-size"; - -// URL of the page to load. This is ignored if kURLSwitch is specified. -const char kMenuURL[] = "http://goto.ext.google.com/crux-home"; - -// Returns the URL of the menu. -static GURL GetMenuURL() { - std::wstring url_string = - CommandLine::ForCurrentProcess()->GetSwitchValue(kURLSwitch); - if (!url_string.empty()) - return GURL(WideToUTF8(url_string)); - return GURL(kMenuURL); -} - -// RenderWidgetHostViewGtk propagates the mouse press events (see -// render_widget_host_view_gtk.cc). We subclass to stop the propagation here, -// as if the click event was propagated it would reach the TopContainer view and -// it would close the popup. -class RWHVNativeViewHost : public views::NativeViewHost { - public: - RWHVNativeViewHost() {} - - virtual bool OnMousePressed(const views::MouseEvent& event) { return true; } - - private: - DISALLOW_COPY_AND_ASSIGN(RWHVNativeViewHost); -}; - -} // namspace - -namespace chromeos { - -//////////////////////////////////////////////////////////////////////////////// -// NavigationBar -// -// A navigation bar that is shown in the app launcher in compact navigation bar -// mode. - -class NavigationBar : public views::View, - public AutocompleteEditController, - public BubblePositioner { - public: - explicit NavigationBar(AppLauncher* app_launcher) - : views::View(), - app_launcher_(app_launcher), - location_entry_view_(NULL) { - SetFocusable(true); - location_entry_view_ = new views::NativeViewHost; - AddChildView(location_entry_view_); - } - - virtual ~NavigationBar() { - if (location_entry_view_->native_view()) - location_entry_view_->Detach(); - } - - // views::View overrides. - virtual void Focus() { - location_entry_->SetFocus(); - location_entry_->SelectAll(true); - } - - virtual void Layout() { - gfx::Rect bounds = GetLocalBounds(false); - - const int vertical_margin = - kNavigationEntryPadding + kNavigationEntryYMargin; - - location_entry_view_->SetBounds( - bounds.x() + kNavigationEntryXMargin + kNavigationEntryPadding, - bounds.y() + vertical_margin, - bounds.width() - 2 * (kNavigationEntryPadding + - kNavigationEntryXMargin), - bounds.height() - vertical_margin * 2); - } - - virtual void Paint(gfx::Canvas* canvas) { - const int padding = kNavigationEntryPadding; - canvas->FillRectInt(SK_ColorWHITE, 0, 0, width(), height()); - // Draw border around the entry. - gfx::Rect bounds = location_entry_view_->GetBounds( - views::View::APPLY_MIRRORING_TRANSFORMATION); - canvas->DrawRectInt(SK_ColorGRAY, - bounds.x() - padding, - bounds.y() - padding, - bounds.width() + padding * 2, - bounds.height() + padding * 2); - } - - // BubblePositioner implementation. - virtual gfx::Rect GetLocationStackBounds() const { - gfx::Rect bounds = location_entry_view_->GetBounds( - views::View::APPLY_MIRRORING_TRANSFORMATION); - gfx::Point origin(bounds.x(), bounds.bottom() + kNavigationEntryPadding); - views::View::ConvertPointToScreen(this, &origin); - gfx::Rect rect = gfx::Rect(origin, gfx::Size(500, 0)); - if (UILayoutIsRightToLeft()) { - // Align the window to the right side of the entry view when - // UI is RTL mode. - rect.set_x(rect.x() - (rect.width() - location_entry_view_->width())); - } - return rect; - } - - // AutocompleteController implementation. - virtual void OnAutocompleteAccept(const GURL& url, - WindowOpenDisposition disposition, - PageTransition::Type transition, - const GURL& alternate_nav_url) { - app_launcher_->AddTabWithURL(url, transition); - app_launcher_->Hide(); - } - virtual void OnChanged() {} - virtual void OnInputInProgress(bool in_progress) {} - virtual void OnKillFocus() {} - virtual void OnSetFocus() { - views::FocusManager* focus_manager = GetFocusManager(); - if (!focus_manager) { - NOTREACHED(); - return; - } - focus_manager->SetFocusedView(this); - } - virtual SkBitmap GetFavIcon() const { - return SkBitmap(); - } - virtual std::wstring GetTitle() const { - return std::wstring(); - } - - // AutocompleteEditView depends on the browser instance. - // Create new one when the browser instance changes. - void Update(Browser* browser) { - // Detach the native view if any. - if (location_entry_view_ && location_entry_view_->native_view()) - location_entry_view_->Detach(); - - location_entry_.reset(new AutocompleteEditViewGtk( - this, browser->toolbar_model(), browser->profile(), - browser->command_updater(), false, this)); - location_entry_->Init(); - gtk_widget_show_all(location_entry_->widget()); - gtk_widget_hide(location_entry_->widget()); - - location_entry_view_->set_focus_view(this); - location_entry_view_->Attach(location_entry_->widget()); - } - - private: - AppLauncher* app_launcher_; - views::NativeViewHost* location_entry_view_; - scoped_ptr<AutocompleteEditViewGtk> location_entry_; - - DISALLOW_COPY_AND_ASSIGN(NavigationBar); -}; - -//////////////////////////////////////////////////////////////////////////////// -// TopContainer -// -// A view that grays-out the browser and contains the navigation bar and -// renderer view. - -AppLauncher::TopContainer::TopContainer(AppLauncher* app_launcher) - : app_launcher_(app_launcher) { - // Use a transparent black background so the browser appears grayed-out. - set_background(views::Background::CreateSolidBackground(0, 0, 0, 100)); -} - -void AppLauncher::TopContainer::Layout() { - if (bounds().IsEmpty()) - return; - - // We only expect to contain the BubbleContents. - DCHECK(GetChildViewCount() == 1); - GetChildViewAt(0)->SetBounds(kBubbleWindowXPadding, kBubbleWindowYPadding, - width() * 2 / 3, height() * 4 / 5); -} - -bool AppLauncher::TopContainer::OnMousePressed(const views::MouseEvent& event) { - // Clicking outside the bubble closes the bubble. - app_launcher_->Hide(); - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// BubbleContainer -// -// The view that contains the navigation bar and render view. It has a bubble -// border. - -AppLauncher::BubbleContainer::BubbleContainer(AppLauncher* app_launcher) - : app_launcher_(app_launcher) { - BubbleBorder* bubble_border = new BubbleBorder(); - bubble_border->set_arrow_location(BubbleBorder::TOP_LEFT); - set_border(bubble_border); - set_background(new BubbleBackground(bubble_border)); -} - -void AppLauncher::BubbleContainer::Layout() { - if (bounds().IsEmpty() || GetChildViewCount() == 0) - return; - - gfx::Rect bounds = GetLocalBounds(false); - // TODO(jcampan): figure-out why we need to inset for the contained view not - // to paint over the bubble border. - bounds.Inset(2, 2); - - app_launcher_->navigation_bar_->SetBounds(bounds.x(), bounds.y(), - bounds.width(), - kNavigationBarHeight); - int render_y = app_launcher_->navigation_bar_->bounds().bottom(); - gfx::Size rwhv_size = - gfx::Size(bounds.width(), - std::max(0, bounds.height() - render_y + bounds.y())); - app_launcher_->render_view_container_->SetBounds(bounds.x(), render_y, - rwhv_size.width(), - rwhv_size.height()); - app_launcher_->rwhv_->SetSize(rwhv_size); -} - -//////////////////////////////////////////////////////////////////////////////// -// AppLauncher - -AppLauncher::AppLauncher(Browser* browser) - : browser_(browser), - popup_(NULL), - site_instance_(NULL), - contents_rvh_(NULL), - rwhv_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST(tab_contents_delegate_(this)), - ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), - top_container_(NULL), - bubble_container_(NULL), - navigation_bar_(NULL), - render_view_container_(NULL), - has_shown_(false) { - popup_ = new views::WidgetGtk(views::WidgetGtk::TYPE_WINDOW); - // The background image has transparency, so we make the window transparent. - popup_->MakeTransparent(); - popup_->Init(NULL, gfx::Rect()); - WmIpc::instance()->SetWindowType( - popup_->GetNativeView(), - WmIpc::WINDOW_TYPE_CHROME_INFO_BUBBLE, - NULL); - - // Register Esc as an accelerator for closing the app launcher. - views::FocusManager* focus_manager = popup_->GetFocusManager(); - focus_manager->RegisterAccelerator(views::Accelerator(base::VKEY_ESCAPE, - false, false, false), - this); - - top_container_ = new TopContainer(this); - popup_->SetContentsView(top_container_); - - bubble_container_ = new BubbleContainer(this); - top_container_->AddChildView(bubble_container_); - navigation_bar_ = new NavigationBar(this); - bubble_container_->AddChildView(navigation_bar_); - - GURL menu_url(GetMenuURL()); - DCHECK(BrowserList::begin() != BrowserList::end()); - // TODO(sky): this shouldn't pick a random profile to use. - Profile* profile = (*BrowserList::begin())->profile(); - int64 session_storage_namespace_id = profile->GetWebKitContext()-> - dom_storage_context()->AllocateSessionStorageNamespaceId(); - site_instance_ = SiteInstance::CreateSiteInstanceForURL(profile, menu_url); - contents_rvh_ = new RenderViewHost(site_instance_, this, MSG_ROUTING_NONE, - session_storage_namespace_id); - - rwhv_ = new RenderWidgetHostViewGtk(contents_rvh_); - rwhv_->InitAsChild(); - contents_rvh_->CreateRenderView(profile->GetRequestContext()); - - render_view_container_ = new RWHVNativeViewHost; - bubble_container_->AddChildView(render_view_container_); - render_view_container_->Attach(rwhv_->GetNativeView()); - contents_rvh_->NavigateToURL(menu_url); - - navigation_bar_->Update(browser); - // Set the transient window so that ChromeOS WM treat this - // as if a popup window. - gtk_window_set_transient_for( - GTK_WINDOW(popup_->GetNativeView()), - GTK_WINDOW(browser_->window()->GetNativeHandle())); - - ActiveWindowWatcherX::AddObserver(this); -} - -AppLauncher::~AppLauncher() { - contents_rvh_->Shutdown(); - popup_->CloseNow(); - ActiveWindowWatcherX::RemoveObserver(this); -} - -void AppLauncher::Update() { - popup_->SetBounds(browser_->window()->GetRestoredBounds()); - top_container_->Layout(); -} - -void AppLauncher::Show() { - Cleanup(); - - Update(); - popup_->Show(); - - GtkWidget* rwhv_widget = rwhv_->GetNativeView(); - if (!has_shown_) { - has_shown_ = true; - gtk_widget_realize(rwhv_widget); - } -} - -void AppLauncher::ActiveWindowChanged(GdkWindow* active_window) { - if (!popup_->IsActive()) - Hide(); - else - navigation_bar_->RequestFocus(); -} - -bool AppLauncher::AcceleratorPressed(const views::Accelerator& accelerator) { - DCHECK(accelerator.GetKeyCode() == base::VKEY_ESCAPE); - popup_->Hide(); - return true; -} - -void AppLauncher::Hide() { - popup_->Hide(); - // The stack may have pending_contents_ on it. Delay deleting the - // pending_contents_ as TabContents doesn't deal well with being deleted - // while on the stack. - MessageLoop::current()->PostTask(FROM_HERE, - method_factory_.NewRunnableMethod(&AppLauncher::Cleanup)); -} - -void AppLauncher::Cleanup() { - pending_contents_.reset(NULL); - method_factory_.RevokeAll(); -} - -void AppLauncher::RequestMove(const gfx::Rect& new_bounds) { - // Invoking PositionChild results in a gtk signal that triggers attempting to - // to resize the window. We need to set the size request so that it resizes - // correctly when this happens. - gtk_widget_set_size_request(popup_->GetNativeView(), - new_bounds.width(), new_bounds.height()); - popup_->SetBounds(new_bounds); -} - -RendererPreferences AppLauncher::GetRendererPrefs(Profile* profile) const { - RendererPreferences preferences; - renderer_preferences_util::UpdateFromSystemSettings(&preferences, profile); - return preferences; -} - -void AppLauncher::AddTabWithURL(const GURL& url, - PageTransition::Type transition) { - switch (StatusAreaView::GetOpenTabsMode()) { - case StatusAreaView::OPEN_TABS_ON_LEFT: { - // Add the new tab at the first non-pinned location. - int index = browser_->tabstrip_model()->IndexOfFirstNonMiniTab(); - browser_->AddTabWithURL(url, GURL(), transition, - true, index, true, NULL); - break; - } - case StatusAreaView::OPEN_TABS_CLOBBER: { - browser_->GetSelectedTabContents()->controller().LoadURL( - url, GURL(), transition); - break; - } - case StatusAreaView::OPEN_TABS_ON_RIGHT: { - browser_->AddTabWithURL(url, GURL(), transition, true, -1, true, NULL); - break; - } - } -} - -void AppLauncher::CreateNewWindow(int route_id) { - if (pending_contents_.get()) { - NOTREACHED(); - return; - } - - helper_.CreateNewWindow(route_id, browser_->profile(), site_instance_, - DOMUIFactory::GetDOMUIType(GURL(GetMenuURL())), - NULL); - pending_contents_.reset(helper_.GetCreatedWindow(route_id)); - pending_contents_->set_delegate(&tab_contents_delegate_); -} - -void AppLauncher::ShowCreatedWindow(int route_id, - WindowOpenDisposition disposition, - const gfx::Rect& initial_pos, - bool user_gesture) { - if (disposition == NEW_POPUP) { - pending_contents_->set_delegate(NULL); - browser_->GetSelectedTabContents()->AddNewContents( - pending_contents_.release(), disposition, initial_pos, user_gesture); - Hide(); - } -} - -void AppLauncher::StartDragging(const WebDropData& drop_data, - WebKit::WebDragOperationsMask allowed_ops, - const SkBitmap& image, - const gfx::Point& image_offset) { - // We're not going to do any drag & drop, but we have to tell the renderer the - // drag & drop ended, othewise the renderer thinks the drag operation is - // underway and mouse events won't work. - contents_rvh_->DragSourceSystemDragEnded(); -} - -AppLauncher::TabContentsDelegateImpl::TabContentsDelegateImpl( - AppLauncher* app_launcher) - : app_launcher_(app_launcher) { -} - -void AppLauncher::TabContentsDelegateImpl::OpenURLFromTab( - TabContents* source, - const GURL& url, - const GURL& referrer, - WindowOpenDisposition disposition, - PageTransition::Type transition) { - app_launcher_->browser_->OpenURL(url, referrer, NEW_FOREGROUND_TAB, - PageTransition::LINK); - app_launcher_->Hide(); -} - -} // namespace chromeos |