* 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
This commit is contained in:
gcasa 2010-01-13 20:51:30 +00:00
parent 5736f119e9
commit dcea95cb77
9 changed files with 260 additions and 33 deletions

View file

@ -1,3 +1,21 @@
2010-01-13 15:49-EST Gregory John Casamento <greg.casamento@gmail.com>
* 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 <wolfgang.lux@gmail.com>
* Source/NSDocument.m (-writeSafelyToURL:ofType:...): Ensure

View file

@ -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 */

View file

@ -0,0 +1,118 @@
/** <title>GSWindowDecorationView</title>
Copyright (C) 2004 Free Software Foundation, Inc.
Author: Alexander Malmberg <alexander@malmberg.org>
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 <http://www.gnu.org/licenses/> 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 <Foundation/NSGeometry.h>
#include <AppKit/NSView.h>
@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<GSWindowDecorator>) 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

View file

@ -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;

View file

@ -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}

View file

@ -39,7 +39,8 @@
#include "AppKit/PSOperators.h"
#include "GNUstepGUI/GSDisplayServer.h"
#include "GNUstepGUI/GSTheme.h"
#include "GSWindowDecorationView.h"
#include <GNUstepGUI/GSWindowDecorationView.h>
@interface GSStandardWindowDecorationView (GSTheme)
- (void) _themeDidActivate: (NSNotification*)notification;

87
Source/GSThemeMenu.m Normal file
View file

@ -0,0 +1,87 @@
/** <title>GSThemePanel</title>
<abstract>Theme management utility</abstract>
Copyright (C) 2010 Free Software Foundation, Inc.
Author: Gregory John Casamento <greg.casamento@gmail.com>
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 <http://www.gnu.org/licenses/> or write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include <Foundation/NSString.h>
#include <AppKit/NSMenu.h>
#include <AppKit/NSWindow.h>
#include <GNUstepGUI/GSTheme.h>
#include <GNUstepGUI/GSWindowDecorationView.h>
#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

View file

@ -24,7 +24,7 @@
Boston, MA 02110-1301, USA.
*/
#include "GSWindowDecorationView.h"
#include <GNUstepGUI/GSWindowDecorationView.h>
#include <Foundation/NSEnumerator.h>
#include <Foundation/NSException.h>
@ -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
{

View file

@ -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 <GNUstepGUI/GSWindowDecorationView.h>
#define GSI_ARRAY_TYPES 0
#define GSI_ARRAY_TYPE NSWindow *
#define GSI_ARRAY_NO_RELEASE 1
@ -5321,32 +5323,11 @@ current key view.<br />
- (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