This is MORegexPalette.m in view mode; [Download] [Up]
// MORegexPalette.m // // by Mike Ferris // Part of MOKit - MORegexPalette // Copyright 1993, all rights reserved. // ABOUT MOKit // by Mike Ferris (mike@lorax.com) // // MOKit is a collection of useful and general objects. Permission is // granted by the author to use MOKit in your own programs in any way // you see fit. All other rights pertaining to the kit are reserved by the // author including the right to sell these objects as objects, as part // of a LIBRARY, or as SOURCE CODE. In plain English, I wish to retain // rights to these objects as objects, but allow the use of the objects // as pieces in a fully functional program. Permission is also granted to // redistribute the source code of MOKit for FREE as long as this copyright // notice is left intact and unchanged. NO WARRANTY is expressed or implied. // The author will under no circumstances be held responsible for ANY // consequences from the use of these objects. Since you don't have to pay // for them, and full source is provided, I think this is perfectly fair. #import "MORegexPalette.h" #import "MOKit/MORegexFormCell.h" #import "MOKit/MORegexTextCell.h" #import <appkit/appkit.h> #import <objc/objc-runtime.h> #define CLASS_VERSION 0 #define CLASS_NAME "MORegexPalette" #define BUNDLE_TYPE "bundle" #define MOSTRING_CLASS_NAME "MOString" #define MOREGEXFORMCELL_CLASS_NAME "MORegexFormCell" #define MOREGEXTEXTCELL_CLASS_NAME "MORegexTextCell" #define MODATEFORMCELL_CLASS_NAME "MODateFormCell" #define MODATETEXTCELL_CLASS_NAME "MODateTextCell" #define FORM_GENERIC_NAME "Generic:" #define FORM_INT_NAME "Integer:" #define FORM_FLOAT_NAME "Float:" #define FORM_TIME_NAME "Time:" #define FORM_DATE_NAME "Date:" #define INT_REGEX "^[ ]*([+-]?[0-9]+)[ ]*$" #define FLOAT_REGEX "^[ ]*(([+-]?[0-9]*)\\.?([0-9]*)[eE]?([0-9]*))[ ]*$" #define TIME_REGEX_1 "^[ ]*(([0]?[0-9]|[1][0-2]):([0-5][0-9])[ ]*([aA][mM]?|[pP][mM]?))[ ]*$" #define TIME_REGEX_2 "^[ ]*(([0]?[0-9]|[1][0-9]|[2][0-3]):([0-5][0-9])())[ ]*$" @interface MORegexPalette(Private) + (Class)MO_loadClassBundle:(const char *)className; @end @implementation MORegexPalette static id MOStringClass; static id MORegexFormCellClass; static id MORegexTextCellClass; static id MODateFormCellClass; static id MODateTextCellClass; + (Class)MO_loadClassBundle:(const char *)className // Finds the bundle of the same name as the class, grabs it and loads the // class from it and returns the named class. { char pathBuff[MAXPATHLEN+1]; id classBundle = nil; Class class = nil; // Load the bundle if ((class = objc_lookUpClass(className)) == nil) { // class is not already loaded... load it. // Look for the bundle in the main bundle first, // else try in this class's bundle. if (![[NXBundle mainBundle] getPath:pathBuff forResource:className ofType:BUNDLE_TYPE]) { if (![[NXBundle bundleForClass:[self class]] getPath:pathBuff forResource:className ofType:BUNDLE_TYPE]) { NXLogError("[%s loadClassBundle] failed to " "find %s class bundle.", [self name], className); return nil; } } classBundle = [[NXBundle allocFromZone:[self zone]] initForDirectory:pathBuff]; if (!classBundle) { NXLogError("[%s loadClassBundle] failed to " "create bundle for class %s.", [self name], className); return nil; } if ((class = [classBundle classNamed:className]) == nil) { NXLogError("[%s loadClassBundle] failed to " "load %s class from bundle.", [self name], className); return nil; } } return class; } + initialize // Set the version. { if (self == objc_lookUpClass(CLASS_NAME)) { [self setVersion:CLASS_VERSION]; // Load all needed classes MOStringClass = [self MO_loadClassBundle:MOSTRING_CLASS_NAME]; MORegexFormCellClass = [self MO_loadClassBundle:MOREGEXFORMCELL_CLASS_NAME]; MORegexTextCellClass = [self MO_loadClassBundle:MOREGEXTEXTCELL_CLASS_NAME]; MODateFormCellClass = [self MO_loadClassBundle:MODATEFORMCELL_CLASS_NAME]; MODateTextCellClass = [self MO_loadClassBundle:MODATETEXTCELL_CLASS_NAME]; } return self; } - finishInstantiate // First load up the class bundles, one for each included class. // Then set up all the palette controls. { id protoCell; NXSize size; // Set up the generic MORegexFormCell protoCell = [[MORegexFormCellClass allocFromZone:[self zone]] initTextCell:NULL]; [genericForm setPrototype:protoCell]; [genericForm addEntry:FORM_GENERIC_NAME]; [genericForm sizeToFit]; // Set up the integer MORegexFormCell protoCell = [[MORegexFormCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell addRegexStr:INT_REGEX]; [intForm setPrototype:protoCell]; [intForm addEntry:FORM_INT_NAME]; [intForm sizeToFit]; // Set up the float MORegexFormCell protoCell = [[MORegexFormCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell addRegexStr:FLOAT_REGEX]; [floatForm setPrototype:protoCell]; [floatForm addEntry:FORM_FLOAT_NAME]; [floatForm sizeToFit]; // Set up the time MORegexFormCell protoCell = [[MORegexFormCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell addRegexStr:TIME_REGEX_1]; [protoCell addRegexStr:TIME_REGEX_2]; [timeForm setPrototype:protoCell]; [timeForm addEntry:FORM_TIME_NAME]; [timeForm sizeToFit]; // Set up the date MODateFormCell protoCell = [[MODateFormCellClass allocFromZone:[self zone]] initTextCell:NULL]; [dateForm setPrototype:protoCell]; [dateForm addEntry:FORM_DATE_NAME]; [dateForm sizeToFit]; // Set up the generic MORegexTextCell protoCell = [[MORegexTextCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell setBezeled:YES]; [protoCell setBackgroundGray:NX_WHITE]; [protoCell setTextGray:NX_BLACK]; [protoCell setEditable:YES]; [genericMatrix setPrototype:protoCell]; size.width = 100; size.height = 21; [genericMatrix setCellSize:&size]; size.width = 4; size.height = 4; [genericMatrix setIntercell:&size]; [genericMatrix renewRows:1 cols:1]; [genericMatrix sizeToCells]; // Set up the integer MORegexTextCell protoCell = [[MORegexTextCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell setBezeled:YES]; [protoCell setBackgroundGray:NX_WHITE]; [protoCell setTextGray:NX_BLACK]; [protoCell setEditable:YES]; [protoCell addRegexStr:INT_REGEX]; [intMatrix setPrototype:protoCell]; size.width = 100; size.height = 21; [intMatrix setCellSize:&size]; size.width = 4; size.height = 4; [intMatrix setIntercell:&size]; [intMatrix renewRows:1 cols:1]; [intMatrix sizeToCells]; // Set up the float MORegexTextCell protoCell = [[MORegexTextCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell setBezeled:YES]; [protoCell setBackgroundGray:NX_WHITE]; [protoCell setTextGray:NX_BLACK]; [protoCell setEditable:YES]; [protoCell addRegexStr:FLOAT_REGEX]; [floatMatrix setPrototype:protoCell]; size.width = 100; size.height = 21; [floatMatrix setCellSize:&size]; size.width = 4; size.height = 4; [floatMatrix setIntercell:&size]; [floatMatrix renewRows:1 cols:1]; [floatMatrix sizeToCells]; // Set up the time MORegexTextCell protoCell = [[MORegexTextCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell setBezeled:YES]; [protoCell setBackgroundGray:NX_WHITE]; [protoCell setTextGray:NX_BLACK]; [protoCell setEditable:YES]; [protoCell addRegexStr:TIME_REGEX_1]; [protoCell addRegexStr:TIME_REGEX_2]; [timeMatrix setPrototype:protoCell]; size.width = 100; size.height = 21; [timeMatrix setCellSize:&size]; size.width = 4; size.height = 4; [timeMatrix setIntercell:&size]; [timeMatrix renewRows:1 cols:1]; [timeMatrix sizeToCells]; // Set up the time MORegexTextCell protoCell = [[MODateTextCellClass allocFromZone:[self zone]] initTextCell:NULL]; [protoCell setBezeled:YES]; [protoCell setBackgroundGray:NX_WHITE]; [protoCell setTextGray:NX_BLACK]; [protoCell setEditable:YES]; [dateMatrix setPrototype:protoCell]; size.width = 100; size.height = 21; [dateMatrix setCellSize:&size]; size.width = 4; size.height = 4; [dateMatrix setIntercell:&size]; [dateMatrix renewRows:1 cols:1]; [dateMatrix sizeToCells]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.