/* Gorm.m * * Copyright (C) 1999 Free Software Foundation, Inc. * * Author: Richard Frith-Macdonald * Date: 1999 * * This file is part of GNUstep. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "GormPrivate.h" @class InfoPanel; @implementation Gorm - (id) activeDocument { return (id)[documents lastObject]; } - (BOOL) applicationShouldTerminate: (NSApplication*)sender { NSEnumerator *enumerator = [documents objectEnumerator]; GormDocument *doc; BOOL edited = NO; while ((doc = [enumerator nextObject]) != nil) { if ([[[doc resourcesManager] window] isDocumentEdited] == YES) { edited = YES; } } if (edited == YES) { int result; result = NSRunAlertPanel(NULL, @"There are edited windows", @"Review Unsaved", @"Cancel", @"Quit Anyway"); if (result == NSAlertAlternateReturn) { return NO; } else if (result != NSAlertOtherReturn) { enumerator = [documents objectEnumerator]; while ((doc = [enumerator nextObject]) != nil) { NSWindow *win = [[doc resourcesManager] window]; if ([win isDocumentEdited] == YES) { [win performClose: self]; } } } } return YES; } - (void) dealloc { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver: self]; RELEASE(infoPanel); RELEASE(inspectorsManager); RELEASE(palettesManager); RELEASE(documents); [super dealloc]; } - (id) init { self = [super init]; if (self != nil) { NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; documents = [NSMutableArray new]; [nc addObserver: self selector: @selector(selectionChanged:) name: IBSelectionChangedNotification object: nil]; } return self; } - (GormInspectorsManager*) inspectorsManager { if (inspectorsManager == nil) { inspectorsManager = [GormInspectorsManager new]; } return inspectorsManager; } - (id) makeNewDocument: (id) sender { id doc = [GormDocument new]; [documents addObject: doc]; [doc setDocumentActive: YES]; RELEASE(doc); return doc; } - (id) openDocument: (id) sender { GormDocument *doc = [GormDocument new]; [documents addObject: doc]; RELEASE(doc); if ([doc openDocument: sender] == nil) { [documents removeObjectIdenticalTo: doc]; doc = nil; } else { [doc setDocumentActive: YES]; } return doc; } - (id) openPalette: (id) sender { return [[self palettesManager] openPalette: sender]; } - (GormPalettesManager*) palettesManager { if (palettesManager == nil) { palettesManager = [GormPalettesManager new]; } return palettesManager; } - (id) runInfoPanel: (id) sender { if (infoPanel == nil) { infoPanel = [InfoPanel new]; } [infoPanel orderFront: nil]; return self; } - (id) runGormInspectors: (id) sender { [[[self inspectorsManager] panel] orderFront: nil]; return self; } - (id) runGormPalettes: (id) sender { [[[self palettesManager] panel] orderFront: self]; return self; } - (id) saveAsDocument: (id)sender { return [[documents lastObject] saveAsDocument: sender]; } - (id) saveDocument: (id)sender { return [[documents lastObject] saveDocument: sender]; } - (void) selectionChanged: (NSNotification*)notification { selectionOwner = [notification object]; } - (id) selectionOwner { return selectionOwner; } - (id) selectedObject { return [[selectionOwner selection] lastObject]; } @end int main(void) { NSAutoreleasePool *pool; NSMenu *aMenu; NSMenu *mainMenu; NSMenu *windowsMenu; NSMenuItem *menuItem; pool = [NSAutoreleasePool new]; initialize_gnustep_backend (); /* * Install an instance of Gorm as the application so that the app * can conform to the IB protocol */ NSApp = [Gorm new]; mainMenu = [[NSMenu alloc] initWithTitle: @"Gorm"]; /* * Set up info menu. */ aMenu = [NSMenu new]; [aMenu addItemWithTitle: @"Info Panel..." action: @selector(runInfoPanel:) keyEquivalent: @""]; [aMenu addItemWithTitle: @"Help..." action: NULL keyEquivalent: @"?"]; menuItem = [mainMenu addItemWithTitle: @"Info" action: NULL keyEquivalent: @""]; [mainMenu setSubmenu: aMenu forItem: menuItem]; RELEASE(aMenu); /* * Set up document menu. */ aMenu = [NSMenu new]; [aMenu addItemWithTitle: @"Open..." action: @selector(openDocument:) keyEquivalent: @"o"]; [aMenu addItemWithTitle: @"New Application" action: @selector(makeNewDocument:) keyEquivalent: @"n"]; [aMenu addItemWithTitle: @"Save" action: @selector(saveDocument:) keyEquivalent: @"s"]; [aMenu addItemWithTitle: @"Save As..." action: @selector(saveAsDocument:) keyEquivalent: @"S"]; menuItem = [mainMenu addItemWithTitle: @"Document" action: NULL keyEquivalent: @""]; [mainMenu setSubmenu: aMenu forItem: menuItem]; RELEASE(aMenu); /* * Set up tools menu. */ aMenu = [NSMenu new]; [aMenu addItemWithTitle: @"Inspector..." action: @selector(runGormInspectors:) keyEquivalent: @""]; [aMenu addItemWithTitle: @"Palettes..." action: @selector(runGormPalettes:) keyEquivalent: @""]; [aMenu addItemWithTitle: @"Load Palette..." action: @selector(openPalette:) keyEquivalent: @""]; menuItem = [mainMenu addItemWithTitle: @"Tools" action: NULL keyEquivalent: @""]; [mainMenu setSubmenu: aMenu forItem: menuItem]; RELEASE(aMenu); /* * Set up Windows menu */ windowsMenu = [NSMenu new]; [windowsMenu addItemWithTitle: @"Arrange" action: @selector(arrangeInFront:) keyEquivalent: @""]; [windowsMenu addItemWithTitle: @"Miniaturize" action: @selector(performMiniaturize:) keyEquivalent: @"m"]; [windowsMenu addItemWithTitle: @"Close" action: @selector(performClose:) keyEquivalent: @"w"]; menuItem = [mainMenu addItemWithTitle: @"Windows" action: NULL keyEquivalent: @""]; [mainMenu setSubmenu: windowsMenu forItem: menuItem]; RELEASE(windowsMenu); [mainMenu addItemWithTitle: @"Quit" action: @selector(terminate:) keyEquivalent: @"q"]; [NSApp setMainMenu: mainMenu]; [NSApp setWindowsMenu: windowsMenu]; [mainMenu display]; { extern BOOL NSImageDoesCaching; extern BOOL NSImageForceCaching; NSImageDoesCaching = YES; //[NSObject enableDoubleReleaseCheck: YES]; } /* * Set Gorm up as its own delegate */ [NSApp setDelegate: NSApp]; [NSApp run]; [pool release]; return 0; }