blob: 1ca96a5a0c3c8e2fd3b1622423cce00395193619 [file] [log] [blame]
// 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.
#pragma once
#include <vector>
#include "gfx/native_widget_types.h"
class ThemeProvider;
namespace gfx {
class Path;
class Point;
class Rect;
namespace menus {
class Accelerator;
namespace views {
class FocusManager;
class RootView;
class TooltipManager;
class View;
class WidgetDelegate;
class Window;
// Widget interface
// Widget is an abstract class that defines the API that should be implemented
// by a native window in order to host a view hierarchy.
// Widget wraps a hierarchy of View objects (see view.h) that implement
// painting and flexible layout within the bounds of the Widget's window.
// The Widget is responsible for handling various system events and forwarding
// them to the appropriate view.
class Widget {
virtual ~Widget() { }
enum TransparencyParam {
enum EventsParam {
enum DeleteParam {
enum MirroringParam {
// Creates a transient popup widget specific to the current platform.
// If |mirror_in_rtl| is set to MirrorOriginInRTL, the contents of the
// popup will be mirrored if the current locale is RTL. You should use
// DontMirrorOriginInRTL if you are aleady handling the RTL layout within
// the widget.
static Widget* CreatePopupWidget(TransparencyParam transparent,
EventsParam accept_events,
DeleteParam delete_on_destroy,
MirroringParam mirror_in_rtl);
// Returns the root view for |native_window|. If |native_window| does not have
// a rootview, this recurses through all of |native_window|'s children until
// one is found. If a root view isn't found, null is returned.
static RootView* FindRootView(gfx::NativeWindow native_window);
// Returns list of all root views for the native window and its
// children.
static void FindAllRootViews(gfx::NativeWindow native_window,
std::vector<RootView*>* root_views);
// Retrieve the Widget corresponding to the specified native_view, or NULL
// if there is no such Widget.
static Widget* GetWidgetFromNativeView(gfx::NativeView native_view);
static Widget* GetWidgetFromNativeWindow(gfx::NativeWindow native_window);
// Enumerates all windows pertaining to us and notifies their
// view hierarchies that the locale has changed.
static void NotifyLocaleChanged();
// Initialize the Widget with a parent and an initial desired size.
// |contents_view| is the view that will be the single child of RootView
// within this Widget. As contents_view is inserted into RootView's tree,
// RootView assumes ownership of this view and cleaning it up. If you remove
// this view, you are responsible for its destruction. If this value is NULL,
// the caller is responsible for populating the RootView, and sizing its
// contents as the window is sized.
virtual void Init(gfx::NativeView parent, const gfx::Rect& bounds) = 0;
// Initialize the widget with a views::Widget parent and an initial
// desired size. This internally invokes |Init(gfx::NativeView,
// const gfx::Rect&)| but it determines the correct native view
// for each platform and the type of widget. Passing NULL to
// |parent| is same as invoking |Init(NULL, bounds)|.
virtual void InitWithWidget(Widget* parent, const gfx::Rect& bounds) = 0;
// Returns the WidgetDelegate for delegating certain events.
virtual WidgetDelegate* GetWidgetDelegate() = 0;
// Sets the WidgetDelegate.
virtual void SetWidgetDelegate(WidgetDelegate* delegate) = 0;
// Sets the specified view as the contents of this Widget. There can only
// be one contents view child of this Widget's RootView. This view is sized to
// fit the entire size of the RootView. The RootView takes ownership of this
// View, unless it is set as not being parent-owned.
virtual void SetContentsView(View* view) = 0;
// Returns the bounds of this Widget in the screen coordinate system.
// If the receiving Widget is a frame which is larger than its client area,
// this method returns the client area if including_frame is false and the
// frame bounds otherwise. If the receiving Widget is not a frame,
// including_frame is ignored.
virtual void GetBounds(gfx::Rect* out, bool including_frame) const = 0;
// Sizes and/or places the widget to the specified bounds, size or position.
virtual void SetBounds(const gfx::Rect& bounds) = 0;
// Places the widget in front of the specified widget in z-order.
virtual void MoveAbove(Widget* widget) = 0;
// Sets a shape on the widget. This takes ownership of shape.
virtual void SetShape(gfx::NativeRegion shape) = 0;
// Hides the widget then closes it after a return to the message loop.
virtual void Close() = 0;
// Closes the widget immediately. Compare to |Close|. This will destroy the
// window handle associated with this Widget, so should not be called from
// any code that expects it to be valid beyond this call.
virtual void CloseNow() = 0;
// Shows or hides the widget, without changing activation state.
virtual void Show() = 0;
virtual void Hide() = 0;
// Returns the gfx::NativeView associated with this Widget.
virtual gfx::NativeView GetNativeView() const = 0;
// Forces a paint of a specified rectangle immediately.
virtual void PaintNow(const gfx::Rect& update_rect) = 0;
// Sets the opacity of the widget. This may allow widgets behind the widget
// in the Z-order to become visible, depending on the capabilities of the
// underlying windowing system. Note that the caller must then schedule a
// repaint to allow this change to take effect.
virtual void SetOpacity(unsigned char opacity) = 0;
// Sets the widget to be on top of all other widgets in the windowing system.
virtual void SetAlwaysOnTop(bool on_top) = 0;
// Returns the RootView contained by this Widget.
virtual RootView* GetRootView() = 0;
// Returns the Widget associated with the root ancestor.
virtual Widget* GetRootWidget() const = 0;
// Returns whether the Widget is visible to the user.
virtual bool IsVisible() const = 0;
// Returns whether the Widget is the currently active window.
virtual bool IsActive() const = 0;
// Starts a drag operation for the specified view. |point| is a position in
// |view| coordinates that the drag was initiated from.
virtual void GenerateMousePressedForView(View* view,
const gfx::Point& point) = 0;
// Returns the TooltipManager for this Widget. If this Widget does not support
// tooltips, NULL is returned.
virtual TooltipManager* GetTooltipManager() = 0;
// Returns the accelerator given a command id. Returns false if there is
// no accelerator associated with a given id, which is a common condition.
virtual bool GetAccelerator(int cmd_id,
menus::Accelerator* accelerator) = 0;
// Returns the Window containing this Widget, or NULL if not contained in a
// window.
virtual Window* GetWindow() = 0;
virtual const Window* GetWindow() const = 0;
// Sets/Gets a native window property on the underlying native window object.
// Returns NULL if the property does not exist. Setting the property value to
// NULL removes the property.
virtual void SetNativeWindowProperty(const std::wstring& name,
void* value) = 0;
virtual void* GetNativeWindowProperty(const std::wstring& name) = 0;
// Gets the theme provider.
virtual ThemeProvider* GetThemeProvider() const = 0;
// Gets the default theme provider; this is necessary for when a widget has
// no profile (and ThemeProvider) associated with it. The default theme
// provider provides a default set of bitmaps that such widgets can use.
virtual ThemeProvider* GetDefaultThemeProvider() const = 0;
// Returns the FocusManager for this widget.
// Note that all widgets in a widget hierarchy share the same focus manager.
virtual FocusManager* GetFocusManager() = 0;
// Forwarded from the RootView so that the widget can do any cleanup.
virtual void ViewHierarchyChanged(bool is_add, View *parent,
View *child) = 0;
// Returns true if the native view |native_view| is contained in the
// views::View hierarchy rooted at this widget.
virtual bool ContainsNativeView(gfx::NativeView native_view) = 0;
} // namespace views