diff --git a/ChangeLog b/ChangeLog index e497941e4..8275dde3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +Thu Jan 29 12:02:08 Ovidiu Predescu + + * Model/IBClasses.h: New class NSCustomView. + * Model/IBClasses.m: Likewise. + * Model/GMAppKit.h: Moved to Headers/AppKit. + * Model/IMCustomObject.m: Likewise. + * Model/IMLoading.h: Likewise. + * Model/GMAppKit.m ([NSApplication -encodeWithModelArchiver:]): + Encode the delegate. + (NSBox): Support for encoding and decoding it. + ([NSCell -initWithModelUnarchiver:]): Check for the font. + (NSClipView): Support for encoding and decoding. + (NSImage): Return a dummy image in case the requested one doesn't + exist. Don't return nil as it breaks the code, maybe we should + raise an exception. + (NSPopUpButton): Code to support encoding and + decoding. Unfortunately it doesn't work properly, it causes a + crash when loading. + * Model/test.nib: Added a custom view to test loading. + * Source/GNUmakefile: Added NSTextView.m. + * Source/NSApplication.m ([NSApplication -finishLaunching]): Add support + for loading the model file. + * Source/NSBrowser.m: Fixed several allocation bugs. + * Source/NSClipView.m ([NSClipView -setDocumentView:]): Check for + invalid document view. + * Source/NSPopUpButton.m: Minimaly fill out the implementation so + we don't get a crash at the loading time. + * Source/NSTextView.m: Define the class so we don't linking errors + while trying to link with OPENSTEP converted applications. + Fri Jan 9 14:06:57 1998 Ovidiu Predescu * Model/GNUmakefile: Copy the header files to the AppKit directory diff --git a/Headers/gnustep/gui/AppKit.h b/Headers/gnustep/gui/AppKit.h index f174f2bb3..96b9407eb 100644 --- a/Headers/gnustep/gui/AppKit.h +++ b/Headers/gnustep/gui/AppKit.h @@ -132,6 +132,7 @@ #include #include #include +#include #include #include #include diff --git a/Model/GMAppKit.h b/Headers/gnustep/gui/GMAppKit.h similarity index 97% rename from Model/GMAppKit.h rename to Headers/gnustep/gui/GMAppKit.h index 5fbdb0d76..61b3e6db6 100644 --- a/Model/GMAppKit.h +++ b/Headers/gnustep/gui/GMAppKit.h @@ -41,6 +41,9 @@ @interface NSCell (GMArchiverMethods) @end +@interface NSClipView (GMArchiverMethods) +@end + @interface NSColor (GMArchiverMethods) @end diff --git a/Headers/gnustep/gui/IMConnectors.h b/Headers/gnustep/gui/IMConnectors.h new file mode 100644 index 000000000..110218bb6 --- /dev/null +++ b/Headers/gnustep/gui/IMConnectors.h @@ -0,0 +1,55 @@ +/* + IMConnectors.h + + Copyright (C) 1996 Free Software Foundation, Inc. + + Author: Ovidiu Predescu + Date: November 1997 + + 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 Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* These classes were inspired by IBConnectors classes from objcX, "an + Objective-C class library for a window system". The code was originally + written by Scott Francis, Paul Kunz, Imran Qureshi and Libing Wang. */ + +#ifndef _GNUstep_H_IMConnectors +#define _GNUstep_H_IMConnectors + +#import + +@interface IMConnector : NSObject +{ + id source; + id destination; + NSString* label; +} + +- source; +- destination; +- label; +@end + +@interface IMControlConnector:IMConnector +- (void)establishConnection; +@end + +@interface IMOutletConnector : IMConnector +- (void)establishConnection; +@end + +#endif /* _GNUstep_H_IMConnectors */ diff --git a/Model/IMCustomObject.h b/Headers/gnustep/gui/IMCustomObject.h similarity index 92% rename from Model/IMCustomObject.h rename to Headers/gnustep/gui/IMCustomObject.h index 90f27c3ac..6e34c2333 100644 --- a/Model/IMCustomObject.h +++ b/Headers/gnustep/gui/IMCustomObject.h @@ -51,4 +51,16 @@ @end + +@interface IMCustomView : NSView +{ + NSString* className; + id realObject; + id extension; +} + +- (id)nibInstantiate; + +@end + #endif /* _GNUstep_H_IMCustomObject */ diff --git a/Model/IMLoading.h b/Headers/gnustep/gui/IMLoading.h similarity index 91% rename from Model/IMLoading.h rename to Headers/gnustep/gui/IMLoading.h index 17047dafb..01dd9061b 100644 --- a/Model/IMLoading.h +++ b/Headers/gnustep/gui/IMLoading.h @@ -34,7 +34,7 @@ @interface NSBundle (IMLoading) -+ (BOOL)loadIMFile:(NSString*)filename owner:(id)owner; +- (BOOL)loadIMFile:(NSString*)filename owner:(id)owner; @end @@ -44,6 +44,7 @@ NSArray* connections; } + (BOOL)loadIMFile:(NSString*)path owner:(id)owner; ++ (BOOL)loadIMFile:(NSString*)path owner:(id)owner bundle:(NSBundle*)bundle; - (void)_makeConnections; - (void)_setObjects:objects connections:connections; @end diff --git a/Headers/gnustep/gui/NSPopUpButton.h b/Headers/gnustep/gui/NSPopUpButton.h index 9a4d37999..f38db346c 100644 --- a/Headers/gnustep/gui/NSPopUpButton.h +++ b/Headers/gnustep/gui/NSPopUpButton.h @@ -30,12 +30,12 @@ #define _GNUstep_H_NSPopUpButton #include +#include @class NSString; @class NSArray; @class NSMutableArray; -@class NSMenuCell; @class NSFont; @class NSMatrix; @@ -89,14 +89,14 @@ - (int)indexOfItemWithTitle:(NSString *)title; - (int)indexOfSelectedItem; - (int)numberOfItems; -- (NSMenuCell *)itemAtIndex:(int)index; -- (NSMatrix *)itemMatrix; +- (id )itemAtIndex:(int)index; +- (NSArray *)itemArray; - (NSString *)itemTitleAtIndex:(int)index; - (NSArray *)itemTitles; -- (NSMenuCell *)itemWithTitle:(NSString *)title; -- (NSMenuCell *)lastItem; -- (NSMenuCell *)selectedItem; -- (NSString *)titleOfSelectedItem; +- (id )itemWithTitle:(NSString *)title; +- (id )lastItem; +- (id )selectedItem; +- (NSString*)titleOfSelectedItem; // // Manipulating the NSPopUpButton diff --git a/Headers/gnustep/gui/NSTextView.h b/Headers/gnustep/gui/NSTextView.h new file mode 100644 index 000000000..7523b1e22 --- /dev/null +++ b/Headers/gnustep/gui/NSTextView.h @@ -0,0 +1,34 @@ +/* + NSTextView.h + + Copyright (C) 1996 Free Software Foundation, Inc. + + Author: Ovidiu Predescu + Date: January 1998 + + 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 Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _GNUstep_H_NSTextView +#define _GNUstep_H_NSTextView + +#include + +@interface NSTextView : NSText +@end + +#endif /* _GNUstep_H_NSTextView */ diff --git a/Model/GMAppKit.m b/Model/GMAppKit.m index b3d1d4fa7..877b60243 100644 --- a/Model/GMAppKit.m +++ b/Model/GMAppKit.m @@ -148,12 +148,10 @@ void __dummy_GMAppKit_functionForLinking() {} [archiver encodeInt:[self state] withName:@"state"]; [archiver encodeFloat:delay withName:@"delay"]; [archiver encodeFloat:interval withName:@"interval"]; -#if 1 [archiver encodeString:[self title] withName:@"title"]; [archiver encodeString:[self alternateTitle] withName:@"alternateTitle"]; [archiver encodeObject:[self image] withName:@"image"]; [archiver encodeObject:[self alternateImage] withName:@"alternateImage"]; -#endif [archiver encodeInt:[self imagePosition] withName:@"imagePosition"]; [archiver encodeBOOL:[self isBordered] withName:@"isBordered"]; [archiver encodeBOOL:[self isTransparent] withName:@"isTransparent"]; @@ -214,6 +212,30 @@ void __dummy_GMAppKit_functionForLinking() {} @end /* NSCell (GMArchiverMethods) */ +@implementation NSClipView (GMArchiverMethods) + +- (void)encodeWithModelArchiver:(GMArchiver*)archiver +{ + [super encodeWithModelArchiver:archiver]; + + [archiver encodeObject:[self documentView] withName:@"documentView"]; + [archiver encodeBOOL:[self copiesOnScroll] withName:@"copiesOnScroll"]; + [archiver encodeObject:[self backgroundColor] withName:@"backgroundColor"]; +} + +- (id)initWithModelUnarchiver:(GMUnarchiver*)unarchiver +{ + self = [super initWithModelUnarchiver:unarchiver]; + + [self setDocumentView:[unarchiver decodeObjectWithName:@"documentView"]]; + [self setCopiesOnScroll:[unarchiver decodeBOOLWithName:@"copiesOnScroll"]]; + [self setBackgroundColor:[unarchiver decodeObjectWithName:@"backgroundColor"]]; + return self; +} + +@end /* NSClipView (GMArchiverMethods) */ + + @implementation NSColor (GMArchiverMethods) - (void)encodeWithModelArchiver:(GMArchiver*)archiver @@ -535,6 +557,9 @@ void __dummy_GMAppKit_functionForLinking() {} - (id)initWithModelUnarchiver:(GMUnarchiver*)unarchiver { + /* Check the following: the program simply crashes if there's nothing in the + model file */ +#if 0 int i, count; NSMutableArray* decodedItems = [unarchiver decodeObjectWithName:@"itemArray"]; @@ -556,6 +581,7 @@ void __dummy_GMAppKit_functionForLinking() {} [self selectItemWithTitle:[unarchiver decodeStringWithName:@"selectedItem"]]; [self synchronizeTitleAndSelectedItem]; +#endif return self; } @@ -666,6 +692,8 @@ void __dummy_GMAppKit_functionForLinking() {} NSView* view = [[[self allocWithZone:[unarchiver objectZone]] initWithFrame:rect] autorelease]; + if (!view) + NSLog (@"cannot create the requested view!"); return view; } diff --git a/Model/IBClasses.h b/Model/IBClasses.h index 2d487114a..342551dbf 100644 --- a/Model/IBClasses.h +++ b/Model/IBClasses.h @@ -29,7 +29,7 @@ #ifndef _GNUstep_H_IBClasses #define _GNUstep_H_IBClasses -#import +#import @class NSString; @@ -42,6 +42,18 @@ @end +@interface NSCustomView : NSView +{ + id className; + id realObject; + id extension; +} + +- (id)nibInstantiate; + +@end + + @interface NSIBConnector : NSObject { id source; diff --git a/Model/IBClasses.m b/Model/IBClasses.m index 10904d3fa..214e1c13a 100644 --- a/Model/IBClasses.m +++ b/Model/IBClasses.m @@ -74,6 +74,45 @@ @end /* NSCustomObject */ +@implementation NSCustomView (NibToGModel) + +- (id)awakeAfterUsingCoder:(NSCoder*)aDecoder +{ +#ifdef DEBUG + NSLog (@"%x awakeAfterUsingCoder NSCustomView: className = %@, realObject = %@, " + @"extension = %@", self, className, realObject, extension); +#endif + [objects addObject:self]; + return self; +} + +- description +{ + return [NSString stringWithFormat:@"className = %@, realObject = %@, extension = %@", className, realObject, extension]; +} + +- nibInstantiate +{ + return self; +} + +- (void)encodeWithModelArchiver:(GMArchiver*)archiver +{ + [archiver encodeString:className withName:@"className"]; + if (realObject) + [archiver encodeObject:realObject withName:@"realObject"]; + if (extension) + [archiver encodeObject:extension withName:@"extension"]; +} + +- (Class)classForModelArchiver +{ + return [IMCustomView class]; +} + +@end + + @implementation NSIBConnector (NibToGModel) - (id)awakeAfterUsingCoder:(NSCoder*)aDecoder { diff --git a/Model/IMCustomObject.m b/Model/IMCustomObject.m index 88160ef03..e11e493e4 100644 --- a/Model/IMCustomObject.m +++ b/Model/IMCustomObject.m @@ -87,3 +87,52 @@ extern BOOL _fileOwnerDecoded; } @end + + +@implementation IMCustomView + ++ (id)createObjectForModelUnarchiver:(GMUnarchiver*)unarchiver +{ + IMCustomView* customView = [[self new] autorelease]; + Class class; + + customView->className = [unarchiver decodeStringWithName:@"className"]; + customView->extension = [unarchiver decodeObjectWithName:@"extension"]; + customView->realObject = [unarchiver decodeObjectWithName:@"realObject"]; + + if (!_fileOwnerDecoded) { + _fileOwnerDecoded = YES; + customView->realObject = _nibOwner; + return customView; + } + + class = NSClassFromString (customView->className); + if (class) + customView->realObject = [[class alloc] init]; + else { + NSLog (@"Class %@ not linked into application!", customView->className); + } + + return customView; +} + +- (id)nibInstantiate +{ + return realObject; +} + +- (void)encodeWithModelArchiver:(GMArchiver*)archiver +{ + [archiver encodeString:className withName:@"className"]; + if (realObject) + [archiver encodeObject:realObject withName:@"realObject"]; + if (extension) + [archiver encodeObject:extension withName:@"extension"]; +} + +- (id)initWithModelUnarchiver:(GMUnarchiver*)unarchiver +{ + return self; +} + +@end diff --git a/Model/IMLoading.m b/Model/IMLoading.m index 4a60b2374..327caf6cd 100644 --- a/Model/IMLoading.m +++ b/Model/IMLoading.m @@ -26,6 +26,8 @@ #import #import #import +#import + #include #include "IMLoading.h" #include "IMCustomObject.h" @@ -37,9 +39,9 @@ void __dummy_IMLoading_functionForLinking() @implementation NSBundle (IMLoading) -+ (BOOL)loadIMFile:(NSString*)path owner:(id)owner +- (BOOL)loadIMFile:(NSString*)path owner:(id)owner { - return [GMModel loadIMFile:path owner:owner]; + return [GMModel loadIMFile:path owner:owner bundle:self]; } @end /* NSBundle(IMLoading) */ @@ -59,7 +61,11 @@ BOOL _fileOwnerDecoded = NO; + (BOOL)loadIMFile:(NSString*)path owner:(id)owner { - NSBundle* mainBundle = [NSBundle mainBundle]; + return [self loadIMFile:path owner:owner bundle:[NSBundle mainBundle]]; +} + ++ (BOOL)loadIMFile:(NSString*)path owner:(id)owner bundle:(NSBundle*)mainBundle +{ NSString* resourcePath = [mainBundle resourcePath]; GMUnarchiver* unarchiver; id previousNibOwner = _nibOwner; @@ -67,9 +73,21 @@ BOOL _fileOwnerDecoded = NO; if (![path hasSuffix:@".gmodel"]) path = [path stringByAppendingPathExtension:@"gmodel"]; - path = [resourcePath stringByAppendingPathComponent:path]; - if (![[NSFileManager defaultManager] fileExistsAtPath:path]) - return NO; + + /* First check to see if path is an absolute path; if so try to load the + pointed file. */ + if ([path isAbsolutePath]) { + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + /* The file is an absolute path name but the model file doesn't exist. */ + return NO; + } + } + else { + /* The path is a relative path; search it in the current bundle. */ + path = [resourcePath stringByAppendingPathComponent:path]; + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) + return NO; + } NSLog (@"loading model file %@...", path); unarchiver = [GMUnarchiver unarchiverWithContentsOfFile:path]; diff --git a/Model/test.gmodel b/Model/test.gmodel index c326ca73e..4f72b4744 100644 --- a/Model/test.gmodel +++ b/Model/test.gmodel @@ -1,6 +1,6 @@ { "Object 1" = { - elements = ("Object 2", "Object 52", "Object 53"); + elements = ("Object 2", "Object 31", "Object 55", "Object 56"); isa = NSMutableArray; }; "Object 2" = {className = NSApplication; isa = IMCustomObject; realObject = "Object 3"; }; @@ -8,12 +8,12 @@ delegate = nil; isa = NSApplication; keyWindow = nil; - mainMenu = "Object 31"; + mainMenu = "Object 34"; mainWindow = nil; windows = "Object 4"; }; "Object 4" = { - elements = ("Object 5", "Object 9", "Object 11"); + elements = ("Object 5", "Object 9", "Object 11", "Object 32"); isa = NSMutableArray; }; "Object 5" = { @@ -92,7 +92,7 @@ backgroundColor = "Object 8"; backingType = 2; contentView = "Object 12"; - frame = "{x = 258; y = 519; width = 422; height = 296}"; + frame = "{x = 258; y = 511; width = 422; height = 304}"; frameAutosaveName = nil; hidesOnDeactivate = NO; isAutodisplay = YES; @@ -109,8 +109,8 @@ "Object 12" = { autoresizesSubviews = NO; autoresizingMask = 0; - bounds = "{x = 0; y = 0; width = 420; height = 264}"; - frame = "{x = 1; y = 9; width = 420; height = 264}"; + bounds = "{x = 0; y = 0; width = 420; height = 272}"; + frame = "{x = 1; y = 9; width = 420; height = 272}"; isa = NSView; nextResponder = "Object 11"; postsBoundsChangedNotifications = YES; @@ -129,7 +129,8 @@ "Object 21", "Object 24", "Object 27", - "Object 30" + "Object 30", + "Object 31" ); isa = NSMutableArray; }; @@ -142,7 +143,7 @@ bounds = "{x = 0; y = 0; width = 114; height = 24}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 16; y = 140; width = 114; height = 24}"; + frame = "{x = 16; y = 148; width = 114; height = 24}"; highlightsBy = 12; ignoresMultiClick = NO; image = nil; @@ -174,7 +175,7 @@ bounds = "{x = 0; y = 0; width = 114; height = 24}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 16; y = 224; width = 114; height = 24}"; + frame = "{x = 16; y = 232; width = 114; height = 24}"; highlightsBy = 14; ignoresMultiClick = NO; image = nil; @@ -205,7 +206,7 @@ bounds = "{x = 0; y = 0; width = 114; height = 24}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 16; y = 182; width = 114; height = 24}"; + frame = "{x = 16; y = 190; width = 114; height = 24}"; highlightsBy = 1; ignoresMultiClick = NO; image = nil; @@ -236,7 +237,7 @@ bounds = "{x = 0; y = 0; width = 114; height = 24}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 17; y = 98; width = 114; height = 24}"; + frame = "{x = 17; y = 106; width = 114; height = 24}"; highlightsBy = 14; ignoresMultiClick = NO; image = nil; @@ -267,7 +268,7 @@ bounds = "{x = 0; y = 0; width = 114; height = 24}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 15; y = 56; width = 114; height = 24}"; + frame = "{x = 15; y = 64; width = 114; height = 24}"; highlightsBy = 12; ignoresMultiClick = NO; image = nil; @@ -298,7 +299,7 @@ bounds = "{x = 0; y = 0; width = 114; height = 24}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 16; y = 14; width = 114; height = 24}"; + frame = "{x = 16; y = 22; width = 114; height = 24}"; highlightsBy = 3; ignoresMultiClick = NO; image = nil; @@ -329,7 +330,7 @@ bounds = "{x = 0; y = 0; width = 109; height = 15}"; delay = 0.200000; font = "Object 15"; - frame = "{x = 204; y = 208; width = 109; height = 15}"; + frame = "{x = 204; y = 216; width = 109; height = 15}"; highlightsBy = 3; ignoresMultiClick = NO; image = "Object 22"; @@ -367,7 +368,7 @@ drawsBackground = NO; errorAction = nil; font = "Object 25"; - frame = "{x = 193; y = 159; width = 132; height = 26}"; + frame = "{x = 193; y = 167; width = 132; height = 26}"; ignoresMultiClick = NO; isBezeled = NO; isBordered = YES; @@ -410,7 +411,7 @@ drawsBackground = YES; errorAction = nil; font = "Object 15"; - frame = "{x = 172; y = 100; width = 214; height = 21}"; + frame = "{x = 172; y = 108; width = 214; height = 21}"; ignoresMultiClick = NO; isBezeled = YES; isBordered = NO; @@ -454,36 +455,67 @@ saturation = 0.000000; }; "Object 30" = {isa = NSPopUpButton; pullsDown = NO; }; - "Object 31" = { - autoenablesItems = YES; - isa = NSMenu; - itemArray = "Object 32"; - title = test; - }; + "Object 31" = {className = MyView; isa = IMCustomView; }; "Object 32" = { - elements = ("Object 33", "Object 39", "Object 50", "Object 51"); - isa = NSMutableArray; + backgroundColor = "Object 8"; + backingType = 2; + contentView = "Object 33"; + frame = "{x = 178; y = 312; width = 370; height = 357}"; + frameAutosaveName = nil; + hidesOnDeactivate = NO; + isAutodisplay = YES; + isReleasedWhenClosed = NO; + isVisible = NO; + isa = NSWindow; + level = 0; + maxSize = "{width = 3.40282e+38; height = 3.40282e+38}"; + minSize = "{width = 0; height = 0}"; + representedFilename = ""; + styleMask = 14; + title = Window; }; "Object 33" = { - action = "submenuAction:"; - isEnabled = YES; - isa = NSMenuItem; - keyEquivalent = ""; - tag = 0; - target = "Object 34"; - title = Info; + autoresizesSubviews = NO; + autoresizingMask = 0; + bounds = "{x = 0; y = 0; width = 368; height = 325}"; + frame = "{x = 1; y = 9; width = 368; height = 325}"; + isa = NSView; + nextResponder = "Object 32"; + postsBoundsChangedNotifications = YES; + postsFrameChangedNotifications = YES; + subviews = "Object 7"; + superview = nil; }; "Object 34" = { autoenablesItems = YES; isa = NSMenu; itemArray = "Object 35"; - title = Info; + title = test; }; "Object 35" = { - elements = ("Object 36", "Object 37", "Object 38"); + elements = ("Object 36", "Object 42", "Object 53", "Object 54"); isa = NSMutableArray; }; "Object 36" = { + action = "submenuAction:"; + isEnabled = YES; + isa = NSMenuItem; + keyEquivalent = ""; + tag = 0; + target = "Object 37"; + title = Info; + }; + "Object 37" = { + autoenablesItems = YES; + isa = NSMenu; + itemArray = "Object 38"; + title = Info; + }; + "Object 38" = { + elements = ("Object 39", "Object 40", "Object 41"); + isa = NSMutableArray; + }; + "Object 39" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -492,7 +524,7 @@ target = nil; title = "Info Panel..."; }; - "Object 37" = { + "Object 40" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -501,7 +533,7 @@ target = nil; title = Preferences...; }; - "Object 38" = { + "Object 41" = { action = nil; isEnabled = YES; isa = NSMenuItem; @@ -510,35 +542,35 @@ target = nil; title = Help...; }; - "Object 39" = { + "Object 42" = { action = "submenuAction:"; isEnabled = YES; isa = NSMenuItem; keyEquivalent = ""; tag = 0; - target = "Object 40"; + target = "Object 43"; title = Document; }; - "Object 40" = { + "Object 43" = { autoenablesItems = YES; isa = NSMenu; - itemArray = "Object 41"; + itemArray = "Object 44"; title = Document; }; - "Object 41" = { + "Object 44" = { elements = ( - "Object 42", - "Object 43", - "Object 44", "Object 45", "Object 46", "Object 47", "Object 48", - "Object 49" + "Object 49", + "Object 50", + "Object 51", + "Object 52" ); isa = NSMutableArray; }; - "Object 42" = { + "Object 45" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -547,7 +579,7 @@ target = nil; title = Open...; }; - "Object 43" = { + "Object 46" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -556,7 +588,7 @@ target = nil; title = New; }; - "Object 44" = { + "Object 47" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -565,7 +597,7 @@ target = nil; title = Save; }; - "Object 45" = { + "Object 48" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -574,7 +606,7 @@ target = nil; title = "Save As..."; }; - "Object 46" = { + "Object 49" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -583,7 +615,7 @@ target = nil; title = "Save To..."; }; - "Object 47" = { + "Object 50" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -592,7 +624,7 @@ target = nil; title = "Save All"; }; - "Object 48" = { + "Object 51" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -601,7 +633,7 @@ target = nil; title = "Revert to Saved"; }; - "Object 49" = { + "Object 52" = { action = nil; isEnabled = NO; isa = NSMenuItem; @@ -610,7 +642,7 @@ target = nil; title = Close; }; - "Object 50" = { + "Object 53" = { action = nil; isEnabled = YES; isa = NSMenuItem; @@ -619,7 +651,7 @@ target = nil; title = Hide; }; - "Object 51" = { + "Object 54" = { action = nil; isEnabled = YES; isa = NSMenuItem; @@ -628,96 +660,96 @@ target = nil; title = Quit; }; - "Object 52" = {className = NSFontManager; isa = IMCustomObject; }; - "Object 53" = {className = Controller; isa = IMCustomObject; }; - "Object 54" = { + "Object 55" = {className = Controller; isa = IMCustomObject; }; + "Object 56" = {className = NSFontManager; isa = IMCustomObject; }; + "Object 57" = { elements = ( - "Object 55", - "Object 57", - "Object 59", - "Object 61", - "Object 63", + "Object 58", + "Object 60", + "Object 62", "Object 64", - "Object 65", "Object 66", "Object 67", "Object 68", - "Object 69" + "Object 69", + "Object 70", + "Object 71", + "Object 72" ); isa = NSMutableArray; }; - "Object 55" = { + "Object 58" = { destination = "Object 2"; isa = IMControlConnector; - label = "Object 56"; - source = "Object 51"; + label = "Object 59"; + source = "Object 54"; }; - "Object 56" = {isa = NSString; string = "terminate:"; }; - "Object 57" = { + "Object 59" = {isa = NSString; string = "terminate:"; }; + "Object 60" = { destination = "Object 2"; isa = IMControlConnector; - label = "Object 58"; - source = "Object 50"; - }; - "Object 58" = {isa = NSString; string = "hide:"; }; - "Object 59" = { - destination = "Object 27"; - isa = IMOutletConnector; - label = "Object 60"; + label = "Object 61"; source = "Object 53"; }; - "Object 60" = {isa = NSString; string = textField; }; - "Object 61" = { - destination = "Object 53"; + "Object 61" = {isa = NSString; string = "hide:"; }; + "Object 62" = { + destination = "Object 27"; + isa = IMOutletConnector; + label = "Object 63"; + source = "Object 55"; + }; + "Object 63" = {isa = NSString; string = textField; }; + "Object 64" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 16"; }; - "Object 62" = {isa = NSString; string = "buttonPressed:"; }; - "Object 63" = { - destination = "Object 53"; + "Object 65" = {isa = NSString; string = "buttonPressed:"; }; + "Object 66" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 17"; }; - "Object 64" = { - destination = "Object 53"; + "Object 67" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 14"; }; - "Object 65" = { - destination = "Object 53"; + "Object 68" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 18"; }; - "Object 66" = { - destination = "Object 53"; + "Object 69" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 19"; }; - "Object 67" = { - destination = "Object 53"; + "Object 70" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 20"; }; - "Object 68" = { - destination = "Object 53"; + "Object 71" = { + destination = "Object 55"; isa = IMControlConnector; - label = "Object 62"; + label = "Object 65"; source = "Object 21"; }; - "Object 69" = { - destination = "Object 53"; + "Object 72" = { + destination = "Object 55"; isa = IMOutletConnector; - label = "Object 70"; + label = "Object 73"; source = "Object 2"; }; - "Object 70" = {isa = NSString; string = delegate; }; - RootObject = {Connections = "Object 54"; Objects = "Object 1"; isa = GMModel; }; + "Object 73" = {isa = NSString; string = delegate; }; + RootObject = {Connections = "Object 57"; Objects = "Object 1"; isa = GMModel; }; TopLevelObjects = (RootObject); Version = 1; } diff --git a/Model/test.m b/Model/test.m index 1c819a6e6..0aea334fb 100644 --- a/Model/test.m +++ b/Model/test.m @@ -2,6 +2,18 @@ #import #import "IMLoading.h" +@interface MyView : NSView +@end + +@implementation MyView +- (void)drawRect:(NSRect)rect +{ + [[NSColor greenColor] set]; + NSRectFill (rect); +} +@end + + int main (int argc, char** argv, char** env) { id pool; @@ -13,23 +25,28 @@ int main (int argc, char** argv, char** env) [NSProcessInfo initializeWithArguments:argv count:argc environment:env]; #endif +#if 0 processInfo = [NSProcessInfo processInfo]; arguments = [processInfo arguments]; if ([arguments count] != 2) { printf ("usage: %s gmodel-file\n", [[processInfo processName] cString]); exit (1); } +#endif #ifndef NX_CURRENT_COMPILER_RELEASE initialize_gnustep_backend(); #endif +#if 0 if (![GMModel loadIMFile:[arguments objectAtIndex:1] owner:[NSApplication sharedApplication]]) { printf ("Cannot load Interface Modeller file!\n"); exit (1); } +#endif + [[NSDPSContext currentContext] wait]; [[NSApplication sharedApplication] run]; printf ("exiting...\n"); diff --git a/Model/test.nib/data.classes b/Model/test.nib/data.classes index 1a4a70430..a4732f36f 100644 --- a/Model/test.nib/data.classes +++ b/Model/test.nib/data.classes @@ -4,3 +4,4 @@ SUPERCLASS = NSObject; }; "FirstResponder" = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = NSObject; }; +"MyView" = {ACTIONS = {}; OUTLETS = {}; SUPERCLASS = NSView; }; diff --git a/Model/test.nib/objects.nib b/Model/test.nib/objects.nib index 712831d00..1ee02a237 100644 Binary files a/Model/test.nib/objects.nib and b/Model/test.nib/objects.nib differ diff --git a/Source/GNUmakefile b/Source/GNUmakefile index 365561abf..f671fe673 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -96,6 +96,7 @@ NSSplitView.m \ NSText.m \ NSTextField.m \ NSTextFieldCell.m \ +NSTextView.m \ NSView.m \ NSWindow.m \ NSWindowView.m \ @@ -179,6 +180,7 @@ AppKit/NSSplitView.h \ AppKit/NSText.h \ AppKit/NSTextField.h \ AppKit/NSTextFieldCell.h \ +AppKit/NSTextView.h \ AppKit/NSView.h \ AppKit/NSWindow.h \ AppKit/NSWindowView.h \ diff --git a/Source/NSApplication.m b/Source/NSApplication.m index 5f73e3ba9..a1c6b974a 100644 --- a/Source/NSApplication.m +++ b/Source/NSApplication.m @@ -151,12 +151,10 @@ static id NSApp; propertyList]; NSString* mainModelFile = [infoDict objectForKey:@"NSMainNibFile"]; - if (mainModelFile) { + if (mainModelFile && ![mainModelFile isEqual:@""]) { if (![GMModel loadIMFile:mainModelFile owner:[NSApplication sharedApplication]]) NSLog (@"Cannot load the main model file '%@", mainModelFile); - else - NSLog (@"Model loading ready!"); } // notify that we will finish the launching diff --git a/Source/NSBrowser.m b/Source/NSBrowser.m index ae652ca75..92c654fc4 100644 --- a/Source/NSBrowser.m +++ b/Source/NSBrowser.m @@ -82,6 +82,9 @@ - (void)dealloc { + [_columnScrollView release]; + [_columnMatrix release]; + [_emptyView release]; [_columnTitle release]; [super dealloc]; } @@ -98,6 +101,8 @@ - (void)setColumnScrollView:(id)aView { + [aView retain]; + [_columnScrollView release]; _columnScrollView = aView; } @@ -108,6 +113,8 @@ - (void)setColumnMatrix:(id)aMatrix { + [aMatrix retain]; + [_columnMatrix release]; _columnMatrix = aMatrix; } @@ -194,7 +201,7 @@ _browserCellClass = [NSBrowser cellClass]; _browserCellPrototype = [[_browserCellClass alloc] init]; _browserMatrixClass = [NSMatrix class]; - _pathSeparator = [[NSString alloc] initWithCString: "/"]; + _pathSeparator = @"/"; _isLoaded = NO; _allowsBranchSelection = YES; _allowsEmptySelection = YES; @@ -527,8 +534,9 @@ bc = [[[NSBrowserColumn alloc] init] autorelease]; // Create a scrollview - sc = [[NSScrollView alloc] - initWithFrame: [self frameOfInsideOfColumn: n]]; + sc = [[[NSScrollView alloc] + initWithFrame: [self frameOfInsideOfColumn: n]] + autorelease]; [sc setHasHorizontalScroller: NO]; [sc setHasVerticalScroller: YES]; [bc setColumnScrollView: sc]; @@ -1470,12 +1478,13 @@ // If we are not reusing matrixes // then delete the old matrix and create a new one [oldm release]; - matrix = [[_browserMatrixClass alloc] + matrix = [[[_browserMatrixClass alloc] initWithFrame: matrixRect mode: NSListModeMatrix prototype: _browserCellPrototype numberOfRows: n - numberOfColumns: 1]; + numberOfColumns: 1] + autorelease]; [matrix setAllowsEmptySelection: _allowsEmptySelection]; if (!_allowsMultipleSelection) [matrix setMode: NSRadioModeMatrix]; @@ -1506,12 +1515,13 @@ // If we are not reusing matrixes // then delete the old matrix and create a new one [oldm release]; - matrix = [[_browserMatrixClass alloc] + matrix = [[[_browserMatrixClass alloc] initWithFrame: matrixRect mode: NSListModeMatrix prototype: _browserCellPrototype numberOfRows: 0 - numberOfColumns: 0]; + numberOfColumns: 0] + autorelease]; [matrix setAllowsEmptySelection: _allowsEmptySelection]; if (!_allowsMultipleSelection) [matrix setMode: NSRadioModeMatrix]; diff --git a/Source/NSClipView.m b/Source/NSClipView.m index e3cbf2f69..00b3600e8 100644 --- a/Source/NSClipView.m +++ b/Source/NSClipView.m @@ -69,18 +69,21 @@ [_documentView removeFromSuperview]; ASSIGN(_documentView, aView); - [self addSubview:_documentView]; - /* Register to notifications sent by the document view */ - [_documentView setPostsFrameChangedNotifications:YES]; - [_documentView setPostsBoundsChangedNotifications:YES]; + if (_documentView) { + [self addSubview:_documentView]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(viewFrameChanged:) - name:NSViewFrameDidChangeNotification object:_documentView]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(viewBoundsChanged:) - name:NSViewBoundsDidChangeNotification object:_documentView]; + /* Register to notifications sent by the document view */ + [_documentView setPostsFrameChangedNotifications:YES]; + [_documentView setPostsBoundsChangedNotifications:YES]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(viewFrameChanged:) + name:NSViewFrameDidChangeNotification object:_documentView]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(viewBoundsChanged:) + name:NSViewBoundsDidChangeNotification object:_documentView]; + } /* TODO: invoke superview's reflectScrolledClipView:? */ [[self superview] reflectScrolledClipView:self]; diff --git a/Source/NSPopUpButton.m b/Source/NSPopUpButton.m index cce58a163..8f1eeba55 100644 --- a/Source/NSPopUpButton.m +++ b/Source/NSPopUpButton.m @@ -30,6 +30,7 @@ #include #include #include +#include // // NSPopUpButton implementation @@ -108,35 +109,64 @@ // - (void)addItemWithTitle:(NSString *)title { - [list_items addObject:title]; + id item = [[[NSMenu cellClass] new] autorelease]; + + [list_items addObject:item]; + [item setTitle:title]; [self synchronizeTitleAndSelectedItem]; } - (void)addItemsWithTitles:(NSArray *)itemTitles -{} +{ + int i, count = [itemTitles count]; + + for (i = 0; i < count; i++) + [self addItemWithTitle:[itemTitles objectAtIndex:i]]; +} - (void)insertItemWithTitle:(NSString *)title atIndex:(unsigned int)index -{} +{ + id item = [[[NSMenu cellClass] new] autorelease]; + + [list_items insertObject:item atIndex:index]; + [item setTitle:title]; + [self synchronizeTitleAndSelectedItem]; +} // // Removing Items // - (void)removeAllItems -{} +{ + [list_items removeAllObjects]; +} - (void)removeItemWithTitle:(NSString *)title -{} +{ + int index = [self indexOfItemWithTitle:title]; + + if (index != NSNotFound) + [list_items removeObjectAtIndex:index]; +} - (void)removeItemAtIndex:(int)index -{} +{ + [list_items removeObjectAtIndex:index]; +} // // Querying the NSPopUpButton about Its Items // - (int)indexOfItemWithTitle:(NSString *)title { - return 0; + int i, count = [list_items count]; + + for (i = 0; i < count; i++) + if ([[[list_items objectAtIndex:i] title] isEqual:title]) + return i; + + return NSNotFound; } - (int)indexOfSelectedItem @@ -149,32 +179,42 @@ return [list_items count]; } -- (NSMenuCell *)itemAtIndex:(int)index +- (id )itemAtIndex:(int)index { - return nil; + return [list_items objectAtIndex:index]; } -- (NSMatrix *)itemMatrix -{ - return nil; -} - -- (NSString *)itemTitleAtIndex:(int)index -{ - return nil; -} - -- (NSArray *)itemTitles +- (NSArray *)itemArray { return list_items; } -- (NSMenuCell *)itemWithTitle:(NSString *)title +- (NSString *)itemTitleAtIndex:(int)index { + return [[list_items objectAtIndex:index] title]; +} + +- (NSArray *)itemTitles +{ + int i, count = [list_items count]; + NSMutableArray* titles = [NSMutableArray arrayWithCapacity:count]; + + for (i = 0; i < count; i++) + [titles addObject:[[list_items objectAtIndex:i] title]]; + + return titles; +} + +- (id )itemWithTitle:(NSString *)title +{ + int index = [self indexOfItemWithTitle:title]; + + if (index != NSNotFound) + return [list_items objectAtIndex:index]; return nil; } -- (NSMenuCell *)lastItem +- (id )lastItem { if ([list_items count]) return [list_items lastObject]; @@ -182,17 +222,14 @@ return nil; } -- (NSMenuCell *)selectedItem +- (id )selectedItem { - return nil; + return [list_items objectAtIndex:selected_item]; } - (NSString *)titleOfSelectedItem { - if ([list_items count]) - return [list_items objectAtIndex:selected_item]; - else - return nil; + return [[self selectedItem] title]; } // @@ -218,7 +255,12 @@ } - (void)selectItemWithTitle:(NSString *)title -{} +{ + int index = [self indexOfItemWithTitle:title]; + + if (index != NSNotFound) + [self selectItemAtIndex:index]; +} - (void)setFont:(NSFont *)fontObject {} diff --git a/Source/NSTextView.m b/Source/NSTextView.m new file mode 100644 index 000000000..0222ded87 --- /dev/null +++ b/Source/NSTextView.m @@ -0,0 +1,29 @@ +/* + NSTextView.m + + Copyright (C) 1996 Free Software Foundation, Inc. + + Author: Ovidiu Predescu + Date: January 1998 + + 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 Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#import + +@implementation NSTextView +@end diff --git a/Testing/.cvsignore b/Testing/.cvsignore index f3c7a7c5d..28d9a18c6 100644 --- a/Testing/.cvsignore +++ b/Testing/.cvsignore @@ -1 +1,2 @@ Makefile +*obj