1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
// Copyright (c) 2009 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.
#include "chrome/browser/cocoa/constrained_window_mac.h"
#import "chrome/browser/cocoa/browser_window_controller.h"
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/browser/tab_contents/tab_contents_view.h"
#import "third_party/GTM/AppKit/GTMWindowSheetController.h"
ConstrainedWindowMacDelegate::~ConstrainedWindowMacDelegate() {}
NSArray* ConstrainedWindowMacDelegateSystemSheet::GetSheetParameters(
id delegate,
SEL didEndSelector) {
return [NSArray arrayWithObjects:
[NSNull null], // window, must be [NSNull null]
delegate,
[NSValue valueWithPointer:didEndSelector],
[NSValue valueWithPointer:NULL], // context info for didEndSelector_.
nil];
}
void ConstrainedWindowMacDelegateSystemSheet::RunSheet(
GTMWindowSheetController* sheetController,
NSView* view) {
NSArray* params = GetSheetParameters(delegate_.get(), didEndSelector_);
[sheetController beginSystemSheet:systemSheet_
modalForView:view
withParameters:params];
}
void ConstrainedWindowMacDelegateCustomSheet::RunSheet(
GTMWindowSheetController* sheetController,
NSView* view) {
[sheetController beginSheet:customSheet_.get()
modalForView:view
modalDelegate:delegate_.get()
didEndSelector:didEndSelector_
contextInfo:NULL];
}
// static
ConstrainedWindow* ConstrainedWindow::CreateConstrainedDialog(
TabContents* parent,
ConstrainedWindowMacDelegate* delegate) {
return new ConstrainedWindowMac(parent, delegate);
}
ConstrainedWindowMac::ConstrainedWindowMac(
TabContents* owner, ConstrainedWindowMacDelegate* delegate)
: owner_(owner),
delegate_(delegate),
controller_(nil),
should_be_visible_(false) {
DCHECK(owner);
DCHECK(delegate);
}
ConstrainedWindowMac::~ConstrainedWindowMac() {}
void ConstrainedWindowMac::ShowConstrainedWindow() {
should_be_visible_ = true;
// The TabContents only has a native window if it is currently visible. In
// this case, open the sheet now. Else, Realize() will be called later, when
// our tab becomes visible.
NSWindow* browserWindow = owner_->view()->GetTopLevelNativeWindow();
NSWindowController* controller = [browserWindow windowController];
if (controller != nil) {
DCHECK([controller isKindOfClass:[BrowserWindowController class]]);
Realize(static_cast<BrowserWindowController*>(controller));
}
}
void ConstrainedWindowMac::CloseConstrainedWindow() {
// Note: controller_ can be `nil` here if the sheet was never realized. That's
// ok.
[controller_ removeConstrainedWindow:this];
delegate_->DeleteDelegate();
owner_->WillClose(this);
delete this;
}
void ConstrainedWindowMac::Realize(BrowserWindowController* controller) {
if (!should_be_visible_)
return;
if (controller_ != nil) {
DCHECK(controller_ == controller);
return;
}
DCHECK(controller != nil);
// Remember the controller we're adding ourselves to, so that we can later
// remove us from it.
controller_ = controller;
[controller_ attachConstrainedWindow:this];
delegate_->set_sheet_open(true);
}
|