blob: f29516753d09ea8070dafa12c7df8b2b662645cd [file] [log] [blame]
// 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 "base/gfx/rect.h"
#include "base/logging.h"
#include "base/sys_string_conversions.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/cocoa/browser_window_cocoa.h"
#import "chrome/browser/cocoa/browser_window_controller.h"
#import "chrome/browser/cocoa/clear_browsing_data_controller.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/download/download_shelf.h"
#include "chrome/common/notification_service.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/pref_service.h"
#include "chrome/common/temp_scaffolding_stubs.h"
#include "chrome/browser/profile.h"
BrowserWindowCocoa::BrowserWindowCocoa(Browser* browser,
BrowserWindowController* controller,
NSWindow* window)
: window_(window),
browser_(browser),
controller_(controller),
download_shelf_() {
// This pref applies to all windows, so all must watch for it.
registrar_.Add(this, NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED,
NotificationService::AllSources());
}
BrowserWindowCocoa::~BrowserWindowCocoa() {
}
void BrowserWindowCocoa::Show() {
[window_ makeKeyAndOrderFront:controller_];
}
void BrowserWindowCocoa::SetBounds(const gfx::Rect& bounds) {
NSRect cocoa_bounds = NSMakeRect(bounds.x(), 0, bounds.width(),
bounds.height());
// flip coordinates
NSScreen* screen = [window_ screen];
cocoa_bounds.origin.y =
[screen frame].size.height - bounds.height() - bounds.y();
[window_ setFrame:cocoa_bounds display:YES];
}
// Callers assume that this doesn't immediately delete the Browser object.
// The controller implementing the window delegate methods called from
// |-performClose:| must take precautiions to ensure that.
void BrowserWindowCocoa::Close() {
[window_ orderOut:controller_];
[window_ performClose:controller_];
}
void BrowserWindowCocoa::Activate() {
[window_ makeKeyAndOrderFront:controller_];
}
void BrowserWindowCocoa::FlashFrame() {
[[NSApplication sharedApplication]
requestUserAttention:NSInformationalRequest];
}
bool BrowserWindowCocoa::IsActive() const {
return [window_ isKeyWindow];
}
gfx::NativeWindow BrowserWindowCocoa::GetNativeHandle() {
return [controller_ window];
}
BrowserWindowTesting* BrowserWindowCocoa::GetBrowserWindowTesting() {
return NULL;
}
StatusBubble* BrowserWindowCocoa::GetStatusBubble() {
return [controller_ statusBubble];
}
void BrowserWindowCocoa::SelectedTabToolbarSizeChanged(bool is_animating) {
// According to beng, this is an ugly method that comes from the days when the
// download shelf was a ChromeView attached to the TabContents, and as its
// size changed via animation it notified through TCD/etc to the browser view
// to relayout for each tick of the animation. We don't need anything of the
// sort on Mac.
}
void BrowserWindowCocoa::UpdateTitleBar() {
NSString* newTitle =
base::SysWideToNSString(browser_->GetCurrentPageTitle());
// Window menu
[NSApp changeWindowsItem:window_ title:newTitle filename:NO];
// Dock
[window_ setMiniwindowTitle:newTitle];
}
void BrowserWindowCocoa::UpdateLoadingAnimations(bool should_animate) {
[controller_ updateLoadingAnimations:should_animate ? YES : NO];
}
void BrowserWindowCocoa::SetStarredState(bool is_starred) {
[controller_ setStarredState:is_starred ? YES : NO];
}
gfx::Rect BrowserWindowCocoa::GetNormalBounds() const {
// TODO(pinkerton): not sure if we can get the non-zoomed bounds, or if it
// really matters. We may want to let Cocoa handle all this for us.
NSRect frame = [window_ frame];
NSScreen* screen = [window_ screen];
gfx::Rect bounds(frame.origin.x, 0, frame.size.width, frame.size.height);
bounds.set_y([screen frame].size.height - frame.origin.y - frame.size.height);
return bounds;
}
bool BrowserWindowCocoa::IsMaximized() const {
return [window_ isZoomed];
}
void BrowserWindowCocoa::SetFullscreen(bool fullscreen) {
NOTIMPLEMENTED();
}
bool BrowserWindowCocoa::IsFullscreen() const {
NOTIMPLEMENTED();
return false;
}
gfx::Rect BrowserWindowCocoa::GetRootWindowResizerRect() const {
NSRect tabRect = [controller_ selectedTabGrowBoxRect];
return gfx::Rect(NSRectToCGRect(tabRect));
}
LocationBar* BrowserWindowCocoa::GetLocationBar() const {
return [controller_ locationBar];
}
void BrowserWindowCocoa::SetFocusToLocationBar() {
[controller_ focusLocationBar];
}
void BrowserWindowCocoa::UpdateStopGoState(bool is_loading, bool force) {
[controller_ setIsLoading:is_loading ? YES : NO];
}
void BrowserWindowCocoa::UpdateToolbar(TabContents* contents,
bool should_restore_state) {
[controller_ updateToolbarWithContents:contents
shouldRestoreState:should_restore_state ? YES : NO];
}
void BrowserWindowCocoa::FocusToolbar() {
NOTIMPLEMENTED();
}
bool BrowserWindowCocoa::IsBookmarkBarVisible() const {
return browser_->profile()->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
}
// This is called from Browser, which in turn is called directly from
// a menu option. All we do here is set a preference. The act of
// setting the preference sends notifications to all windows who then
// know what to do.
void BrowserWindowCocoa::ToggleBookmarkBar() {
bookmark_utils::ToggleWhenVisible(browser_->profile());
}
void BrowserWindowCocoa::AddFindBar(
FindBarCocoaController* find_bar_cocoa_controller) {
return [controller_ addFindBar:find_bar_cocoa_controller];
}
void BrowserWindowCocoa::ShowAboutChromeDialog() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowBookmarkManager() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowBookmarkBubble(const GURL& url,
bool already_bookmarked) {
NOTIMPLEMENTED();
}
bool BrowserWindowCocoa::IsDownloadShelfVisible() const {
return download_shelf_ != NULL && download_shelf_->IsShowing();
}
DownloadShelf* BrowserWindowCocoa::GetDownloadShelf() {
NOTIMPLEMENTED();
if (!download_shelf_.get()) {
download_shelf_.reset(new DownloadShelfMac(browser_));
}
return download_shelf_.get();
}
void BrowserWindowCocoa::ShowReportBugDialog() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowClearBrowsingDataDialog() {
scoped_nsobject<ClearBrowsingDataController> controller(
[[ClearBrowsingDataController alloc]
initWithProfile:browser_->profile()]);
[controller runModalDialog];
}
void BrowserWindowCocoa::ShowImportDialog() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowSearchEnginesDialog() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowPasswordManager() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowSelectProfileDialog() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowNewProfileDialog() {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ConfirmBrowserCloseWithPendingDownloads() {
NOTIMPLEMENTED();
browser_->InProgressDownloadResponse(false);
}
void BrowserWindowCocoa::ShowHTMLDialog(HtmlDialogUIDelegate* delegate,
gfx::NativeWindow parent_window) {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::UserChangedTheme() {
NOTIMPLEMENTED();
}
int BrowserWindowCocoa::GetExtraRenderViewHeight() const {
// Currently this is only used on linux.
return 0;
}
void BrowserWindowCocoa::TabContentsFocused(TabContents* tab_contents) {
NOTIMPLEMENTED();
}
void BrowserWindowCocoa::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
switch (type.value) {
// Only the key window gets a direct toggle from the menu.
// Other windows hear about it from the notification.
case NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED:
[controller_ toggleBookmarkBar];
break;
default:
NOTREACHED(); // we don't ask for anything else!
break;
}
}
void BrowserWindowCocoa::DestroyBrowser() {
[controller_ destroyBrowser];
// at this point the controller is dead (autoreleased), so
// make sure we don't try to reference it any more.
}