// 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 VIEWS_WIDGET_WIDGET_H_ #define VIEWS_WIDGET_WIDGET_H_ #pragma once #include #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 { public: virtual ~Widget() { } enum TransparencyParam { Transparent, NotTransparent }; enum EventsParam { AcceptEvents, NotAcceptEvents }; enum DeleteParam { DeleteOnDestroy, NotDeleteOnDestroy }; enum MirroringParam { MirrorOriginInRTL, DontMirrorOriginInRTL }; // 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* 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 #endif // VIEWS_WIDGET_WIDGET_H_