diff options
Diffstat (limited to 'chrome/browser/tab_contents/native_ui_contents.h')
-rw-r--r-- | chrome/browser/tab_contents/native_ui_contents.h | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/chrome/browser/tab_contents/native_ui_contents.h b/chrome/browser/tab_contents/native_ui_contents.h new file mode 100644 index 0000000..decf123 --- /dev/null +++ b/chrome/browser/tab_contents/native_ui_contents.h @@ -0,0 +1,295 @@ +// Copyright (c) 2006-2008 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_NATIVE_UI_CONTENTS_H__ +#define CHROME_BROWSER_NATIVE_UI_CONTENTS_H__ + +#include "chrome/browser/page_state.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/views/background.h" +#include "chrome/views/link.h" +#include "chrome/views/native_button.h" +#include "chrome/views/text_field.h" +#include "chrome/views/widget_win.h" + +namespace views { +class CheckBox; +class FocusTraversable; +class ImageView; +class ScrollView; +class Throbber; +} + +class NativeUIFactory; +class NativeUI; + +//////////////////////////////////////////////////////////////////////////////// +// +// NativeUIContents +// +// NativeUIContents is a TabContents that is used to show some pages made with +// some native user interface elements. NativeUIContents maintains a list of URL +// path mapping to specific NativeUI implementations. +// +//////////////////////////////////////////////////////////////////////////////// +class NativeUIContents : public TabContents, + public views::WidgetWin { + public: + explicit NativeUIContents(Profile* profile); + + virtual void CreateView(); + virtual HWND GetContainerHWND() const { return GetHWND(); } + virtual void GetContainerBounds(gfx::Rect* out) const; + + // Sets the page state. NativeUIContents takes ownership of the supplied + // PageState. Use a value of NULL to set the state to empty. + void SetPageState(PageState* page_state); + + // Returns the page state. This is intended for UIs that want to store page + // state. + const PageState& page_state() const { return *state_; } + + // + // TabContents implementation + // + virtual bool NavigateToPendingEntry(bool reload); + virtual const std::wstring GetDefaultTitle() const; + virtual SkBitmap GetFavIcon() const; + virtual bool ShouldDisplayURL() { return false; } + virtual bool ShouldDisplayFavIcon() { return true; } + virtual void DidBecomeSelected(); + virtual void SetInitialFocus(); + + // Sets the current loading state. This is public for NativeUIs to update. + void SetIsLoading(bool is_loading, LoadNotificationDetails* details); + + // FocusTraversable Implementation + virtual views::View* FindNextFocusableView( + views::View* starting_view, + bool reverse, + views::FocusTraversable::Direction direction, + bool dont_loop, + views::FocusTraversable** focus_traversable, + views::View** focus_traversable_view); + virtual views::RootView* GetContentsRootView() { return GetRootView(); } + + // Return the scheme used. We currently use chrome-nativeui: + static std::string GetScheme(); + + // Register a NativeUIFactory for a given path. + static void RegisterNativeUIFactory(const GURL& url, + NativeUIFactory* factory); + + protected: + // Should be deleted via CloseContents. + virtual ~NativeUIContents(); + + // Overridden to create a view that that handles drag and drop. + virtual views::RootView* CreateRootView(); + + private: + // Initialize the factories. This is called the first time a NativeUIContents + // object is created. If you add a new factory, you need to add a line in this + // method. + static void InitializeNativeUIFactories(); + + // Instantiates a native UI for the provided URL. This is done by using the + // native factories which have been registered. + static NativeUI* InstantiateNativeUIForURL(const GURL& url, + NativeUIContents* contents); + + // Returns the key to use based on the TabUI's url. + static std::string GetFactoryKey(const GURL& url); + + // Size the current UI if any. + void Layout(); + + // Return the Native UI for the provided URL. The NativeUIs are returned from + // a cache. Returns NULL if no such UI exists. + NativeUI* GetNativeUIForURL(const GURL& url); + + // Windows message handlers. + virtual LRESULT OnCreate(LPCREATESTRUCT create_struct); + virtual void OnDestroy(); + virtual void OnSize(UINT size_command, const CSize& new_size); + virtual void OnWindowPosChanged(WINDOWPOS* position); + + // Whether this contents is visible. + bool is_visible_; + + // Path to NativeUI map. We keep reusing the same UIs. + typedef std::map<std::string, NativeUI*> PathToUI; + PathToUI path_to_native_uis_; + + // The current UI. + NativeUI* current_ui_; + + // The current view for the current UI. We don't ask again just in case the + // UI implementation keeps allocating new uis. + views::View* current_view_; + + // The current page state for the native contents. + scoped_ptr<PageState> state_; + + // Whether factories have been initialized. + static bool g_ui_factories_initialized; + + DISALLOW_EVIL_CONSTRUCTORS(NativeUIContents); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// A native UI needs to implement the following interface to work with the +// NativeUIContents. +// +///////////////////////////////////////////////////////////////////////////// +class NativeUI { + public: + virtual ~NativeUI() {} + + // Return the title for this user interface. The title is used as a tab title. + virtual const std::wstring GetTitle() const = 0; + + // Return the favicon id for this user interface. + virtual const int GetFavIconID () const = 0; + + // Return the view that should be used to render this user interface. + virtual views::View* GetView() = 0; + + // Inform the view that it is about to become visible. + virtual void WillBecomeVisible(NativeUIContents* parent) = 0; + + // Inform the view that it is about to become invisible. + virtual void WillBecomeInvisible(NativeUIContents* parent) = 0; + + // Inform the view that it should recreate the provided state. The state + // should be updated as needed by using the current navigation entry of + // the provided tab contents. + virtual void Navigate(const PageState& state) = 0; + + // Requests the contents set the initial focus. A return value of true + // indicates the contents wants focus and requested focus. A return value of + // false indicates the contents does not want focus, and that focus should + // go to the location bar. + virtual bool SetInitialFocus() = 0; +}; + +///////////////////////////////////////////////////////////////////////////// +// +// NativeUIFactory defines the method necessary to instantiate a NativeUI +// object. Typically, each NativeUI implementation registers an object that +// can instantiate NativeUI objects given the necessary path. +// +///////////////////////////////////////////////////////////////////////////// +class NativeUIFactory { + public: + virtual ~NativeUIFactory() {} + + // Request the factory to instantiate a NativeUI object given the provided + // url. The url is a nativeui: URL which contains the path for which this + // factory was registered. + // + // See NativeUIContents::RegisterNativeUI(). + virtual NativeUI* CreateNativeUIForURL(const GURL& url, + NativeUIContents* contents) = 0; +}; + + +//////////////////////////////////////////////////////////////////////////////// +// +// A standard background for native UIs. +// +//////////////////////////////////////////////////////////////////////////////// +class NativeUIBackground : public views::Background { + public: + NativeUIBackground(); + virtual ~NativeUIBackground(); + + virtual void Paint(ChromeCanvas* canvas, views::View* view) const; + + private: + + DISALLOW_EVIL_CONSTRUCTORS(NativeUIBackground); +}; + +//////////////////////////////////////////////////////////////////////////////// +// +// A view subclass used to implement native uis that feature a search field. +// This view contains a search field and a ScrollView for the contents. It +// implements a consistent look for these UIs. +// +//////////////////////////////////////////////////////////////////////////////// +class SearchableUIContainer : public views::View, + public views::NativeButton::Listener, + public views::LinkController, + public views::TextField::Controller { + public: + // The Delegate is notified when the user clicks the search button. + class Delegate { + public: + virtual void DoSearch(const std::wstring& text) = 0; + virtual const std::wstring GetTitle() const = 0; + virtual const int GetSectionIconID() const = 0; + virtual const std::wstring GetSearchButtonText() const = 0; + }; + + // Create a new SearchableUIContainer given a delegate. + explicit SearchableUIContainer(Delegate* delegate); + + virtual ~SearchableUIContainer(); + + // Add the view as the contents of the container. + void SetContents(views::View* contents); + views::View* GetContents(); + + virtual void Layout(); + + // Overriden to paint the container. + virtual void Paint(ChromeCanvas* canvas); + + // Provide the mode access to various UI elements. + views::TextField* GetSearchField() const; + views::ScrollView* GetScrollView() const; + + // Enable/disable the search text-field/button. + void SetSearchEnabled(bool enabled); + + // Start and stop the throbber. + void StartThrobber(); + void StopThrobber(); + + private: + // Invoked when the user presses the search button. + virtual void ButtonPressed(views::NativeButton* sender); + + // TextField method, does nothing. + virtual void ContentsChanged(views::TextField* sender, + const std::wstring& new_contents) {} + + // Textfield method, if key is the return key the search is updated. + virtual void HandleKeystroke(views::TextField* sender, + UINT message, + TCHAR key, + UINT repeat_count, + UINT flags); + + // Notifies the delegate to update the search. + void DoSearch(); + + void LinkActivated(views::Link* link, int event_flags); + + Delegate* delegate_; + views::Link* title_link_; + views::ImageView* title_image_; + views::ImageView* product_logo_; + views::TextField* search_field_; + views::NativeButton* search_button_; + views::ScrollView* scroll_view_; + views::Throbber* throbber_; + + DISALLOW_EVIL_CONSTRUCTORS(SearchableUIContainer); +}; + +#endif // CHROME_BROWSER_NATIVE_UI_CONTENTS_H__ + |