I fixed this issue and ran your test. Take a look and see if it works for you. Thanks again for your help.
Gregory Casamento GNUstep Lead Developer / Black Lotus, Principal Consultant http://www.gnustep.org - http://heronsperch.blogspot.com https://www.patreon.com/bePatron?u=352392 - Become a Patron https://www.openhub.net/languages/objective_c https://www.gofundme.com/f/cacao-linux-a-gnustep-reference-implementation On Thu, Aug 29, 2024 at 06:50 Sebastian Reitenbach < [email protected]> wrote: > On Thursday, August 29, 2024 12:11 CEST, "H. Nikolaus Schaller" < > [email protected]> wrote: > > > Hi, > > applicationDidFinishLaunching is called after loading the app (but not > after loading documents). > > To do the same after loading a document you must use an awakeFromNib > method in your Document class. > > > > The reason is as you an see from the log that your characterWindow isn't > connected yet to the window. > > indeed, moving that into the awakeFromNib: > > [characterWindow makeKeyAndOrderFront: self]; > NSLog(@"awakeFromNib: the key Window: %@", [[NSApplication > sharedApplication] keyWindow]); > > make the window pop up. Unfortunately also on startup of the application, > whereas I only want it to be > around once I either load or create a new document. Something to figure > out. > > When I edit the document to edit the name of the character, I have this: > > - (IBAction)nameChanged:(id)sender { > NSString *newName = [self.name stringValue]; > [self.character setValue:newName forKey:@"name"]; > > NSLog(@"calling updateChangeCount!!!"); > [self updateChangeCount:NSChangeDone]; > NSLog(@"isDocumentEdited? %i", [super isDocumentEdited]); > [self checkIfWindowIsKey]; // Check if the window is key > } > > - (void)checkIfWindowIsKey { > // commented out approach doesn't work only calling my window directly as > below > // if ([[self windowForSheet] isKeyWindow]) { > if ([characterWindow isKeyWindow]) { > NSLog(@"The document window is the key window."); > } else { > NSLog(@"The document window is not the key window."); > } > } > > creates output: > > Character's name changed to: Bula > calling updateChangeCount!!! > isDocumentEdited? 1 > The document window is the key window. > > However, the save, save as, .... menu items, they all stay grayed out. > > when I override the > - (BOOL)isDocumentEdited { > return YES; > } > > then the "save all" menu item is active, and I can save the file. But > "save", save as... stay gray. > Somehow, I'm not properly marking the document as "dirty" ? > > I guess probably something similarly simple and stupid ;) > > thanks, > Sebastian > > > > > BR, > > Nikolaus > > > > > Am 29.08.2024 um 14:34 schrieb Sebastian Reitenbach < > [email protected]>: > > > > > > Hi Nikolaus, > > > > > > On Thursday, August 29, 2024 09:54 CEST, "H. Nikolaus Schaller" < > [email protected]> wrote: > > > > > >> Hi, > > >> there may be a completely different approach: > > >> > > >> - add an IBOutlet (e.g. called mainWindow) to your NSDocument for > your NSWindow and connect it. > > >> - then you get a pointer mainWindow that can be accessed in > -awakeFromNib; for your makeKeyAndOrderFront: > > >> > > >> This avoids scanning the top level objects. > > > > > > thank you. That seems to do the trick for the simple test App I > created. After creating IBOutlet and wiring it up in Gorm, I added the > following at the end of applicationDidFinishLaunching: > > > > > > [mainWindow makeKeyAndOrderFront: self]; > > > NSLog(@"the key Window: %@", [[NSApplication sharedApplication] > keyWindow]); > > > > > > which spits out: > > > 2024-08-29 11:49:14.793 Test5[72122:2615662661832] the key Window: > <NSWindow: 0x2609f549008>Number: 4 Title: Test5 Window > > > > > > However, that same approach doesn't work in my Document based app. I > read through David's "Cocoa Programming, Developers Handbook", and now I'm > working with ChatGPT as my mentor here, since never done that before, and > don't have any Mac programming experience ;) > > > What I told ChatGPT I want to do: MVC Document based app, that should > have a central .gorm file for menu and other central stuff, and then .gorm > files for each of different types of documents to be handled. > > > > > > Now I ended up with: > > > * central .gorm file containing my menu, connected to an AppDelegate, > that loads the Gorm file. > > > * a DocumentController class (NSDocumentController subclass), which > based on what types of documents I want to create new, calls out one of my > two Document classes (NSDocument subclasses). To each of these NSDocument > subclasses, I've separate .gorm files. > > > > > > Opening the Window with your approach works so far that the window > opens, but it doesn't become the key window: > > > > > > With this in the makeWindowControllers method: > > > > > > [characterWindow makeKeyAndOrderFront:self]; > > > NSLog(@"THE KEY WINDOW: %@", [[NSApplication sharedApplication] > keyWindow]); > > > > > > it opens the Window, but logs: > > > THE KEY WINDOW: (null) > > > > > > With above output, it's the only window (besides the menu), that the > application has, and it takes > > > input, but I wonder why the application doesn't even have a keyWindow > at all? > > > I thought at least one should always be Key, and with that > firstResponder, but may have misunderstood? > > > > > > ChatGPT insists on going through the topLevelObjects. But now, I'm not > sure, even if that works, > > > if it then would make the window key? > > > > > > Sebastian > > >> > > >> Hope this helps, > > >> Nikolaus > > >> > > >> > > >>> Am 29.08.2024 um 12:06 schrieb Sebastian Reitenbach < > [email protected]>: > > >>> > > >>> Hi, > > >>> > > >>> I'm trying to create a document based app with ProjectCenter and > Gorm, following different advices, > > >>> it boils down to use NSBundles loadNibNamed: owner: topLevelObjects: > > >>> Then afterward, find the window in the topLevelObjects, that I want > to have my key window, and make it makeKeyAndOrderFront: > > >>> > > >>> Whatever I do, the topLevelObjects I get returned are empty. > > >>> > > >>> To demonstrate, I just created a New Application in ProjectCenter, > opened the Interface in Gorm, and > > >>> dragged a NSWindow into the Objects. Example code here: > https://github.com/buzzdeee/testTopLevelObjects > > >>> > > >>> Then added this to AppController.m applicationDidFinishLaunching: > > >>> > > >>> NSLog(@"here in AppController applicationDidFinishLaunching..."); > > >>> > > >>> NSBundle *mainBundle = [NSBundle mainBundle]; > > >>> NSArray *topLevelObjects = nil; > > >>> NSLog(@"going to load .gorm file"); > > >>> BOOL success = [mainBundle loadNibNamed:@"Test5" owner:self > topLevelObjects:&topLevelObjects]; > > >>> NSLog(@"topLevelObjects: %@", topLevelObjects); > > >>> if (success) { > > >>> NSLog(@"Successfully loaded Test5.gorm"); > > >>> > > >>> if (topLevelObjects == nil || [topLevelObjects count] == 0) { > > >>> NSLog(@"No top-level objects were loaded."); > > >>> } else { > > >>> NSLog(@"Top-level objects: %@", topLevelObjects); > > >>> for (id obj in topLevelObjects) { > > >>> NSLog(@"Loaded object: %@", NSStringFromClass([obj > class])); > > >>> } > > >>> } > > >>> } else { > > >>> NSLog(@"Failed to load Test5.gorm"); > > >>> } > > >>> } > > >>> > > >>> The output is: > > >>> 2024-08-29 09:20:30.103 Test5[81465:10651290713480] here in > AppController applicationDidFinishLaunching... > > >>> 2024-08-29 09:20:30.104 Test5[81465:10651290713480] going to load > .gorm file > > >>> 2024-08-29 09:20:30.113 Test5[81465:10651290713480] topLevelObjects: > (null) > > >>> 2024-08-29 09:20:30.113 Test5[81465:10651290713480] Successfully > loaded Test5.gorm > > >>> 2024-08-29 09:20:30.113 Test5[81465:10651290713480] No top-level > objects were loaded. > > >>> > > >>> When in Gorm, I enable "Visible at launch" for the NSWindow object, > output changes to: > > >>> > > >>> 2024-08-29 09:13:57.990 Test5[1172:4346915151048] here in > AppController applicationDidFinishLaunching... > > >>> 2024-08-29 09:13:57.990 Test5[1172:4346915151048] going to load > .gorm file > > >>> 2024-08-29 09:13:57.998 Test5[1172:4346915151048] Exception occurred > while loading model: Index 3 is out of range 3 (in 'objectAtIndex:') > > >>> 2024-08-29 09:13:57.998 Test5[1172:4346915151048] Failed to load Gorm > > >>> 2024-08-29 09:13:57.998 Test5[1172:4346915151048] topLevelObjects: > (null) > > >>> 2024-08-29 09:13:57.998 Test5[1172:4346915151048] Failed to load > Test5.gorm > > >>> > > >>> However, the .gorm file still loads, and I get to see the menu and > window. But I guess that is because, NSMainNibFile = "Test5.gorm"; in my > Info.plist. > > >>> > > >>> In any case, shouldn't there be some topLevelObjects in the .gorm > file? > > >>> > > >>> latest gnustep-make/base/gui/back/objc2/ProjectCenter releases, > Gorm-1.3.1 > > >>> > > >>> thanks, > > >>> Sebastian > > >>> > > >>> > > >> > > > > > > > >
