1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_COCOA_H_
6#define CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_COCOA_H_
7#pragma once
8
9#include "base/memory/scoped_nsobject.h"
10#include "base/task.h"
11#include "chrome/browser/bookmarks/bookmark_model.h"
12#include "chrome/browser/ui/browser_window.h"
13#include "content/common/notification_registrar.h"
14
15class Browser;
16@class BrowserWindowController;
17@class FindBarCocoaController;
18@class NSEvent;
19@class NSMenu;
20@class NSWindow;
21
22// An implementation of BrowserWindow for Cocoa. Bridges between C++ and
23// the Cocoa NSWindow. Cross-platform code will interact with this object when
24// it needs to manipulate the window.
25
26class BrowserWindowCocoa : public BrowserWindow,
27                           public NotificationObserver {
28 public:
29  BrowserWindowCocoa(Browser* browser,
30                     BrowserWindowController* controller,
31                     NSWindow* window);
32  virtual ~BrowserWindowCocoa();
33
34  // Overridden from BrowserWindow
35  virtual void Show();
36  virtual void ShowInactive();
37  virtual void SetBounds(const gfx::Rect& bounds);
38  virtual void Close();
39  virtual void Activate();
40  virtual void Deactivate();
41  virtual bool IsActive() const;
42  virtual void FlashFrame();
43  virtual gfx::NativeWindow GetNativeHandle();
44  virtual BrowserWindowTesting* GetBrowserWindowTesting();
45  virtual StatusBubble* GetStatusBubble();
46  virtual void ToolbarSizeChanged(bool is_animating);
47  virtual void UpdateTitleBar();
48  virtual void ShelfVisibilityChanged();
49  virtual void UpdateDevTools();
50  virtual void UpdateLoadingAnimations(bool should_animate);
51  virtual void SetStarredState(bool is_starred);
52  virtual gfx::Rect GetRestoredBounds() const;
53  virtual gfx::Rect GetBounds() const;
54  virtual bool IsMaximized() const;
55  virtual void SetFullscreen(bool fullscreen);
56  virtual bool IsFullscreen() const;
57  virtual bool IsFullscreenBubbleVisible() const;
58  virtual LocationBar* GetLocationBar() const;
59  virtual void SetFocusToLocationBar(bool select_all);
60  virtual void UpdateReloadStopState(bool is_loading, bool force);
61  virtual void UpdateToolbar(TabContentsWrapper* contents,
62                             bool should_restore_state);
63  virtual void FocusToolbar();
64  virtual void FocusAppMenu();
65  virtual void FocusBookmarksToolbar();
66  virtual void FocusChromeOSStatus();
67  virtual void RotatePaneFocus(bool forwards);
68  virtual bool IsBookmarkBarVisible() const;
69  virtual bool IsBookmarkBarAnimating() const;
70  virtual bool IsTabStripEditable() const;
71  virtual bool IsToolbarVisible() const;
72  virtual void ConfirmAddSearchProvider(const TemplateURL* template_url,
73                                        Profile* profile);
74  virtual void ToggleBookmarkBar();
75  virtual void ShowAboutChromeDialog();
76  virtual void ShowUpdateChromeDialog();
77  virtual void ShowTaskManager();
78  virtual void ShowBackgroundPages();
79  virtual void ShowBookmarkBubble(const GURL& url, bool already_bookmarked);
80  virtual bool IsDownloadShelfVisible() const;
81  virtual DownloadShelf* GetDownloadShelf();
82  virtual void ShowRepostFormWarningDialog(TabContents* tab_contents);
83  virtual void ShowCollectedCookiesDialog(TabContents* tab_contents);
84  virtual void ShowThemeInstallBubble();
85  virtual void ConfirmBrowserCloseWithPendingDownloads();
86  virtual void ShowHTMLDialog(HtmlDialogUIDelegate* delegate,
87                              gfx::NativeWindow parent_window);
88  virtual void UserChangedTheme();
89  virtual int GetExtraRenderViewHeight() const;
90  virtual void TabContentsFocused(TabContents* tab_contents);
91  virtual void ShowPageInfo(Profile* profile,
92                            const GURL& url,
93                            const NavigationEntry::SSLStatus& ssl,
94                            bool show_history);
95  virtual void ShowAppMenu();
96  virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
97                                      bool* is_keyboard_shortcut);
98  virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event);
99  virtual void ShowCreateWebAppShortcutsDialog(
100      TabContentsWrapper* tab_contents);
101  virtual void ShowCreateChromeAppShortcutsDialog(Profile* profile,
102                                                  const Extension* app);
103  virtual void Cut();
104  virtual void Copy();
105  virtual void Paste();
106  virtual void ToggleTabStripMode();
107  virtual void OpenTabpose();
108  virtual void PrepareForInstant();
109  virtual void ShowInstant(TabContentsWrapper* preview);
110  virtual void HideInstant(bool instant_is_active);
111  virtual gfx::Rect GetInstantBounds();
112
113  // Overridden from NotificationObserver
114  virtual void Observe(NotificationType type,
115                       const NotificationSource& source,
116                       const NotificationDetails& details);
117
118  // Adds the given FindBar cocoa controller to this browser window.
119  void AddFindBar(FindBarCocoaController* find_bar_cocoa_controller);
120
121  // Returns the cocoa-world BrowserWindowController
122  BrowserWindowController* cocoa_controller() { return controller_; }
123
124 protected:
125  virtual void DestroyBrowser();
126
127 private:
128  int GetCommandId(const NativeWebKeyboardEvent& event);
129  bool HandleKeyboardEventInternal(NSEvent* event);
130  NSWindow* window() const;  // Accessor for the (current) |NSWindow|.
131  void UpdateSidebarForContents(TabContents* tab_contents);
132
133  NotificationRegistrar registrar_;
134  Browser* browser_;  // weak, owned by controller
135  BrowserWindowController* controller_;  // weak, owns us
136  ScopedRunnableMethodFactory<Browser> confirm_close_factory_;
137  scoped_nsobject<NSString> pending_window_title_;
138};
139
140#endif  // CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_COCOA_H_
141