This is CNAppManager.m in view mode; [Download] [Up]
/* CEAppManager.m * * This is the basic controller of the App. It manages all big abstraction * tasks for the panels, documents and connections to the outside. * * For interface-info see the header file. The comments in this file mostly * cover only the real implementation details. * * Written by: Thomas Engel * Created: 23.10.1993 (Copyleft) * Last modified: 07.05.1994 */ #import "CNAppManager.h" #import "Text_more.h" #import "Application_ext.h" #import <misckit/MiscString.h> #import <misckit/MiscTime.h> #import <misckit/MiscAppDefaults.h> #import <misckit/MiscAppExtensions.h> @implementation CNAppManager - appWillInit:sender { // This is the init part we need to pass before we get the messages that // we have to open some files. // To be able to init a class we need the have the Preferences, // preferences = [CNPreferencesManager new]; tempPb = [Pasteboard newName:"CNTempPb"]; _notesLoaded = NO; newPastes = 0; [newPasteCountField setIntValue:newPastes]; [notesWindow setFrameAutosaveName:"NotesWindow"]; _firstActivation = YES; [self openDefaults]; return self; } - appDidInit:sender { // This is some kind of late init. These object are need for working but // not for reading the classes or having a class initialized. [[NXApp appListener] setServicesDelegate:self]; // Opening with nil won't cause the window to open if it should not.. [self open:nil]; [notesWindow setMiniwindowImage:[NXImage findImageNamed:"NoteIcon"]]; return self; } - (int)app:sender openFile:(const char *)path type:(const char *)type { // This method is performed whenever a user opens a document from the // Workspace Manager. // We use our default file open method with some default params. return NO; } - (BOOL)appAcceptsAnotherFile:sender { // Inform the workspace that we can open multiple files. return NO; } - appDidBecomeActive:sender { if( _firstActivation ) { _firstActivation = NO; if( [NXApp didAutolaunch] ) { [NXApp hide:self]; return self; } } [notesWindow makeKeyAndOrderFront:self]; return self; } - appWillTerminate:sender { // Now lets see what we have...ask every window what is going on. BOOL ready; int result; if( !_isEscaping ) { [self save:self]; [self saveDefaults]; } else { ready = NO; while( !ready ) { result = NXRunAlertPanel( "Quit", "There are usaved notes.", "Review Notes", "Quit Anyway", "Cancel" ); if( result == NX_ALERTOTHER ) return nil; ready = YES; if( result == NX_ALERTDEFAULT ) [notesWindow makeKeyAndOrderFront:self]; } } return self; } - app:sender powerOffIn:(int)ms andSave:(int)aFlag { // Now we might not be on the save side here !! // There is no guarateen to write the data down fast enough. // BUG: We should extend power off time here but seems like it is working. [self save:self]; [self saveDefaults]; return self; } - powerOff:(NXEvent *)theEvent { // Now we might not be on the save side here !! // There is no guarateen to write the data down fast enough. // We can't extend power off time here. [self save:self]; [self saveDefaults]; return self; } - showInfo:sender { return self; } - showPreferences:sender { return self; } - preferences { return self; } - openDefaults { id aPath; // Well now this is a little rough....maybe we should search for the files // inside the ~/.AppInfo or even *Library/ClassEditor sections..anyway. // Now the Text-object has a bug that prevendts us from usign the prede- // dinfen Template that is inside the preferences NIB part. // So we have to load it from the appp bundle. aPath = [MiscString newWithString:"~/Library/ClipNotes/NoteTemplate.rtfd"]; [aPath replaceTildeWithHome]; if( [aPath doesExistInFileSystem] ) [notesTemplateText openRTFDFrom:[aPath stringValue]]; else { [aPath setStringValue:"/LocalLibrary/ClipNotes/NoteTemplate.rtfd"]; [aPath cat:"/NoteTemplate.rtfd"]; if( [aPath doesExistInFileSystem] ) [notesTemplateText openRTFDFrom:[aPath stringValue]]; else { [aPath setStringValue:[NXApp appDirectory]]; [aPath cat:"/NoteTemplate.rtfd"]; if( [aPath doesExistInFileSystem] ) [notesTemplateText openRTFDFrom:[aPath stringValue]]; } } [aPath free]; [notesWindow setFrameUsingName:[notesWindow frameAutosaveName]]; // Now lets get the other..simpler defaults.. if( [NXApp knowsDefaultValue:"EnableService"] ) [enableServicesSwitch setState: [NXApp defaultBoolValue:"EnableService"]]; if( [NXApp knowsDefaultValue:"SaveWithBackup"] ) [saveWithBackupSwitch setState: [NXApp defaultBoolValue:"SaveWithBackup"]]; if( [NXApp knowsDefaultValue:"ClipNotesPath"] ) [notesPathField setStringValue:[NXApp defaultValue:"ClipNotesPath"]]; if( [NXApp knowsDefaultValue:"ReplaceSelection"] ) [replaceSelectionSwitch setState: [NXApp defaultBoolValue:"ReplaceSelection"]]; if( [NXApp knowsDefaultValue:"InsertPosition"] ) [notesCreationModeSwitch selectCellWithTag: [NXApp defaultIntValue:"InsertPosition"]]; if( [NXApp knowsDefaultValue:"Timeformat"] ) [timeFormatField setStringValue:[NXApp defaultValue:"Timeformat"]]; if( [NXApp knowsDefaultValue:"Dateformat"] ) [dateFormatField setStringValue:[NXApp defaultValue:"Dateformat"]]; return self; } - saveDefaults { // Write down the defaults. id aPath; if( _templateChanged ) { aPath = [MiscString newWithString: "~/Library/ClipNotes/NoteTemplate.rtfd"]; [aPath replaceTildeWithHome]; [notesTemplateText saveRTFDTo:[aPath stringValue] removeBackup:YES errorHandler:nil]; [aPath free]; _templateChanged = NO; } // Now lets get the other..simpler defaults.. [NXApp setDefault:"EnableService" toBool:[enableServicesSwitch state]]; [NXApp setDefault:"SaveWithBackup" toBool:[saveWithBackupSwitch state]]; [NXApp setDefault:"ClipNotesPath" to:[notesPathField stringValue]]; [NXApp setDefault:"ReplaceSelection" toBool: [replaceSelectionSwitch state]]; [NXApp setDefault:"InsertPosition" toInt: [[notesCreationModeSwitch selectedCell] tag]]; [NXApp setDefault:"Timeformat" to:[timeFormatField stringValue]]; [NXApp setDefault:"Dateformat" to:[dateFormatField stringValue]]; return self; } - new:sender { // All we do here is to put some default on the clip area. // Well by default we wnat to see the notes in this case... [self open:self]; [tempNoteText selectAll:self]; [tempNoteText replaceSel:"My Note:"]; [self _pasteIt]; return self; } - open:sender { id path; // If the document was edited we should ask first ! if( _notesLoaded == NO ) { path = [[MiscString alloc] initDirectory:[notesPathField stringValue] file:"ClipNotes.rtfd"]; [path replaceTildeWithHome]; [notesText openRTFDFrom:[path stringValue]]; [path free]; _notesLoaded = YES; } // If the notes are loaded we asume that this was triggered by the menu // item and the user wants to see the entries. So just show the window. // If the sender is nil we won't bring up the else if( _notesLoaded || sender != nil ) [notesWindow makeKeyAndOrderFront:self]; return self; } - save:sender { id path; BOOL removeBackup; if( [notesWindow isDocEdited] == NO ) return self; // Now lets see if we need a backup or not.. removeBackup = NO; if( [saveWithBackupSwitch state] == NO ) removeBackup = YES; path = [[MiscString alloc] initDirectory:[notesPathField stringValue] file:"ClipNotes.rtfd"]; [path replaceTildeWithHome]; [notesText saveRTFDTo:[path stringValue] removeBackup:removeBackup errorHandler:nil]; [path free]; newPastes = 0; [newPasteCountField setIntValue:newPastes]; [notesWindow setDocEdited:NO]; // Well somehow the notes are loaded now...at least the stored don't // differ from what we have. _notesLoaded = YES; return self; } - revert:sender { if( [notesWindow isDocEdited] == NO ) return [self open:self]; // Oh...there really is something to revert...not only topping the // windows. if( NXRunAlertPanel( "Revert", "Do you want the revert changes to the saved ClipNotes?", "Revert", "Cancel", NULL ) == NX_ALERTDEFAULT ) { _notesLoaded = NO; [self open:self]; } return self; } - print:sender { [notesText printPSCode:sender]; return self; } - escape:sender { _isEscaping = YES; [NXApp terminate:self]; return self; } - copyNotesTemplate { // All we do here is to copy the docu template to the pasteboard. // Will corrupt the pasteboard ! [notesTemplateText selectAll:self]; [notesTemplateText copyTo:tempPb]; [composeText selectAll:self]; [composeText pasteFrom:tempPb]; [notesTemplateText selectNull]; return self; } - pasteAsNote:sender { // All we do here is to paste the current pasteboard contents into the // temp area and trigger a notes pasting operation (_pasteIt ) [tempNoteText selectAll:self]; [tempNoteText paste:self]; [self _pasteIt]; return self; } - _pasteIt { // We will paste the text that is inside the tempArea. id aTime; [self copyNotesTemplate]; // Now lets update the stuff that is inside the compose area to // match our needs. [composeText setSel:0 :0]; if( [composeText findText:"<App>" ignoreCase:NO backwards:NO wrap:NO] ) { if( [NXApp isActive] ) [composeText replaceSel:"Pasteboard"]; else [composeText replaceSel:"SomeApp"]; } [composeText setSel:0 :0]; if( [composeText findText:"<Time>" ignoreCase:NO backwards:NO wrap:NO] ) { aTime = [[MiscTime alloc] initWithCurrentTime]; [composeText replaceSel:[aTime format:[timeFormatField stringValue]]]; [aTime free]; } [composeText setSel:0 :0]; if( [composeText findText:"<Date>" ignoreCase:NO backwards:NO wrap:NO] ) { aTime = [[MiscTime alloc] initWithCurrentTime]; [composeText replaceSel:[aTime format:[dateFormatField stringValue]]]; [aTime free]; } [tempNoteText selectAll:self]; [tempNoteText copyTo:tempPb]; [composeText setSel:0 :0]; if( [composeText findText:"<Note>" ignoreCase:NO backwards:NO wrap:NO] ) [composeText pasteFrom:tempPb]; [composeText selectAll:self]; [composeText copyTo:tempPb]; // Now depending on where we should paste the note we will set our // position. if( [replaceSelectionSwitch state] == NO || [notesText hasEmptySelection] ) { if( [[notesCreationModeSwitch selectedCell] tag] == 1 ) [notesText setSel:0 :0]; else [notesText setSel:[notesText textLength] :[notesText textLength]]; } [notesText pasteFrom:tempPb]; // In every case we will deselect it all afterwards. This way we can // prevent a replaceSelection setting to remove all our last clips. ! [notesText setSel:0 :0]; newPastes++; [newPasteCountField setIntValue:newPastes]; [notesWindow setDocEdited:YES]; return self; } - note:(id)pb userData:(const char *)udata error:(char **)ermsg { [tempNoteText selectAll:self]; [tempNoteText pasteFrom:pb]; [self _pasteIt]; return self; } - textDidChange:sender { if( sender == notesTemplateText ) _templateChanged = YES; else if( sender == notesText ) [notesWindow setDocEdited:YES]; return self; } @end /* * History: 13.01.95 Bla. * * * Bugs: No bugs and birds seen.... */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.