This is MHDocConverter.m in view mode; [Download] [Up]
/* -------------------------------------------------------------------------- Class: MHDocConverter Version: 0.1 File: MHDocConverter.m Written by: Thomas Engel Created: 17.05.1995 (Copyleft) Last modified: 17.05.1995 Note: For a detailed description please read the class documentation. ------------------------------------------------------------------------- */ #import "MHDocConverter.h" #import "MHFhGL3DecoderTool.h" #import "MHFhGL3EncoderTool.h" #import "MHFileInfoTool.h" #import "MHStdErrorTool.h" #import <misckit/MiscString.h> #import <misckit/MiscShell.h> #import <misckit/MiscSwapView.h> #import <misckit/MiscIconWell.h> @implementation MHDocConverter - init { return [self initFromFile:""]; } - initFromFile:(const char *)path { self = [super init]; if( !self ) return self; // OK. We really are an object...here we go with our init. if( !window ) { if( [NXApp loadNibSection:"DocConverter.nib" owner:self] == nil ) NXRunAlertPanel( NULL, "Couldn't load DocConverter.nib", "OK", NULL, NULL ); } // Now lets prepare the tool list shellTool = [MHStdErrorTool new]; registeredTools = [List new]; [registeredTools addObject:[MHFhGL3DecoderTool new]]; [registeredTools addObject:[MHFhGL3EncoderTool new]]; [registeredTools addObject:[MHFileInfoTool new]]; [registeredTools addObject:shellTool]; // Lets setup the window [window setFrameAutosaveName:"DocumentWindow"]; [window setFrameUsingName:[window frameAutosaveName]]; [window setMiniwindowImage:[NXImage findImageNamed:"Ring"]]; filename = [MiscString new]; outputFilename = [MiscString new]; outputExtension = nil; [self setFilename:(char *)path]; return self; } - free { // No need to free the shellTool...it is part of the registerd tools. [[registeredTools freeObjects] free]; [filename free]; [outputFilename free]; if( outputExtension ) [outputExtension free]; return [super free]; } - setFilename:(char *)path { // This method should be used to change a converters file via the // program. This is the reason why we consider it is good to make the // window key in the same turn. id aString; aString = [MiscString newWithString:path]; [self takeFilenameFrom:aString]; [aString free]; [window makeKeyAndOrderFront:self]; return self; } - checkFiles { // This gets called when we might have lost the source file due to // A filesystem change. [self _updateOutputDropView]; // Well we will check if the file does exist or not. If it does not // We will bring up an Error. if( _skipAutoFileCheck == NO && ![filename doesExistInFileSystem] ) { NXRunAlertPanel( NULL, "The source file does not exist anymore! Be careful...using a filter tool might have strange effects under these conditions.", "Ooops", NULL, NULL ); // We will remove the current entry...this makes shure that the // drop view really updates the visible represenation. [sourceDropView setImage:[NXImage findImageNamed:"NotExistingFile"]]; // But now lets remember that we did the check ! // otherwise we won't get out of this loop anymore. _skipAutoFileCheck = YES; } // BUG: A real File too should disable all the filter Buttons! // Yes I know that. But its a hack. return self; } - takeFilenameFrom:sender { int i; int count; id aTool; id theCell; // If we are working where is not way to change the path ! if( [self isProcessing] ) { NXRunAlertPanel( NULL, "Can't change Sourcepath. We have "\ "a process running on the current files!", "OK", NULL, NULL ); return self; } // BUG: ! // We should checki if this path is a valid input. // This should happen even during the drop ! // Lets be sure that we will check the new file for existance again ! _skipAutoFileCheck = NO; [filename setStringValue:[sender stringValue]]; // Now update them all. We will for the output to go to the same // folder as the source. [sourceDropView setStringValue:[filename stringValue]]; [sourcePathText setStringValue:[filename stringValue]]; [outputPath free]; outputPath = nil; [self _updateOutputFilename]; [self _updateOutputDropView]; // So lets init the list of useful tools. If might have changed. [toolMatrix renewRows:1 cols:0]; count = 0; for( i=0; i<[registeredTools count]; i++ ) { aTool = [registeredTools objectAt:i]; if( [aTool canProcess:filename for:self] ) { [toolMatrix addCol]; theCell = [toolMatrix cellAt:0 :count]; [theCell setImage:[aTool image]]; // First set the trigger and then set the swapView. // settng the swapView requires a valid trigger. [aTool setTrigger:theCell]; [aTool setSwapView:swapView]; count++; } } [toolMatrix sizeToCells]; // BUG NeXT: // Changing the selection like this seems to cause a ugly flicker on the // screen ..two cells are seletced until we do the full redraw. // This is strange because selectCell should desel the current sel first // AND redisplay it ?? [toolMatrix selectCellAt:0 :0]; [toolMatrix display]; // Be sure that the swapView shows the right contents...just trigger and // virtual swap action. [swapView swapContentView:toolMatrix]; return self; } - filename { return filename; } - outputFilename { return outputFilename; } - takeOutputFilenameFrom:sender { id aString; aString = [MiscString newWithString:[sender stringValue]]; if( [aString isFileOfType:Misc_Directory] ) { if( outputPath == nil ) outputPath = [MiscString new]; [outputPath setStringValue:[aString stringValue]]; } [aString free]; [self _updateOutputFilename]; [self _updateOutputDropView]; return self; } - _updateOutputDropView { // The final action is to sync the dropWell with the current path. // If it is an existing file then we will show it..otherwise we won't. if( [outputFilename isFileOfType:Misc_PlainFile] ) [outputDropView setStringValue:[outputFilename stringValue]]; else { [outputDropView setStringValue:""]; if( outputExtension != nil && [outputExtension isKindOf:[NXImage class]] ) [outputDropView setImage:[outputExtension copy]]; } // NOTE: This could be improved so that a target dir different from the // original dir is display also. return self; } - _updateOutputFilename { id outname; id basename; if( outputExtension != nil && [outputExtension isKindOf:[MiscString class]] ) { basename = [filename fileBasename]; if( outputPath != nil ) outname = [outputPath copy]; else outname = [filename pathName]; [outname addChar:[MiscString pathSeparator]]; [outname concatenate:basename]; [basename free]; [outname cat:"."]; [outname concatenate:outputExtension]; [outputFilename takeStringValue:outname]; [outname free]; } else [outputFilename setStringValue:""]; [outputPathText setStringValue:[outputFilename stringValue]]; return self; } - setOutputExtension:anObject { if( outputExtension ) [outputExtension free]; outputExtension = anObject; // Now force an update of the output filename... [self _updateOutputFilename]; [self _updateOutputDropView]; return self; } - sharedShell { return [(MHStdErrorTool *)shellTool shell]; } - (BOOL)isProcessing { if( activeTool ) return YES; return NO; } - windowDidBecomeKey:sender { // As the windows delegate we will tkae care of change which happened // during the last time. [self checkFiles]; return self; } - toolWillStartProcessing:sender { int result; if( activeTool != nil ) return nil; // Lets check if we are bound to overwrite an existing file. if( [outputFilename emptyString] == NO && [outputFilename doesExistInFileSystem] ) { result = NXRunAlertPanel( "Process", "The file %s already exists. Overwrite it?", "Replace", "Cancel", NULL, [outputFilename stringValue] ); if( result != NX_ALERTDEFAULT ) return nil; } activeTool = sender; [window setTitle:"MPEG L3 Converter ¼ processing"]; [sourceDropView setAllowDestinationDragging:NO]; [outputDropView setAllowDestinationDragging:NO]; return self; } - toolDidStopProcessing:sender { if( activeTool == sender ) { [window setTitle:"MPEG L3 Converter"]; activeTool = nil; [sourceDropView setAllowDestinationDragging:YES]; [outputDropView setAllowDestinationDragging:YES]; } // If it is the shellTool the this means that we can stop the currently // active process. else if( sender == shellTool ) { [activeTool stopProcessing:self]; } // Lets check the files. It is quite obvious that something has changed. [self checkFiles]; return self; } @end /* Known Bugs: Dropping Multiple Files does not work properly. The IconWell should discourage that somehow. At least we get our strange Alert. */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.