This is Controller.m in view mode; [Download] [Up]
#import <appkit/appkit.h> #import "Controller.h" #import "PhotoWinProcs.h" #import "ImageView.h" #import "Overviews.subproj/OV_Window.h" #import "Photo_CD.subproj/photoCD_Rdr.h" #define IMG 0 #define WIN 1 #define TIFF 0 #define EPS 1 #define JPG 2 @implementation Controller - appDidInit:sender { int tempInt; char tempStr[30]; PrintInfo *pInfo; enum _NXWindowDepth depthPref; NXDefaultsVector defs = { {"GammaCorrection","NeXT"}, {"OpenImageSize","base"}, {"OpenImageResolution","72"}, {"OpenImageWindowDepth","24_Bit_RGB"}, {"OverviewLayout","6x7"}, {"PrintPagination","ScaleToFit"}, {"pCDdebug_MaxOverview","0"}, {"SharpenImage","NO"}, {NULL,NULL} }; // defaults processing NXRegisterDefaults([NXApp appName], defs); globImageSize = is_Base_TAG; if ( NXGetDefaultValue([NXApp appName],"OpenImageSize") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "OpenImageSize")); if ( !strcmp(tempStr, "base/16") ) globImageSize = is_Base16_TAG; if ( !strcmp(tempStr, "base/4") ) globImageSize = is_Base4_TAG; if ( !strcmp(tempStr, "base") ) globImageSize = is_Base_TAG; if ( !strcmp(tempStr, "4base") ) globImageSize = is_4Base_TAG; if ( !strcmp(tempStr, "16base") ) globImageSize = is_16Base_TAG; } globImageResolution = 72; if ( NXGetDefaultValue([NXApp appName],"OpenImageResolution") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "OpenImageResolution")); /* probably should just accept this as an integer, but... */ if ( !strcmp(tempStr, "72") ) globImageResolution = 72; if ( !strcmp(tempStr, "144") ) globImageResolution = 144; if ( !strcmp(tempStr, "150") ) globImageResolution = 150; if ( !strcmp(tempStr, "180") ) globImageResolution = 180; if ( !strcmp(tempStr, "200") ) globImageResolution = 200; if ( !strcmp(tempStr, "300") ) globImageResolution = 300; if ( !strcmp(tempStr, "360") ) globImageResolution = 360; if ( !strcmp(tempStr, "400") ) globImageResolution = 400; } overviewLayoutTag = ov_6x7_TAG; if ( NXGetDefaultValue([NXApp appName],"OverviewLayout") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "OverviewLayout")); if ( ! strcmp(tempStr, "10x2") ) overviewLayoutTag = ov_10x2_TAG; if ( ! strcmp(tempStr, "6x7") ) overviewLayoutTag = ov_6x7_TAG; if ( ! strcmp(tempStr, "2x12") ) overviewLayoutTag = ov_2x12_TAG; } [self loadOverviewNib:overviewLayoutTag andSave:NO]; depthPref = NX_TwentyFourBitRGBDepth; if ( NXGetDefaultValue([NXApp appName],"OpenImageWindowDepth") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "OpenImageWindowDepth")); if ( ! strcmp(tempStr, "DefaultDepth") ) depthPref = NX_DefaultDepth; if ( ! strcmp(tempStr, "2_Bit_Grey") ) depthPref = NX_TwoBitGrayDepth; if ( ! strcmp(tempStr, "8_Bit_Grey") ) depthPref = NX_EightBitGrayDepth; if ( ! strcmp(tempStr, "12_Bit_RGB") ) depthPref = NX_TwelveBitRGBDepth; if ( ! strcmp(tempStr, "24_Bit_RGB") ) depthPref = NX_TwentyFourBitRGBDepth; } [photoWindow setDepthOfNewWindows:depthPref]; globSharpenImage = NO; if ( NXGetDefaultValue([NXApp appName],"SharpenImage") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "SharpenImage")); if ( ! strcmp(tempStr, "Yes") ) globSharpenImage = YES; if ( ! strcmp(tempStr, "YES") ) globSharpenImage = YES; } [pCD_Reader setDoSharp:globSharpenImage]; globNextGamma = YES; if ( NXGetDefaultValue([NXApp appName],"GammaCorrection") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "GammaCorrection")); if ( ! strcmp(tempStr, "2.2") ) globNextGamma = YES; if ( ! strcmp(tempStr, "NeXT") ) globNextGamma = YES; if ( ! strcmp(tempStr, "None") ) globNextGamma = NO; if ( ! strcmp(tempStr, "Linear") ) globNextGamma = NO; } [pCD_Reader setNextGammaCorrection:globNextGamma]; printPagination = NX_FITPAGINATION; if ( NXGetDefaultValue([NXApp appName],"PrintPagination") ) { strcpy( tempStr, NXGetDefaultValue([NXApp appName], "PrintPagination")); if ( ! strcmp(tempStr, "SplitAcrossPages") ) printPagination = NX_AUTOPAGINATION; if ( ! strcmp(tempStr, "ScaleToSinglePage") ) printPagination = NX_FITPAGINATION; if ( ! strcmp(tempStr, "ClipToSinglePage") ) printPagination = NX_CLIPPAGINATION; } // The following preference is useful when debugging, so the // program only reads part of overview.pcd. overviewReadMax = ovImageMax; if ( NXGetDefaultValue([NXApp appName],"pCDdebug_MaxOverview") ) { tempInt = atoi( NXGetDefaultValue([NXApp appName], "pCDdebug_MaxOverview")); if ((tempInt > 0) && (tempInt < ovImageMax)) overviewReadMax = tempInt; } // should printWhich and saveTo be preferences too? printWhich = IMG; // Try to make sure each paste operation gets a window // with a unique title. pasteCounter = 0; sp = [SavePanel new]; [sp setAccessoryView:saveAccessory]; [sp setRequiredFileType:"tiff"]; saveTo = TIFF; pp = [PrintPanel new]; [pp setAccessoryView:printAccessory]; pInfo = [[PrintInfo alloc] init]; [pInfo setVertPagination:printPagination]; [pInfo setHorizPagination:printPagination]; [NXApp setPrintInfo:pInfo]; saveTo = TIFF; // initialize overview panel volumeDir = NULL; for( ovImageCount=0; ovImageCount < ovImageMax; ovImageCount++ ) { ovImageIds[ovImageCount] = nil; } ovImageCount = 0; // Start out by requesting Photo CD volume. // For now, ask for the appropriate directory. [self openPCD:self]; return self; } - (int)nextPasteCounter { // called from ImageView objects by a rather dubious route... return ++pasteCounter; } - showInfoPanel:sender { if ( ! infoPanel ) infoPanel = [NXApp loadNibSection:"pCD_Info.nib" owner:self]; [infoPanel makeKeyAndOrderFront:self]; return self; } - showOverviewWindow:sender { if ( overviewId ) { [overviewId showOverview]; } return self; } - showPrefsPanel:sender { int paginationTag; paginationTag = ppag_ScaleToSinglePage; if ( printPagination == NX_AUTOPAGINATION ) paginationTag = ppag_SplitAcrossPages; if ( printPagination == NX_CLIPPAGINATION ) paginationTag = ppag_ClipToSinglePage; [prefsPaginationMatrix selectCellWithTag:paginationTag ]; [prefsResolutionMatrix selectCellWithTag:globImageResolution ]; [prefsSizeMatrix selectCellWithTag:globImageSize ]; [prefsLayoutMatrix selectCellWithTag:overviewLayoutTag ]; [prefsSharpenSwitch setState:globSharpenImage ]; [prefsNGammaSwitch setState:globNextGamma ]; [prefsPanel makeKeyAndOrderFront:self]; return self; } - setPrefImageResolution:sender { char tempStr[20]; globImageResolution = [sender selectedTag]; sprintf(tempStr, "%d", globImageResolution); NXWriteDefault([NXApp appName], "OpenImageResolution", tempStr); return self; } - setPrefImageSize:sender { globImageSize = [sender selectedTag]; switch ( globImageSize ) { case is_Base16_TAG: NXWriteDefault([NXApp appName], "OpenImageSize", "base/16"); break; case is_Base4_TAG: NXWriteDefault([NXApp appName], "OpenImageSize", "base/4"); break; case is_4Base_TAG: NXWriteDefault([NXApp appName], "OpenImageSize", "4base"); break; case is_16Base_TAG: NXWriteDefault([NXApp appName], "OpenImageSize", "16base"); break; default: NXWriteDefault([NXApp appName], "OpenImageSize", "base"); break; } return self; } - setPrefNextGamma:sender { char tempStr[20]; globNextGamma = [sender state]; if ( globNextGamma ) strcpy(tempStr, "NeXT"); else strcpy(tempStr, "Linear"); NXWriteDefault([NXApp appName], "GammaCorrection", tempStr); [pCD_Reader setNextGammaCorrection:globNextGamma]; return self; } - setPrefOverviewLayout:sender { // if an overview layout is set, close it if ( overviewId ) { [overviewId closeOverviewPanel:self]; overviewId = nil; } [self loadOverviewNib:[sender selectedTag] andSave:YES]; [overviewId setImageArray:&ovImageIds imageCount:ovImageCount]; [self showOverviewWindow:self]; return self; } - setPrefPagination:sender { int pagTag; char strValue[20]; PrintInfo *pInfo; pagTag = [sender selectedTag]; switch ( pagTag ) { case ppag_SplitAcrossPages: printPagination = NX_AUTOPAGINATION; strcpy(strValue, "SplitAcrossPages"); break; case ppag_ClipToSinglePage: printPagination = NX_CLIPPAGINATION; strcpy(strValue, "ClipToSinglePage"); break; default: /* assumed to be ppag_ScaleToSinglePage */ printPagination = NX_FITPAGINATION; strcpy(strValue, "ScaleToSinglePage"); break; } pInfo = [NXApp printInfo]; [pInfo setVertPagination:printPagination]; [pInfo setHorizPagination:printPagination]; NXWriteDefault([NXApp appName], "PrintPagination", strValue); return self; } - setPrefSharpen:sender { char tempStr[20]; globSharpenImage = [sender state]; if ( globSharpenImage ) strcpy(tempStr, "Yes"); else strcpy(tempStr, "No"); NXWriteDefault([NXApp appName], "SharpenImage", tempStr); [pCD_Reader setDoSharp:globSharpenImage]; return self; } /* sample: [self loadOverviewNib:overviewLayoutTag andSave:NO]; */ - loadOverviewNib:(enum ov_Tags)overviewTag andSave:(BOOL)saveDefault { char prefString[10]; overviewLayoutTag = overviewTag; switch ( overviewLayoutTag ) { case ov_10x2_TAG: strcpy(prefString, "10x2"); if ( ! ov_10x2_Id ) [NXApp loadNibSection:"Overview_10x2.nib" owner:self withNames:YES]; overviewId = ov_10x2_Id; break; case ov_2x12_TAG: strcpy(prefString, "2x12"); if ( ! ov_2x12_Id ) [NXApp loadNibSection:"Overview_2x12.nib" owner:self withNames:YES]; overviewId = ov_2x12_Id; break; default: strcpy(prefString, "6x7"); if ( ! ov_6x7_Id ) [NXApp loadNibSection:"Overview.nib" owner:self withNames:YES]; overviewId = ov_6x7_Id; break; } if ( saveDefault ) { NXWriteDefault([NXApp appName], "OverviewLayout", prefString); } return self; } - openPCD:sender { id op; char *lastSlash; char *openDir = "/"; const char *types[] = {"pcd", NULL}; op = [OpenPanel new]; [op setPrompt:"Photo CD:"]; [op setTitle:"Photo CD Volume"]; /* note that really odd things happen if you set chooseDirectories * to YES and then the user chooses a file (such as overview.pcd) */ [op chooseDirectories:YES]; if( volumeDir ) openDir = volumeDir; if( [op runModalForDirectory:openDir file:"" types:types]) { if( volumeDir ) free(volumeDir); volumeDir = malloc( strlen([op filename]) + 10 + 1 ); strcpy(volumeDir, [op filename] ); /* crude parsing of the file/directory the user selected, which makes things a little nicer for the average user who is trying to open up a real photo CD programming note: In NS3.0, if "chooseDirectories" is YES and the user selects a file, then "filename" returned is apparently *missing* a directory. So if the user selects "/PCD1909/photo_cd/overview.pcd", then the filename the program sees is "/PCD1909/overview.pcd" !!! The order of the following checks happens to fix that well enough for the purposes of this program. Sounds like a pretty weird bug to me though! */ lastSlash = strrchr(volumeDir, '/'); if ( lastSlash ) { if ( ! strcmp(lastSlash, "/overview.pcd") ) { *lastSlash = '\0'; lastSlash = strrchr(volumeDir, '/'); } if ( 0 != strcmp(lastSlash, "/photo_cd") ){ strcat(volumeDir, "/photo_cd"); } } if ( [self readOverview] ) { [overviewId setImageArray:&ovImageIds imageCount:ovImageCount]; [self showOverviewWindow:self]; } } return self; } - readOverview { char *ovFil; ovFil = malloc(strlen(volumeDir) + strlen("/overview.pcd") + 1); strcpy(ovFil, volumeDir); strcat(ovFil, "/overview.pcd"); ovImageCount = [pCD_Reader readOverviewFromFile:ovFil curImageCount:ovImageCount ImageArray:&ovImageIds MaxEntries:overviewReadMax]; free(ovFil); [readStatusPanel close]; return self; } - showImage:(int)pictNumber atSize:(enum is_Tags)imageSizeWanted atRes:(int)imageResolutionWanted { NXBitmapImageRep *bm; char *imDir, *title, tmpStr[10]; char *imFile = malloc( strlen("/images/imgxxxx.pcd ") +1 ); imDir = malloc(strlen(volumeDir) + malloc_size(imFile) + 1); strcpy(imDir, volumeDir); strcat(imDir, "/images"); sprintf(imFile, "/img%04d.pcd", pictNumber ); strcat(imDir, imFile); if ( imageSizeWanted == is_GlobalPref_TAG ) imageSizeWanted = globImageSize; bm = [pCD_Reader readBitmapFromFile:imDir atSize:imageSizeWanted]; // the window title name will include information on the // image size and resolution. title = malloc(strlen(volumeDir) + malloc_size(imFile) + 10); strcpy(title, volumeDir); sprintf(imFile, "/img%04d.", pictNumber ); strcat(title, imFile); switch ( imageSizeWanted ) { case is_Base16_TAG: strcat(title, "base16"); break; case is_Base4_TAG: strcat(title, "base4"); break; case is_Base_TAG: strcat(title, "base"); break; case is_4Base_TAG: strcat(title, "4base"); break; case is_16Base_TAG: strcat(title, "16base"); break; default: strcat(title, "?base?"); break; } if ( imageResolutionWanted == ir_GlobalPref_TAG ) imageResolutionWanted = globImageResolution; sprintf(tmpStr, "_@%03ddpi", imageResolutionWanted); strcat(title, tmpStr); [photoWindow displayImage:bm withName:title atResolution:imageResolutionWanted]; free(imFile); free(imDir); return self; } - changeSaveType:sender { switch ([sender selectedRow]) { case 0: [[sender window] setRequiredFileType:"tiff"]; saveTo = TIFF; break; case 1: [[sender window] setRequiredFileType:"eps"]; saveTo = EPS; break; case 2: [[sender window] setRequiredFileType:"jpg"]; saveTo = JPG; break; } return self; } - changePrintType:sender { switch ([sender selectedRow]) { case 0: printWhich = IMG; break; case 1: printWhich = WIN; break; } return self; } - saveTo:sender { NXStream *st; int status; if( status = [sp runModalForDirectory:"." file:"Untitled"]) { st = NXOpenMemory(NULL, 0, NX_WRITEONLY); switch( saveTo ) { case TIFF: [[[[NXApp mainWindow] contentView] image] writeTIFF:st]; break; case EPS: [[[NXApp mainWindow] contentView] copyPSCodeInside:NULL to:st]; break; case JPG: [[[[NXApp mainWindow] contentView] image] writeTIFF:st usingCompression:NX_TIFF_COMPRESSION_JPEG]; break; } NXSaveToFile(st, [sp filename]); NXCloseMemory(st, NX_FREEBUFFER); } return self; } - printSel:sender { int exitTag; exitTag = [pp runModal]; [pp orderOut:self]; if( exitTag != NX_CANCELTAG ) { [pp finalWritePrintInfo]; switch ( printWhich ) { case IMG: [[[NXApp mainWindow] contentView] printPSCode:self]; break; case WIN: [[NXApp mainWindow] printPSCode:self]; break; } } return self; } - (BOOL)shouldRunPrintPanel:aView { return NO; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.