1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef UI_BASE_COCOA_MENU_CONTROLLER_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define UI_BASE_COCOA_MENU_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <Cocoa/Cocoa.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/mac/scoped_nsobject.h"
115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MenuModel;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A controller for the cross-platform menu model. The menu that's created
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has the tag and represented object set for each menu item. The object is a
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NSValue holding a pointer to the model for that level of the menu (to
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allow for hierarchical menus). The tag is the index into that model for
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that particular item. It is important that the model outlives this object
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as it only maintains weak references.
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface MenuController : NSObject<NSMenuDelegate> {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @protected
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::MenuModel* model_;  // weak
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::scoped_nsobject<NSMenu> menu_;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL useWithPopUpButtonCell_;  // If YES, 0th item is blank
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BOOL isMenuOpen_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(nonatomic, assign) ui::MenuModel* model;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that changing this will have no effect if you use
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |-initWithModel:useWithPopUpButtonCell:| or after the first call to |-menu|.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@property(nonatomic) BOOL useWithPopUpButtonCell;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)+ (base::string16)elideMenuTitle:(const base::string16&)title
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         toWidth:(int)width;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NIB-based initializer. This does not create a menu. Clients can set the
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properties of the object and the menu will be created upon the first call to
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |-menu|. Note that the menu will be immutable after creation.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)init;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Builds a NSMenu from the pre-built model (must not be nil). Changes made
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the contents of the model after calling this will not be noticed. If
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the menu will be displayed by a NSPopUpButtonCell, it needs to be of a
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// slightly different form (0th item is empty). Note this attribute of the menu
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cannot be changed after it has been created.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithModel:(ui::MenuModel*)model
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    useWithPopUpButtonCell:(BOOL)useWithCell;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Programmatically close the constructed menu.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)cancel;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Access to the constructed menu if the complex initializer was used. If the
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default initializer was used, then this will create the menu on first call.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSMenu*)menu;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Whether the menu is currently open.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (BOOL)isMenuOpen;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NSMenuDelegate methods this class implements. Subclasses should call super
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if extending the behavior.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)menuWillOpen:(NSMenu*)menu;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)menuDidClose:(NSMenu*)menu;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exposed only for unit testing, do not call directly.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface MenuController (PrivateExposedForTesting)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protected methods that subclassers can override.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface MenuController (Protected)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)addItemToMenu:(NSMenu*)menu
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              atIndex:(NSInteger)index
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fromModel:(ui::MenuModel*)model;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (NSMenu*)menuFromModel:(ui::MenuModel*)model;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the maximum width for the menu item. Returns -1 to indicate
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// that there's no maximum width.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (int)maxWidthForMenuModel:(ui::MenuModel*)model
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 modelIndex:(int)modelIndex;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // UI_BASE_COCOA_MENU_CONTROLLER_H_
89