/** GSThemePanel Theme management utility Copyright (C) 2010 Free Software Foundation, Inc. Author: Gregory John Casamento Date: 2010 This file is part of the GNU Objective C User interface library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include "NSToolbarFrameworkPrivate.h" @interface NSWindow (Private) - (GSWindowDecorationView *) windowView; @end @implementation NSWindow (Private) - (GSWindowDecorationView *) windowView { return _wv; } @end @implementation GSTheme (Menu) - (void) setMenu: (NSMenu *)menu forWindow: (NSWindow *)window { GSWindowDecorationView *wv = [window windowView]; if ([window menu] != menu) { NSMenuView *menuView; /* Restore the old representation to its original menu after * removing it from the window. If we didn't do this, the menu * representation would be left without a partent view or * window to draw in. */ menuView = [wv removeMenuView]; [[window menu] setMenuRepresentation: menuView]; [menuView sizeToFit]; /* Set the new menu, and transfer the new menu representation * to the window decoration view. */ menuView = [menu menuRepresentation]; if (menuView != nil) { [menu close]; [menuView setHorizontal: YES]; [menuView sizeToFit]; [wv addMenuView: menuView]; } } } - (void) rightMouseDisplay: (NSMenu *)menu forEvent: (NSEvent *)theEvent { NSMenuView *mv = [menu menuRepresentation]; if ([mv isHorizontal] == NO) { [menu displayTransient]; [mv mouseDown: theEvent]; [menu closeTransient]; } } - (void) displayPopUpMenu: (NSMenuView *)mr withCellFrame: (NSRect)cellFrame controlViewWindow: (NSWindow *)cvWin preferredEdge: (NSRectEdge)edge selectedItem: (int)selectedItem { // Ask the MenuView to attach the menu to this rect [mr setWindowFrameForAttachingToRect: cellFrame onScreen: [cvWin screen] preferredEdge: edge popUpSelectedItem: selectedItem]; // Set to be above the main window [cvWin addChildWindow: [mr window] ordered: NSWindowAbove]; // Last, display the window [[mr window] orderFrontRegardless]; } - (void) processCommand: (void *)context { // this is only implemented when we handle native menus. // put code in here to handle commands from the native menu structure. } - (float) menuHeightForWindow: (NSWindow *)window { return [NSMenuView menuBarHeight]; } - (void) updateMenu: (NSMenu *)menu forWindow: (NSWindow *)window { // default implementation of this method does nothing. } - (void) updateAllWindowsWithMenu: (NSMenu *) menu { // default implementation of this method does nothing. } - (BOOL) doesProcessEventsForPopUpMenu { return NO; // themes that handle events in a popUpMenu should return YES } @end