// Copyright 2014 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 APPS_UI_VIEWS_NATIVE_APP_WINDOW_VIEWS_H_ #define APPS_UI_VIEWS_NATIVE_APP_WINDOW_VIEWS_H_ #include "base/observer_list.h" #include "content/public/browser/web_contents_observer.h" #include "extensions/browser/app_window/app_window.h" #include "extensions/browser/app_window/native_app_window.h" #include "extensions/browser/app_window/size_constraints.h" #include "ui/gfx/rect.h" #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" #include "ui/views/widget/widget_observer.h" class SkRegion; namespace content { class BrowserContext; class RenderViewHost; class WebContents; } namespace extensions { class Extension; } namespace ui { class MenuModel; } namespace views { class MenuRunner; class WebView; } namespace apps { class AppWindowFrameView; // A NativeAppWindow backed by a views::Widget. This class may be used alone // as a stub or subclassed (for example, ChromeNativeAppWindowViews). class NativeAppWindowViews : public extensions::NativeAppWindow, public content::WebContentsObserver, public views::WidgetDelegateView, public views::WidgetObserver { public: NativeAppWindowViews(); virtual ~NativeAppWindowViews(); void Init(extensions::AppWindow* app_window, const extensions::AppWindow::CreateParams& create_params); // Signal that CanHaveTransparentBackground has changed. void OnCanHaveAlphaEnabledChanged(); views::Widget* widget() { return widget_; } void set_window_for_testing(views::Widget* window) { widget_ = window; } void set_web_view_for_testing(views::WebView* view) { web_view_ = view; } protected: extensions::AppWindow* app_window() { return app_window_; } const extensions::AppWindow* app_window() const { return app_window_; } const views::Widget* widget() const { return widget_; } views::WebView* web_view() { return web_view_; } // Initializes |widget_| for |app_window|. virtual void InitializeWindow( extensions::AppWindow* app_window, const extensions::AppWindow::CreateParams& create_params); // ui::BaseWindow implementation. virtual bool IsActive() const OVERRIDE; virtual bool IsMaximized() const OVERRIDE; virtual bool IsMinimized() const OVERRIDE; virtual bool IsFullscreen() const OVERRIDE; virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; virtual gfx::Rect GetRestoredBounds() const OVERRIDE; virtual ui::WindowShowState GetRestoredState() const OVERRIDE; virtual gfx::Rect GetBounds() const OVERRIDE; virtual void Show() OVERRIDE; virtual void ShowInactive() OVERRIDE; virtual void Hide() OVERRIDE; virtual void Close() OVERRIDE; virtual void Activate() OVERRIDE; virtual void Deactivate() OVERRIDE; virtual void Maximize() OVERRIDE; virtual void Minimize() OVERRIDE; virtual void Restore() OVERRIDE; virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; virtual void FlashFrame(bool flash) OVERRIDE; virtual bool IsAlwaysOnTop() const OVERRIDE; virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; // WidgetDelegate implementation. virtual void OnWidgetMove() OVERRIDE; virtual views::View* GetInitiallyFocusedView() OVERRIDE; virtual bool CanResize() const OVERRIDE; virtual bool CanMaximize() const OVERRIDE; virtual base::string16 GetWindowTitle() const OVERRIDE; virtual bool ShouldShowWindowTitle() const OVERRIDE; virtual bool ShouldShowWindowIcon() const OVERRIDE; virtual void SaveWindowPlacement(const gfx::Rect& bounds, ui::WindowShowState show_state) OVERRIDE; virtual void DeleteDelegate() OVERRIDE; virtual views::Widget* GetWidget() OVERRIDE; virtual const views::Widget* GetWidget() const OVERRIDE; virtual views::View* GetContentsView() OVERRIDE; virtual bool ShouldDescendIntoChildForEventHandling( gfx::NativeView child, const gfx::Point& location) OVERRIDE; // WidgetObserver implementation. virtual void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) OVERRIDE; virtual void OnWidgetActivationChanged(views::Widget* widget, bool active) OVERRIDE; // WebContentsObserver implementation. virtual void RenderViewCreated( content::RenderViewHost* render_view_host) OVERRIDE; virtual void RenderViewHostChanged( content::RenderViewHost* old_host, content::RenderViewHost* new_host) OVERRIDE; // views::View implementation. virtual void Layout() OVERRIDE; virtual void ViewHierarchyChanged( const ViewHierarchyChangedDetails& details) OVERRIDE; virtual gfx::Size GetMinimumSize() const OVERRIDE; virtual gfx::Size GetMaximumSize() const OVERRIDE; virtual void OnFocus() OVERRIDE; // NativeAppWindow implementation. virtual void SetFullscreen(int fullscreen_types) OVERRIDE; virtual bool IsFullscreenOrPending() const OVERRIDE; virtual void UpdateWindowIcon() OVERRIDE; virtual void UpdateWindowTitle() OVERRIDE; virtual void UpdateBadgeIcon() OVERRIDE; virtual void UpdateDraggableRegions( const std::vector& regions) OVERRIDE; virtual SkRegion* GetDraggableRegion() OVERRIDE; virtual void UpdateShape(scoped_ptr region) OVERRIDE; virtual void HandleKeyboardEvent( const content::NativeWebKeyboardEvent& event) OVERRIDE; virtual bool IsFrameless() const OVERRIDE; virtual bool HasFrameColor() const OVERRIDE; virtual SkColor ActiveFrameColor() const OVERRIDE; virtual SkColor InactiveFrameColor() const OVERRIDE; virtual gfx::Insets GetFrameInsets() const OVERRIDE; virtual void HideWithApp() OVERRIDE; virtual void ShowWithApp() OVERRIDE; virtual void UpdateShelfMenu() OVERRIDE; virtual gfx::Size GetContentMinimumSize() const OVERRIDE; virtual gfx::Size GetContentMaximumSize() const OVERRIDE; virtual void SetContentSizeConstraints(const gfx::Size& min_size, const gfx::Size& max_size) OVERRIDE; virtual bool CanHaveAlphaEnabled() const OVERRIDE; // web_modal::WebContentsModalDialogHost implementation. virtual gfx::NativeView GetHostView() const OVERRIDE; virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; virtual gfx::Size GetMaximumDialogSize() OVERRIDE; virtual void AddObserver( web_modal::ModalDialogHostObserver* observer) OVERRIDE; virtual void RemoveObserver( web_modal::ModalDialogHostObserver* observer) OVERRIDE; private: // Informs modal dialogs that they need to update their positions. void OnViewWasResized(); extensions::AppWindow* app_window_; // Not owned. views::WebView* web_view_; views::Widget* widget_; scoped_ptr draggable_region_; bool frameless_; bool resizable_; extensions::SizeConstraints size_constraints_; views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_; ObserverList observer_list_; DISALLOW_COPY_AND_ASSIGN(NativeAppWindowViews); }; } // namespace apps #endif // APPS_UI_VIEWS_NATIVE_APP_WINDOW_VIEWS_H_