blob: 917fecaef8f8e01dc6785e7a0707b90a20eb11df [file] [log] [blame]
// 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 "apps/size_constraints.h"
#include "apps/ui/native_app_window.h"
#include "base/observer_list.h"
#include "content/public/browser/web_contents_observer.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 NativeAppWindow,
public content::WebContentsObserver,
public views::WidgetDelegateView,
public views::WidgetObserver {
public:
NativeAppWindowViews();
virtual ~NativeAppWindowViews();
void Init(AppWindow* app_window,
const 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:
AppWindow* app_window() { return app_window_; }
const 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(AppWindow* app_window,
const 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 bool IsDetached() const OVERRIDE;
virtual void UpdateWindowIcon() OVERRIDE;
virtual void UpdateWindowTitle() OVERRIDE;
virtual void UpdateBadgeIcon() OVERRIDE;
virtual void UpdateDraggableRegions(
const std::vector<extensions::DraggableRegion>& regions) OVERRIDE;
virtual SkRegion* GetDraggableRegion() OVERRIDE;
virtual void UpdateShape(scoped_ptr<SkRegion> 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();
AppWindow* app_window_; // Not owned.
views::WebView* web_view_;
views::Widget* widget_;
scoped_ptr<SkRegion> draggable_region_;
bool frameless_;
bool resizable_;
apps::SizeConstraints size_constraints_;
views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
ObserverList<web_modal::ModalDialogHostObserver> observer_list_;
DISALLOW_COPY_AND_ASSIGN(NativeAppWindowViews);
};
} // namespace apps
#endif // APPS_UI_VIEWS_NATIVE_APP_WINDOW_VIEWS_H_