From dcea95cb7798c1f21e269a8e8b51da4bd251bdc5 Mon Sep 17 00:00:00 2001 From: gcasa Date: Wed, 13 Jan 2010 20:51:30 +0000 Subject: [PATCH] * Headers/Additions/GNUstepGUI/GSTheme.h: Added methods to support adding menus and processing commands from windows, if appropriate. * Headers/Additions/GNUstepGUI/GSWindowDecorationView.h: Added new methods for menu and toolbar flags. * Headers/AppKit/NSInterfaceStyle.h: Added new interface style. * Source/GNUmakefile: Added header. * Source/GSStandardWindowDecorationView.m: Change include to include header in new location. * Source/GSThemeMenu.m: Default theme implementation for Menus. * Source/GSWindowDecorationView.m: Add the setHasMenu:/setHasToolbar: flags. * Source/NSWindow.m: Use the theme to set the menu instead of setting it directly. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@29271 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 18 +++ Headers/Additions/GNUstepGUI/GSTheme.h | 6 + .../GNUstepGUI/GSWindowDecorationView.h | 118 ++++++++++++++++++ Headers/AppKit/NSInterfaceStyle.h | 12 +- Source/GNUmakefile | 4 +- Source/GSStandardWindowDecorationView.m | 3 +- Source/GSThemeMenu.m | 87 +++++++++++++ Source/GSWindowDecorationView.m | 12 +- Source/NSWindow.m | 33 ++--- 9 files changed, 260 insertions(+), 33 deletions(-) create mode 100644 Headers/Additions/GNUstepGUI/GSWindowDecorationView.h create mode 100644 Source/GSThemeMenu.m diff --git a/ChangeLog b/ChangeLog index 5bd8d6dc3..b90a22519 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2010-01-13 15:49-EST Gregory John Casamento + + * Headers/Additions/GNUstepGUI/GSTheme.h: Added methods + to support adding menus and processing commands from windows, if + appropriate. + * Headers/Additions/GNUstepGUI/GSWindowDecorationView.h: Added + new methods for menu and toolbar flags. + * Headers/AppKit/NSInterfaceStyle.h: Added new interface style. + * Source/GNUmakefile: Added header. + * Source/GSStandardWindowDecorationView.m: Change include + to include header in new location. + * Source/GSThemeMenu.m: Default theme implementation for + Menus. + * Source/GSWindowDecorationView.m: Add the setHasMenu:/setHasToolbar: + flags. + * Source/NSWindow.m: Use the theme to set the menu instead of + setting it directly. + 2010-01-11 Wolfgang Lux * Source/NSDocument.m (-writeSafelyToURL:ofType:...): Ensure diff --git a/Headers/Additions/GNUstepGUI/GSTheme.h b/Headers/Additions/GNUstepGUI/GSTheme.h index 776a6ae29..7d2f85565 100644 --- a/Headers/Additions/GNUstepGUI/GSTheme.h +++ b/Headers/Additions/GNUstepGUI/GSTheme.h @@ -983,5 +983,11 @@ withRepeatedImage: (NSImage*)image flipped: (BOOL)flipped; @end +@interface GSTheme (Menus) +- (void) setMenu: (NSMenu *)menu + forWindow: (NSWindow *)window; +- (void) processCommand: (void *)context; +@end + #endif /* OS_API_VERSION */ #endif /* _GNUstep_H_GSTheme */ diff --git a/Headers/Additions/GNUstepGUI/GSWindowDecorationView.h b/Headers/Additions/GNUstepGUI/GSWindowDecorationView.h new file mode 100644 index 000000000..863961b1f --- /dev/null +++ b/Headers/Additions/GNUstepGUI/GSWindowDecorationView.h @@ -0,0 +1,118 @@ +/** GSWindowDecorationView + + Copyright (C) 2004 Free Software Foundation, Inc. + + Author: Alexander Malmberg + Date: 2004-03-24 + + This file is part of the GNUstep GUI 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. +*/ + +#ifndef _GNUstep_H_GSWindowDecorationView +#define _GNUstep_H_GSWindowDecorationView + +#include +#include + +@class NSWindow; + +// These are implemented as class methods on GSWindowDecorationView +@protocol GSWindowDecorator +- (id) newWindowDecorationViewWithFrame: (NSRect)frame + window: (NSWindow *)window; +- (NSRect) contentRectForFrameRect: (NSRect)aRect + styleMask: (unsigned int)aStyle; +- (NSRect) frameRectForContentRect: (NSRect)aRect + styleMask: (unsigned int)aStyle; +- (float) minFrameWidthWithTitle: (NSString *)aTitle + styleMask: (unsigned int)aStyle; +@end + + +/* +Abstract superclass for the top-level view in each window. This view is +responsible for managing window decorations. Concrete subclasses may do +this, either directly, or indirectly (by using the backend). +*/ +@interface GSWindowDecorationView : NSView +{ + NSWindow *window; /* not retained */ + int windowNumber; + NSRect contentRect; + int inputState; + BOOL documentEdited; + BOOL hasMenu; + BOOL hasToolbar; +} ++ (id) windowDecorator; + +- (id) initWithFrame: (NSRect)frame window: (NSWindow *)w; + +- (NSRect) contentRectForFrameRect: (NSRect)aRect + styleMask: (unsigned int)aStyle; +- (NSRect) frameRectForContentRect: (NSRect)aRect + styleMask: (unsigned int)aStyle; + +- (void) changeWindowHeight: (float)difference; + +- (void) setBackgroundColor: (NSColor *)color; +- (void) setContentView: (NSView *)contentView; +- (void) setDocumentEdited: (BOOL)flag; +- (void) setInputState: (int)state; +- (void) setTitle: (NSString *)title; + +/* +Called when the backend window is created or destroyed. When it's destroyed, +windowNumber will be 0. +*/ +- (void) setWindowNumber: (int)windowNumber; + +// Flags controlling if elements are present +- (void) setHasMenu: (BOOL) flag; +- (void) setHasToolbar: (BOOL) flag; +@end + + +/* Manage window decorations by using the backend functions. This only works + * on backends that can handle window decorations. + */ +@interface GSBackendWindowDecorationView : GSWindowDecorationView +@end + + +/* +Standard OPENSTEP-ish window decorations. +*/ +@class NSButton; + +@interface GSStandardWindowDecorationView : GSWindowDecorationView +{ + BOOL hasTitleBar, hasResizeBar, hasCloseButton, hasMiniaturizeButton; + BOOL isTitled; //, hasToolbar, hasMenu; + NSRect titleBarRect; + NSRect resizeBarRect; + NSRect closeButtonRect; + NSRect miniaturizeButtonRect; + + NSButton *closeButton, *miniaturizeButton; +} +@end + +#endif + diff --git a/Headers/AppKit/NSInterfaceStyle.h b/Headers/AppKit/NSInterfaceStyle.h index fdb7c4fd4..92137a437 100644 --- a/Headers/AppKit/NSInterfaceStyle.h +++ b/Headers/AppKit/NSInterfaceStyle.h @@ -42,11 +42,15 @@ typedef enum { NSMacintoshInterfaceStyle = 2, NSWindows95InterfaceStyle = 3, -/* - * GNUstep specific. Blame: Michael Hanni. - */ + /* + * GNUstep specific. Blame: Michael Hanni. + */ + GSWindowMakerInterfaceStyle = 4, - GSWindowMakerInterfaceStyle = 4 + /* + * GNUstep specific style for native menus. + */ + GSNativeInterfaceStyle = 5 } NSInterfaceStyle; diff --git a/Source/GNUmakefile b/Source/GNUmakefile index a3c61b8f1..f6706cd22 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -203,6 +203,7 @@ linking.m \ GSTheme.m \ GSThemeDrawing.m \ GSThemeInspector.m \ +GSThemeMenu.m \ GSThemePanel.m \ GSThemeTools.m \ GSDragView.m \ @@ -439,7 +440,8 @@ GSPDFPrintOperation.h \ GSModelLoaderFactory.h \ GSInstantiator.h \ GSSoundSink.h \ -GSSoundSource.h +GSSoundSource.h \ +GSWindowDecorationView.h libgnustep-gui_HEADER_FILES = ${GUI_HEADERS} diff --git a/Source/GSStandardWindowDecorationView.m b/Source/GSStandardWindowDecorationView.m index a182ec181..3a0051f97 100644 --- a/Source/GSStandardWindowDecorationView.m +++ b/Source/GSStandardWindowDecorationView.m @@ -39,7 +39,8 @@ #include "AppKit/PSOperators.h" #include "GNUstepGUI/GSDisplayServer.h" #include "GNUstepGUI/GSTheme.h" -#include "GSWindowDecorationView.h" + +#include @interface GSStandardWindowDecorationView (GSTheme) - (void) _themeDidActivate: (NSNotification*)notification; diff --git a/Source/GSThemeMenu.m b/Source/GSThemeMenu.m new file mode 100644 index 000000000..32b03ffaa --- /dev/null +++ b/Source/GSThemeMenu.m @@ -0,0 +1,87 @@ +/** 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 "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) processCommand: (void *)context +{ + // this is only implemented when we handle native menus. + // put code in here to handle commands from the native menu structure. +} +@end + diff --git a/Source/GSWindowDecorationView.m b/Source/GSWindowDecorationView.m index fb275d0e9..05724deb2 100644 --- a/Source/GSWindowDecorationView.m +++ b/Source/GSWindowDecorationView.m @@ -24,7 +24,7 @@ Boston, MA 02110-1301, USA. */ -#include "GSWindowDecorationView.h" +#include #include #include @@ -119,6 +119,16 @@ return self; } +- (void) setHasMenu: (BOOL) flag +{ + hasMenu = flag; +} + +- (void) setHasToolbar: (BOOL) flag +{ + hasToolbar = flag; +} + - (NSRect) contentRectForFrameRect: (NSRect)aRect styleMask: (unsigned int)aStyle { diff --git a/Source/NSWindow.m b/Source/NSWindow.m index 7f652b871..02802eef1 100644 --- a/Source/NSWindow.m +++ b/Source/NSWindow.m @@ -78,14 +78,16 @@ #include "AppKit/NSWindowController.h" #include "GSBindingHelpers.h" #include "AppKit/PSOperators.h" +#include "GNUstepGUI/GSTheme.h" #include "GNUstepGUI/GSTrackingRect.h" #include "GNUstepGUI/GSDisplayServer.h" #include "GSGuiPrivate.h" #include "GSToolTips.h" #include "GSIconManager.h" -#include "GSWindowDecorationView.h" #include "NSToolbarFrameworkPrivate.h" +#include + #define GSI_ARRAY_TYPES 0 #define GSI_ARRAY_TYPE NSWindow * #define GSI_ARRAY_NO_RELEASE 1 @@ -5321,32 +5323,11 @@ current key view.
- (void) setMenu: (NSMenu *)menu { - if ([self menu] != menu) - { - NSMenuView *menuView; + // Do theme specific logic... + [[GSTheme theme] setMenu: menu forWindow: self]; - /* 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]; - [[self menu] setMenuRepresentation: menuView]; - [menuView sizeToFit]; - - /* Set the new menu, and transfer the new menu representation - * to the window decoration view. - */ - [super setMenu: menu]; - menuView = [menu menuRepresentation]; - if (menuView != nil) - { - [menu close]; - [menuView setHorizontal: YES]; - [menuView sizeToFit]; - [_wv addMenuView: menuView]; - } - } + if([self menu] != menu) + [super setMenu: menu]; } @end