diff options
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r-- | chrome/browser/chromeos/compact_navigation_bar.cc | 209 | ||||
-rw-r--r-- | chrome/browser/chromeos/compact_navigation_bar.h | 78 |
2 files changed, 287 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/compact_navigation_bar.cc b/chrome/browser/chromeos/compact_navigation_bar.cc new file mode 100644 index 0000000..e2be4a0 --- /dev/null +++ b/chrome/browser/chromeos/compact_navigation_bar.cc @@ -0,0 +1,209 @@ +// Copyright (c) 2009 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/compact_navigation_bar.h" + +#include "app/gfx/canvas.h" +#include "app/resource_bundle.h" +#include "app/theme_provider.h" +#include "base/logging.h" +#include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_window.h" +#include "chrome/browser/views/frame/status_area_view.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "grit/theme_resources.h" +#include "views/controls/button/image_button.h" +#include "views/controls/image_view.h" +#include "views/controls/native/native_view_host.h" + +// Padding inside each button around the image. +static const int kInnerPadding = 1; + +// Spacing between buttons. +static const int kHorizPadding = 3; + +static const int kURLWidth = 150; + +static const int kChromeButtonSize = 25; + +CompactNavigationBar::CompactNavigationBar(Browser* browser) + : browser_(browser), + initialized_(false) { +} + +CompactNavigationBar::~CompactNavigationBar() { +} + +void CompactNavigationBar::Init() { + DCHECK(!initialized_); + initialized_ = true; + + ResourceBundle& resource_bundle = ResourceBundle::GetSharedInstance(); + + chrome_button_ = new views::ImageButton(this); + chrome_button_->SetImage(views::CustomButton::BS_NORMAL, + resource_bundle.GetBitmapNamed(IDR_COMPACTNAV_CHROME)); + chrome_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, + views::ImageButton::ALIGN_MIDDLE); + AddChildView(chrome_button_); + + back_button_ = new views::ImageButton(this); + back_button_->SetImage(views::CustomButton::BS_NORMAL, + resource_bundle.GetBitmapNamed(IDR_COMPACTNAV_BACK)); + back_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, + views::ImageButton::ALIGN_MIDDLE); + AddChildView(back_button_); + + bf_separator_ = new views::ImageView; + bf_separator_->SetImage( + resource_bundle.GetBitmapNamed(IDR_COMPACTNAV_SEPARATOR)); + AddChildView(bf_separator_); + + forward_button_ = new views::ImageButton(this); + forward_button_->SetImage(views::CustomButton::BS_NORMAL, + resource_bundle.GetBitmapNamed(IDR_COMPACTNAV_FORWARD)); + forward_button_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, + views::ImageButton::ALIGN_MIDDLE); + AddChildView(forward_button_); + + // URL bar construction. + 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_ = new views::NativeViewHost; + AddChildView(location_entry_view_); + location_entry_view_->set_focus_view(this); + location_entry_view_->Attach(location_entry_->widget()); +} + +gfx::Size CompactNavigationBar::GetPreferredSize() { + int width = 0; + + width += kChromeButtonSize + kHorizPadding; // Chrome button. + width += kURLWidth + kHorizPadding; // URL bar. + width += back_button_->GetPreferredSize().width() + kHorizPadding + + kInnerPadding * 2; + width += bf_separator_->GetPreferredSize().width() + kHorizPadding; + width += forward_button_->GetPreferredSize().width() + kHorizPadding + + kInnerPadding * 2; + + return gfx::Size(width, kChromeButtonSize); +} + +void CompactNavigationBar::Layout() { + if (!initialized_) + return; + + int curx = 0; + + chrome_button_->SetBounds(curx, 0, kChromeButtonSize, height()); + curx += kChromeButtonSize + kHorizPadding; + + // URL bar. + location_entry_view_->SetBounds(curx, 0, kURLWidth, height()); + curx += kURLWidth + kHorizPadding; + + // "Back | Forward" section. + gfx::Size button_size = back_button_->GetPreferredSize(); + button_size.set_width(button_size.width() + kInnerPadding * 2); + back_button_->SetBounds(curx, 0, button_size.width(), height()); + curx += button_size.width() + kHorizPadding; + + button_size = bf_separator_->GetPreferredSize(); + bf_separator_->SetBounds(curx, 0, button_size.width(), height()); + curx += button_size.width() + kHorizPadding; + + button_size = forward_button_->GetPreferredSize(); + button_size.set_width(button_size.width() + kInnerPadding * 2); + forward_button_->SetBounds(curx, 0, button_size.width(), height()); + curx += button_size.width() + kHorizPadding; +} + +void CompactNavigationBar::Paint(gfx::Canvas* canvas) { + ThemeProvider* theme = browser_->profile()->GetThemeProvider(); + + // Fill the background. + SkBitmap* background; + if (browser_->window()->IsActive()) + background = theme->GetBitmapNamed(IDR_THEME_FRAME); + else + background = theme->GetBitmapNamed(IDR_THEME_FRAME_INACTIVE); + canvas->TileImageInt(*background, 0, 0, width(), height()); +} + +void CompactNavigationBar::ButtonPressed(views::Button* sender) { + TabContents* tab_contents = browser_->GetSelectedTabContents(); + if (!tab_contents) + return; + + if (sender == chrome_button_) { + AddTabWithURL(GURL("http://goto.ext.google.com/tik-tok"), + PageTransition::START_PAGE); + } else if (sender == back_button_) { + if (tab_contents->controller().CanGoBack()) + tab_contents->controller().GoBack(); + } else if (sender == forward_button_) { + if (tab_contents->controller().CanGoForward()) + tab_contents->controller().GoForward(); + } else { + NOTREACHED(); + } +} + +void CompactNavigationBar::OnAutocompleteAccept( + const GURL& url, + WindowOpenDisposition disposition, + PageTransition::Type transition, + const GURL& alternate_nav_url) { + AddTabWithURL(url, transition); +} + +void CompactNavigationBar::OnChanged() { + // Other one does "DoLayout" here. +} + +void CompactNavigationBar::OnInputInProgress(bool in_progress) { +} + +SkBitmap CompactNavigationBar::GetFavIcon() const { + return SkBitmap(); +} + +std::wstring CompactNavigationBar::GetTitle() const { + return std::wstring(); +} + +gfx::Rect CompactNavigationBar::GetPopupBounds() const { + gfx::Point upper_left(0, height()); + ConvertPointToScreen(this, &upper_left); + return gfx::Rect(upper_left.x(), upper_left.y(), 700, 100); +} + +void CompactNavigationBar::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()->IndexOfFirstNonPinnedTab(); + 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; + } + } +} diff --git a/chrome/browser/chromeos/compact_navigation_bar.h b/chrome/browser/chromeos/compact_navigation_bar.h new file mode 100644 index 0000000..f086f34 --- /dev/null +++ b/chrome/browser/chromeos/compact_navigation_bar.h @@ -0,0 +1,78 @@ +// Copyright (c) 2009 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_CHROMEOS_COMPACT_NAVIGATION_BAR_H_ +#define CHROME_BROWSER_CHROMEOS_COMPACT_NAVIGATION_BAR_H_ + +#include "base/basictypes.h" +#include "base/scoped_ptr.h" +#include "chrome/browser/autocomplete/autocomplete_edit.h" +#include "chrome/browser/autocomplete/autocomplete_popup_view.h" +#include "views/controls/button/button.h" +#include "views/view.h" + +class AutocompleteEditViewGtk; +class Browser; + +namespace views { +class ImageButton; +class ImageView; +class NativeViewHost; +} + +// This class provides a small navigation bar that includes back, forward, and +// a small text entry box. +class CompactNavigationBar : public views::View, + public views::ButtonListener, + public AutocompleteEditController, + public AutocompletePopupPositioner { + public: + explicit CompactNavigationBar(Browser* browser); + virtual ~CompactNavigationBar(); + + // Must be called before anything else, but after adding this view to the + // widget. + void Init(); + + // views::View overrides. + virtual gfx::Size GetPreferredSize(); + virtual void Layout(); + virtual void Paint(gfx::Canvas* canvas); + + private: + // views::ButtonListener implementation. + virtual void ButtonPressed(views::Button* sender); + + // AutocompleteController implementation. + virtual void OnAutocompleteAccept(const GURL& url, + WindowOpenDisposition disposition, + PageTransition::Type transition, + const GURL& alternate_nav_url); + virtual void OnChanged(); + virtual void OnInputInProgress(bool in_progress); + virtual SkBitmap GetFavIcon() const; + virtual std::wstring GetTitle() const; + + // AutocompletePopupPositioner implementation. + virtual gfx::Rect GetPopupBounds() const; + + void AddTabWithURL(const GURL& url, PageTransition::Type transition); + + Browser* browser_; + + bool initialized_; + + views::ImageButton* chrome_button_; + + views::ImageButton* back_button_; + views::ImageView* bf_separator_; + views::ImageButton* forward_button_; + + scoped_ptr<AutocompleteEditViewGtk> location_entry_; + views::NativeViewHost* location_entry_view_; + + DISALLOW_COPY_AND_ASSIGN(CompactNavigationBar); +}; + +#endif // CHROME_BROWSER_CHROMEOS_COMPACT_NAVIGATION_BAR_H_ |