• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_CONSTRAINED_WINDOW_MAC_H_
6 #define CHROME_BROWSER_UI_COCOA_CONSTRAINED_WINDOW_MAC_H_
7 #pragma once
8 
9 #import <Cocoa/Cocoa.h>
10 
11 #include "content/browser/tab_contents/constrained_window.h"
12 
13 #include "base/basictypes.h"
14 #include "base/logging.h"
15 #include "base/memory/scoped_nsobject.h"
16 
17 @class BrowserWindowController;
18 @class GTMWindowSheetController;
19 @class NSView;
20 @class NSWindow;
21 class TabContents;
22 
23 // Base class for constrained dialog delegates. Never inherit from this
24 // directly.
25 class ConstrainedWindowMacDelegate {
26  public:
ConstrainedWindowMacDelegate()27   ConstrainedWindowMacDelegate() : is_sheet_open_(false) {}
~ConstrainedWindowMacDelegate()28   virtual ~ConstrainedWindowMacDelegate() {}
29 
30   // Tells the delegate to either delete itself or set up a task to delete
31   // itself later. Note that you MUST close the sheet belonging to your delegate
32   // in this method.
33   virtual void DeleteDelegate() = 0;
34 
35   // Called by the tab controller, you do not need to do anything yourself
36   // with this method.
37   virtual void RunSheet(GTMWindowSheetController* sheetController,
38                         NSView* view) = 0;
39  protected:
40   // Returns true if this delegate's sheet is currently showing.
is_sheet_open()41   bool is_sheet_open() { return is_sheet_open_; }
42 
43  private:
44   bool is_sheet_open_;
set_sheet_open(bool is_open)45   void set_sheet_open(bool is_open) { is_sheet_open_ = is_open; }
46   friend class ConstrainedWindowMac;
47 };
48 
49 // Subclass this for a dialog delegate that displays a system sheet such as
50 // an NSAlert, an open or save file panel, etc.
51 class ConstrainedWindowMacDelegateSystemSheet
52     : public ConstrainedWindowMacDelegate {
53  public:
54   ConstrainedWindowMacDelegateSystemSheet(id delegate, SEL didEndSelector);
55   virtual ~ConstrainedWindowMacDelegateSystemSheet();
56 
57  protected:
58   void set_sheet(id sheet);
sheet()59   id sheet() { return systemSheet_; }
60 
61   // Returns an NSArray to be passed as parameters to GTMWindowSheetController.
62   // Array's contents should be the arguments passed to the system sheet's
63   // beginSheetForWindow:... method. The window argument must be [NSNull null].
64   //
65   // The default implementation returns
66   //     [null window, delegate, didEndSelector, null contextInfo]
67   // Subclasses may override this if they show a system sheet which takes
68   // different parameters.
69   virtual NSArray* GetSheetParameters(id delegate, SEL didEndSelector);
70 
71  private:
72   virtual void RunSheet(GTMWindowSheetController* sheetController,
73                         NSView* view);
74   scoped_nsobject<id> systemSheet_;
75   scoped_nsobject<id> delegate_;
76   SEL didEndSelector_;
77 };
78 
79 // Subclass this for a dialog delegate that displays a custom sheet, e.g. loaded
80 // from a nib file.
81 class ConstrainedWindowMacDelegateCustomSheet
82     : public ConstrainedWindowMacDelegate {
83  public:
84   ConstrainedWindowMacDelegateCustomSheet();
85   ConstrainedWindowMacDelegateCustomSheet(id delegate, SEL didEndSelector);
86   ~ConstrainedWindowMacDelegateCustomSheet();
87 
88  protected:
89   // For when you need to delay initalization after the constructor call.
90   void init(NSWindow* sheet, id delegate, SEL didEndSelector);
91   void set_sheet(NSWindow* sheet);
sheet()92   NSWindow* sheet() { return customSheet_; }
93 
94  private:
95   virtual void RunSheet(GTMWindowSheetController* sheetController,
96                         NSView* view);
97   scoped_nsobject<NSWindow> customSheet_;
98   scoped_nsobject<id> delegate_;
99   SEL didEndSelector_;
100 };
101 
102 // Constrained window implementation for the Mac port. A constrained window
103 // is a per-tab sheet on OS X.
104 //
105 // Constrained windows work slightly differently on OS X than on the other
106 // platforms:
107 // 1. A constrained window is bound to both a tab and window on OS X.
108 // 2. The delegate is responsible for closing the sheet again when it is
109 //    deleted.
110 class ConstrainedWindowMac : public ConstrainedWindow {
111  public:
112   virtual ~ConstrainedWindowMac();
113 
114   // Overridden from ConstrainedWindow:
115   virtual void ShowConstrainedWindow();
116   virtual void CloseConstrainedWindow();
117 
118   // Returns the TabContents that constrains this Constrained Window.
owner()119   TabContents* owner() const { return owner_; }
120 
121   // Returns the window's delegate.
delegate()122   ConstrainedWindowMacDelegate* delegate() { return delegate_; }
123 
124   // Makes the constrained window visible, if it is not yet visible.
125   void Realize(BrowserWindowController* controller);
126 
127  private:
128   friend class ConstrainedWindow;
129 
130   ConstrainedWindowMac(TabContents* owner,
131                        ConstrainedWindowMacDelegate* delegate);
132 
133   // The TabContents that owns and constrains this ConstrainedWindow.
134   TabContents* owner_;
135 
136   // Delegate that provides the contents of this constrained window.
137   ConstrainedWindowMacDelegate* delegate_;
138 
139   // Controller of the window that contains this sheet.
140   BrowserWindowController* controller_;
141 
142   // Stores if |ShowConstrainedWindow()| was called.
143   bool should_be_visible_;
144 
145   DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowMac);
146 };
147 
148 #endif  // CHROME_BROWSER_UI_COCOA_CONSTRAINED_WINDOW_MAC_H_
149 
150