diff options
author | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-14 17:10:41 +0000 |
---|---|---|
committer | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-14 17:10:41 +0000 |
commit | f14159cb6385f271bec21d4ddf04c353a869fb70 (patch) | |
tree | 2fc1ab6633333d1a7292f5e9acd21a8bd7d833b6 /chrome/browser/cocoa | |
parent | d680c5c189ec40b97cee8c201de88dfe5256153f (diff) | |
download | chromium_src-f14159cb6385f271bec21d4ddf04c353a869fb70.zip chromium_src-f14159cb6385f271bec21d4ddf04c353a869fb70.tar.gz chromium_src-f14159cb6385f271bec21d4ddf04c353a869fb70.tar.bz2 |
Implement OS X Encoding Menu.
Also refactor Windows Encoding menu a bit to make the moving parts x-platform.
Add a unit test for the menu encoding logic.
In a followup CL I'll add some UI tests around this.
Review URL: http://codereview.chromium.org/113315
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16061 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
3 files changed, 107 insertions, 0 deletions
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm index 283eb1e..92f3527 100644 --- a/chrome/browser/cocoa/browser_window_controller.mm +++ b/chrome/browser/cocoa/browser_window_controller.mm @@ -8,6 +8,7 @@ #include "chrome/browser/browser.h" #include "chrome/browser/browser_list.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/encoding_menu_controller.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/tab_contents_view.h" #include "chrome/browser/tabs/tab_strip_model.h" @@ -263,6 +264,27 @@ willPositionSheet:(NSWindow *)sheet if (oldState != newState) [item setState:newState]; } + + // Update the checked/Unchecked state of items in the encoding menu. + // On Windows this logic is part of encoding_menu_controller_delegate.cc + EncodingMenuController encoding_controller; + if (encoding_controller.DoesCommandBelongToEncodingMenu(tag)) { + DCHECK(browser_.get()); + Profile *profile = browser_->profile(); + DCHECK(profile); + TabContents* current_tab = browser_->GetSelectedTabContents(); + if (!current_tab) { + return; + } + const std::wstring encoding = current_tab->encoding(); + + bool toggled = encoding_controller.IsItemChecked(profile, encoding, tag); + NSInteger oldState = [item state]; + NSInteger newState = toggled ? NSOnState : NSOffState; + if (oldState != newState) + [item setState:newState]; + } + } // Called to validate menu and toolbar items when this window is key. All the diff --git a/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h new file mode 100644 index 0000000..a23b1aa --- /dev/null +++ b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.h @@ -0,0 +1,22 @@ +// 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. + +#ifndef CHROME_BROWSER_COCOA_ENCODING_MENU_CONTROLLER_DELEGATE_MAC_H_ +#define CHROME_BROWSER_COCOA_ENCODING_MENU_CONTROLLER_DELEGATE_MAC_H_ + +#include "base/basictypes.h" // For DISALLOW_IMPLICIT_CONSTRUCTORS + +class Profile; + +// The Windows version of this class manages the Encoding Menu, but since Cocoa +// does that for us automagically, the only thing left to do is construct +// the encoding menu. +class EncodingMenuControllerDelegate { + public: + static void BuildEncodingMenu(Profile *profile); + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(EncodingMenuControllerDelegate); +}; + +#endif // CHROME_BROWSER_COCOA_ENCODING_MENU_CONTROLLER_DELEGATE_MAC_H_ diff --git a/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm new file mode 100644 index 0000000..4f9468f --- /dev/null +++ b/chrome/browser/cocoa/encoding_menu_controller_delegate_mac.mm @@ -0,0 +1,63 @@ +// 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/encoding_menu_controller_delegate_mac.h" + +#import <Cocoa/Cocoa.h> + +#include "base/sys_string_conversions.h" +#include "chrome/app/chrome_dll_resource.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/encoding_menu_controller.h" +#include "chrome/browser/profile.h" + +namespace { + +void AddSeparatorToMenu(NSMenu *parent_menu) { + NSMenuItem* separator = [NSMenuItem separatorItem]; + [parent_menu addItem:separator]; +} + +void AppendMenuItem(NSMenu *parent_menu, int tag, NSString *title) { + + NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:title + action:nil + keyEquivalent:@""] autorelease]; + [parent_menu addItem:item]; + [item setAction:@selector(commandDispatch:)]; + [item setTag:tag]; +} + +} // namespace + +// static +void EncodingMenuControllerDelegate::BuildEncodingMenu(Profile *profile) { + DCHECK(profile); + + // Get hold of the Cocoa encoding menu. + NSMenu* view_menu = [[[NSApp mainMenu] itemWithTag:IDC_VIEW_MENU] submenu]; + NSMenuItem* encoding_menu_item = [view_menu itemWithTag:IDC_ENCODING_MENU]; + NSMenu *encoding_menu = [encoding_menu_item submenu]; + + typedef EncodingMenuController::EncodingMenuItemList EncodingMenuItemList; + EncodingMenuItemList menuItems; + EncodingMenuController controller; + controller.GetEncodingMenuItems(profile, &menuItems); + + for (EncodingMenuItemList::iterator it = menuItems.begin(); + it != menuItems.end(); + ++it) { + int item_id = it->first; + std::wstring &localized_title_wstring = it->second; + + if (item_id == 0) { + AddSeparatorToMenu(encoding_menu); + } else { + using base::SysWideToNSString; + NSString *localized_title = SysWideToNSString(localized_title_wstring); + AppendMenuItem(encoding_menu, item_id, localized_title); + } + } + +} |