diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 23:55:29 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 23:55:29 +0000 |
commit | 09911bf300f1a419907a9412154760efd0b7abc3 (patch) | |
tree | f131325fb4e2ad12c6d3504ab75b16dd92facfed /chrome/browser/xp_frame.h | |
parent | 586acc5fe142f498261f52c66862fa417c3d52d2 (diff) | |
download | chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.zip chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.gz chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.bz2 |
Add chrome to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/xp_frame.h')
-rw-r--r-- | chrome/browser/xp_frame.h | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/chrome/browser/xp_frame.h b/chrome/browser/xp_frame.h new file mode 100644 index 0000000..06ac2e3 --- /dev/null +++ b/chrome/browser/xp_frame.h @@ -0,0 +1,526 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CHROME_BROWSER_XP_FRAME_H__ +#define CHROME_BROWSER_XP_FRAME_H__ + +#include <windows.h> +#include <atlbase.h> +#include <atlcrack.h> +#include <atlapp.h> +#include <atlframe.h> + +#include "base/message_loop.h" +#include "chrome/app/chrome_dll_resource.h" +#include "chrome/browser/chrome_frame.h" +#include "chrome/browser/frame_view.h" +#include "chrome/browser/views/status_bubble.h" +#include "chrome/views/view_container.h" +#include "chrome/views/button.h" +#include "chrome/views/hwnd_view.h" +#include "chrome/views/root_view.h" +#include "chrome/views/image_view.h" + +#define XP_FRAME_CLASSNAME L"Chrome_XPFrame" + +class ChromeViews::RootView; +class Browser; +class TabContentsContainerView; +class TabStrip; +class TemporaryPlaceholder; + +//////////////////////////////////////////////////////////////////////////////// +// +// XPFrame class +// +// A CWindowImpl subclass that implements our main frame on Windows XP +// +// The window paints and handles its title bar and controls. It also supports +// a ChromeView hierarchy for the tabs and toolbar +// +//////////////////////////////////////////////////////////////////////////////// +class XPFrame : public ChromeFrame, + public CWindowImpl<XPFrame, + CWindow, + CWinTraits<WS_SYSMENU | + WS_MINIMIZEBOX | + WS_MAXIMIZEBOX | + WS_CLIPCHILDREN>>, + public ChromeViews::BaseButton::ButtonListener, + public ChromeViews::ViewContainer, + public ChromeViews::AcceleratorTarget { + public: + + // Create a new XPFrame given the bounds and provided browser. + // |bounds| may be empty to let Windows decide where to place the window. + // The browser_window object acts both as a container for the actual + // browser contents as well as a source for the tab strip and the toolbar. + // |is_off_the_record| defines whether this window should represent an off the + // record session. + // + // Note: this method creates an HWND for the frame but doesn't initialize + // the view hierarchy. The browser creates its HWND from the frame HWND + // and then calls Init() on the frame to finalize the initialization + static XPFrame* CreateFrame(const gfx::Rect& bounds, Browser* browser, + bool is_off_the_record); + + //////////////////////////////////////////////////////////////////////////////// + // ChromeFrame implementation + //////////////////////////////////////////////////////////////////////////////// + virtual ~XPFrame(); + virtual void Init(); + virtual void Show(int command, bool adjust_to_fit); + virtual void BrowserDidPaint(HRGN rgn); + virtual void Close(); + virtual void* GetPlatformID(); + virtual void SetAcceleratorTable( + std::map<ChromeViews::Accelerator, int>* accelerator_table); + virtual bool AcceleratorPressed(const ChromeViews::Accelerator& accelerator); + virtual gfx::Rect GetNormalBounds(); + virtual bool IsMaximized(); + virtual gfx::Rect GetBoundsForContentBounds(const gfx::Rect content_rect); + virtual void SetBounds(const gfx::Rect& bounds); + virtual void DetachFromBrowser(); + virtual void InfoBubbleShowing(); + virtual void InfoBubbleClosing(); + + // + // CWindowImpl event management magic. See atlcrack.h + // + DECLARE_FRAME_WND_CLASS_EX(XP_FRAME_CLASSNAME, + IDR_MAINFRAME, + CS_DBLCLKS, + WHITE_BRUSH) + + BEGIN_MSG_MAP(HaloFrame) + MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseRange) + MESSAGE_RANGE_HANDLER(WM_NCMOUSEMOVE, WM_NCMOUSEMOVE, OnMouseRange) + MESSAGE_RANGE_HANDLER(WM_SETTINGCHANGE, WM_SETTINGCHANGE, OnSettingChange) + MSG_WM_NCCALCSIZE(OnNCCalcSize); + MSG_WM_NCPAINT(OnNCPaint); + + MSG_WM_NCACTIVATE(OnNCActivate) + MSG_WM_LBUTTONDOWN(OnMouseButtonDown) + MSG_WM_LBUTTONUP(OnLButtonUp); + MSG_WM_LBUTTONDBLCLK(OnMouseButtonDblClk) + MSG_WM_MBUTTONDOWN(OnMouseButtonDown) + MSG_WM_MBUTTONUP(OnMButtonUp); + MSG_WM_MBUTTONDBLCLK(OnMouseButtonDblClk); + MSG_WM_RBUTTONDOWN(OnMouseButtonDown) + MSG_WM_NCLBUTTONDOWN(OnNCLButtonDown) + MSG_WM_NCMBUTTONDOWN(OnNCMButtonDown) + MSG_WM_NCRBUTTONDOWN(OnNCRButtonDown) + MSG_WM_RBUTTONUP(OnRButtonUp); + MSG_WM_RBUTTONDBLCLK(OnMouseButtonDblClk); + MESSAGE_HANDLER_EX(WM_GETOBJECT, OnGetObject); // To avoid edit atlcrack.h. + MSG_WM_KEYDOWN(OnKeyDown); + MSG_WM_KEYUP(OnKeyUp); + MSG_WM_MOUSEMOVE(OnMouseMove) + MSG_WM_MOUSELEAVE(OnMouseLeave) + MSG_WM_CLOSE(Close) // Note: Calls Close() directly, there is no OnClose() + MSG_WM_ENDSESSION(OnEndSession) + MSG_WM_APPCOMMAND(OnAppCommand) + MSG_WM_COMMAND(OnCommand) + MSG_WM_SYSCOMMAND(OnSysCommand) + MSG_WM_ACTIVATE(OnActivate) + MSG_WM_PAINT(OnPaint) + MSG_WM_ERASEBKGND(OnEraseBkgnd) + MSG_WM_GETMINMAXINFO(OnMinMaxInfo) + MSG_WM_CAPTURECHANGED(OnCaptureChanged) + MSG_WM_SIZE(OnSize) + MSG_WM_MOVE(OnMove) + MSG_WM_MOVING(OnMoving) + MSG_WM_NCHITTEST(OnNCHitTest) + MSG_WM_INITMENU(OnInitMenu) + MSG_WM_NOTIFY(OnNotify) + MSG_WM_MOUSEACTIVATE(OnMouseActivate) + MSG_WM_POWERBROADCAST(OnPowerBroadcast) + MSG_WM_THEMECHANGED(OnThemeChanged) + REFLECT_NOTIFICATIONS() + END_MSG_MAP() + + void OnFinalMessage(HWND hwnd); + + // ChromeViews::BaseButton::ButtonListener + void ButtonPressed(ChromeViews::BaseButton *sender); + + // + // ViewContainer + virtual void GetBounds(CRect *out, bool including_frame) const; + virtual void MoveToFront(bool should_activate); + virtual HWND GetHWND() const; + virtual void PaintNow(const CRect& update_rect); + virtual ChromeViews::RootView* GetRootView(); + virtual bool IsVisible(); + virtual bool IsActive(); + virtual ChromeViews::TooltipManager* GetTooltipManager(); + virtual StatusBubble* GetStatusBubble(); + virtual bool GetAccelerator(int cmd_id, + ChromeViews::Accelerator* accelerator); + + virtual void ShelfVisibilityChanged(); + virtual void SelectedTabToolbarSizeChanged(bool is_animating); + virtual void SetWindowTitle(const std::wstring& title); + virtual void Activate(); + virtual void FlashFrame(); + + virtual void ShowTabContents(TabContents* contents); + virtual TabStrip* GetTabStrip() const; + virtual void ContinueDetachConstrainedWindowDrag(const gfx::Point& mouse_pt, + int frame_component); + void SizeToContents(const gfx::Rect& contents_bounds); + + // Returns true if the frame should be rendered in an active state. + bool PaintAsActive() const { return is_active_ || paint_as_active_; } + + protected: + // Invoked after the HWND has been created but before the window is showing. + // This registers tooltips. If you override, be sure and invoke this + // implementation. + virtual void InitAfterHWNDCreated(); + + XPFrame(Browser* browser); + + // Offer subclasses an opportunity to change how the tabstrip is created. + // The default implementation allocates a normal tab strip. + virtual TabStrip* CreateTabStrip(Browser* browser); + + // Override and return false if no tab strip or toolbar should be visible. + // Default method returns true. + virtual bool IsTabStripVisible() const { return true; } + + // Override and return false if no toolbar should be visible. Default method + // returns true. + virtual bool IsToolBarVisible() const { return true; } + + // Return the frame view. + ChromeViews::View* GetFrameView() { return frame_view_; } + + // Return the tab contents container. + TabContentsContainerView* GetTabContentsContainer() { + return tab_contents_container_; + } + + // Return the X origin of the the first frame control button. + int GetButtonXOrigin() { + return min_button_->GetX(); + } + + // Return the Y location of the contents or infobar. + int GetContentsYOrigin(); + + // Give subclasses an opportunity to never show the bookmark bar. We use this + // for the application window. Default method returns true. + virtual bool SupportsBookmarkBar() const { return true; } + + virtual LRESULT OnNCHitTest(const CPoint& pt); + + // Layout all views given the available size + virtual void Layout(); + + // Set whether this frame represents an off the record session. This is + // currently only called during initialization. + void SetIsOffTheRecord(bool value); + + virtual void DestroyBrowser(); + + // The Browser instance that created this instance + Browser* browser_; + private: + enum FrameAction {FA_NONE = 0, FA_RESIZING, FA_FORWARDING}; + + enum ResizeMode {RM_UNDEFINED = 0, RM_NORTH, RM_NORTH_EAST, RM_EAST, + RM_SOUTH_EAST, RM_SOUTH, RM_SOUTH_WEST, RM_WEST, + RM_NORTH_WEST}; + + enum ResizeCursor {RC_VERTICAL = 0, RC_HORIZONTAL, RC_NESW, RC_NWSE}; + + LRESULT OnMouseRange(UINT u_msg, WPARAM w_param, LPARAM l_param, + BOOL& handled); + LRESULT OnNotify(int w_param, NMHDR* hdr); + LRESULT OnSettingChange(UINT u_msg, WPARAM w_param, LPARAM l_param, + BOOL& handled); + + // The view we use for our background + class XPFrameView : public FrameView { + public: + XPFrameView(XPFrame* parent) : FrameView(parent), parent_(parent) { + } + virtual void Paint(ChromeCanvas* canvas); + virtual std::string GetClassName() const { + return "chrome/browser/views/XPFrameView"; + } + // Accessibility information + bool GetAccessibleRole(VARIANT* role); + + // Returns a brief, identifying string, containing a unique, readable name. + bool GetAccessibleName(std::wstring* name); + + // Assigns an accessible string name. + void SetAccessibleName(const std::wstring& name); + + protected: + // Overriden to return false if maximized and over the min/max/close + // button. + virtual bool ShouldForwardToTabStrip( + const ChromeViews::DropTargetEvent& event); + + private: + void PaintFrameBorder(ChromeCanvas* canvas); + void PaintFrameBorderZoomed(ChromeCanvas* canvas); + void PaintContentsBorder(ChromeCanvas* canvas, + int x, + int y, + int w, + int h); + void PaintContentsBorderZoomed(ChromeCanvas* canvas, + int x, + int y, + int w); + XPFrame* parent_; + + // Storage of strings needed for accessibility. + std::wstring accessible_name_; + + DISALLOW_EVIL_CONSTRUCTORS(XPFrameView); + }; + + friend class XPFrameView; + + // + // Windows event handlers + // + + void OnEndSession(BOOL ending, UINT logoff); + + LRESULT OnNCCalcSize(BOOL w_param, LPARAM l_param); + LRESULT OnNCPaint(HRGN param); + + void OnMove(const CSize& size); + void OnMoving(UINT param, const LPRECT new_bounds); + void OnSize(UINT param, const CSize& size); + void OnMouseButtonDown(UINT flags, const CPoint& pt); + void OnNCLButtonDown(UINT flags, const CPoint& pt); + void OnNCMButtonDown(UINT flags, const CPoint& pt); + void OnNCRButtonDown(UINT flags, const CPoint& pt); + void OnMouseButtonUp(UINT flags, const CPoint& pt); + void OnMouseButtonDblClk(UINT flags, const CPoint& pt); + void OnLButtonUp(UINT flags, const CPoint& pt); + void OnMButtonUp(UINT flags, const CPoint& pt); + void OnRButtonUp(UINT flags, const CPoint& pt); + void OnMouseMove(UINT flags, const CPoint& pt); + void OnMouseLeave(); + void OnKeyDown(TCHAR c, UINT rep_cnt, UINT flags); + void OnKeyUp(TCHAR c, UINT rep_cnt, UINT flags); + LRESULT OnGetObject(UINT uMsg, WPARAM w_param, LPARAM l_param); + + LRESULT OnAppCommand( + HWND w_param, short app_command, WORD device, int keystate); + void OnCommand(UINT notification_code, int command_id, HWND window); + void OnSysCommand(UINT notification_code, CPoint click); + void OnActivate(UINT n_state, BOOL is_minimized, HWND other); + int OnMouseActivate(CWindow wndTopLevel, UINT nHitTest, UINT message); + void OnPaint(HDC dc); + LRESULT OnEraseBkgnd(HDC dc); + void OnMinMaxInfo(LPMINMAXINFO mm_info); + void OnCaptureChanged(HWND hwnd); + void OnInitMenu(HMENU menu); + void ArmOnMouseLeave(); + void ShowSystemMenu(int x, int y); + + LRESULT OnNCActivate(BOOL param); + BOOL OnPowerBroadcast(DWORD power_event, DWORD data); + void OnThemeChanged(); + + // Window resize + // Note: we cannot use the standard window resize because we don't have + // a frame. Returning HTSIZE from WM_NCHITTEST doesn't work + void StartWindowResize(ResizeMode mode, const CPoint &pt); + void ProcessWindowResize(const CPoint &pt); + void StopWindowResize(); + + // Compute a ResizeMode given a point (x,y) and the current size + // of the window (width,height). This method returns UNDEFINED + // if no resizing should occur. + ResizeMode ComputeResizeMode(int x, int y, int width, int height); + + // + // Change the cursor as needed given the desired ResizeMode + void SetResizeCursor(ResizeMode r_mode); + + // Check whether the selected tab needs some extra painting during + // move or resize because it obstructs its contents (WebContents) + bool ShouldRefreshCurrentTabContents(); + + // + // View events propagation + // + bool ProcessMousePressed(const CPoint& pt, UINT flags, bool dbl_click); + void ProcessMouseDragged(const CPoint& pt, UINT flags); + void ProcessMouseReleased(const CPoint& pt, UINT flags); + void ProcessMouseMoved(const CPoint &pt, UINT flags); + void ProcessMouseExited(); + + // Updates either the infobar or the bottom shelf depending on the views + // passed in. + void UpdateShelfViews(int view_top, int preferred_height, + ChromeViews::View* new_view, + ChromeViews::View** current_view, + int* last_height); + + // If the workaround to prevent taskbar from hiding behind maximizing + // xp_frame is enabled. + bool ShouldWorkAroundAutoHideTaskbar(); + + // Updates a single view. If *view differs from new_view the old view is + // removed and the new view is added. + // + // This is intended to be used when swapping in/out child views that are + // referenced via a field. + // + // This function returns true if anything was changed. The caller should + // ensure that Layout() is eventually called in this case. + bool UpdateChildViewAndLayout(ChromeViews::View* new_view, + ChromeViews::View** view); + + // Return the set of bitmaps that should be used to draw this frame. + SkBitmap** GetFrameBitmaps(); + + // Implementation for ShelfVisibilityChanged(). Updates the various shelf + // fields. If one of the shelves has changed (or it's size has changed) and + // current_tab is non-NULL layout occurs. + void ShelfVisibilityChangedImpl(TabContents* current_tab); + + // Root view + ChromeViews::RootView root_view_; + + // Top level view used to render the frame itself including the title bar + XPFrameView* frame_view_; + + // Toolbar provided by our browser + ChromeViews::View* toolbar_; + + // Browser contents + TabContentsContainerView* tab_contents_container_; + + // Frame buttons + ChromeViews::Button* min_button_; + ChromeViews::Button* max_button_; + ChromeViews::Button* restore_button_; + ChromeViews::Button* close_button_; + + // Whether we should save the bounds of the window. We don't want to + // save the default size of windows for certain classes of windows + // like unconstrained popups. Defaults to true. + bool should_save_window_placement_; + + // Whether we saved the window placement yet. + bool saved_window_placement_; + + // Current frame ui action + FrameAction current_action_; + + // Whether the frame is currently active + bool is_active_; + + // whether we are expecting a mouse leave event + bool on_mouse_leave_armed_; + + // Point containing the coordinate of the first event during + // a window dragging or resizing session + CPoint drag_origin_; + + // Rectangle containing the original window bounds during + // a window dragging or resizing session. It is in screen + // coordinate system + CRect previous_bounds_; + + // Initialize static members the first time this is invoked + static void InitializeIfNeeded(); + + // true if some painting is already pending + bool browser_paint_pending_; + + // cursor storage + HCURSOR previous_cursor_; + + // Current resize mode + ResizeMode current_resize_mode_; + + // Frame min size + CSize minimum_size_; + + scoped_ptr<ChromeViews::TooltipManager> tooltip_manager_; + + // A view positioned at the bottom of the frame. + ChromeViews::View* shelf_view_; + + // View positioned beneath the tab strip. + ChromeViews::View* bookmark_bar_view_; + + // A view positioned beneath the bookmark bar. + // Implementation mirrors shelf_view_ + ChromeViews::View* info_bar_view_; + + // The view that contains the tabs and any associated controls. + TabStrip* tabstrip_; + + // The optional container for the off the record icon. + ChromeViews::ImageView* off_the_record_image_; + + // We need to own the text of the menu, the Windows API does not copy it. + std::wstring task_manager_label_text_; + + // A mapping between accelerators and commands. + scoped_ptr<std::map<ChromeViews::Accelerator, int>> accelerator_table_; + + // Whether this frame represents an off the record session. + bool is_off_the_record_; + + // Set during layout. Total height of the title bar. + int title_bar_height_; + + static bool g_initialized; + static HCURSOR g_resize_cursors[4]; + static SkBitmap** g_bitmaps; + static SkBitmap** g_otr_bitmaps; + + scoped_ptr<StatusBubble> status_bubble_; + + // Instance of accessibility information and handling for MSAA root + CComPtr<IAccessible> accessibility_root_; + + // See note in VistaFrame for a description of this. + bool ignore_ncactivate_; + bool paint_as_active_; + + DISALLOW_EVIL_CONSTRUCTORS(XPFrame); +}; + +#endif // CHROME_BROWSER_XP_FRAME_H__ |