This is TwoPassUIControl.m in view mode; [Download] [Up]
//======================================================================
//
// Portions written by FreemanSoft Inc.
//
// FreemanSoft disclaims any warranty of any kind, expressed or implied,
// as to this source code's fitness for any particular use.
//
// For more information, use the following electronic mail addresses:
//
// info@FreemanSoft.com general questions
// support@FreemanSoft.com technical questions
//
//======================================================================
/* Written by
* Joe Freeman jfreeman@next.com
* TwoPassUIControl
*
* This code has no warranty.
* It is provided so that the consumer may maintain and modify it
* at their own risk. Use this code at your own risk.
*/
#import "TwoPassUIControl.h"
#import "DragView.h"
#import "Subprocess.h"
///#import "PreferencesPanel.h"
#import "pathutil.h"
#import "common.h"
#import "twoPassUI.h" // strings entries
/*================================================================
* Private methods
*================================================================*/
@implementation TwoPassUIControl(Private)
/* updates currentState and title */
- setState:(int)newState
{
switch (newState){
case NOTHING_RUNNING:
[theWindow setTitle:title_string];
currentState = newState;
break;
case PASS_1_RUNNING:
[theWindow setTitle:title_pass_1];
currentState = newState;
break;
case PASS_2_RUNNING:
[theWindow setTitle:title_pass_2];
currentState = newState;
break;
default: /* invalid state so pick other */
[theWindow setTitle:title_string];
[self setState: NOTHING_RUNNING];
break;
}
return self;
}
@end
@implementation TwoPassUIControl
/*================================================================
* all strings related to rdist are right before runPassTwo:
*================================================================*/
/*================================================================
* initializers
*================================================================*/
- init
{
static windowPosX = 0;
static windowPosY = 0;
NXRect windowRect;
[super init];
[self setState: NOTHING_RUNNING];
canContinue = YES; /* redundant */
[NXApp loadNibSection: "TwoPassUIControl.nib" owner:self];
[theWindow getFrame:&windowRect];
windowRect.origin.x+=windowPosX;
windowRect.origin.y-=windowPosY;
if (windowPosX < 120){
windowPosX+= 20.0;
windowPosY+= 20.0;
} else {
windowPosX = 0.0;
windowPosY = 0.0;
}
[theWindow moveTo:windowRect.origin.x :windowRect.origin.y];
[theWindow setTitle:title_string];
[theWindow makeKeyAndOrderFront:self];
return self;
}
- initSourcePath:(char *)srcPath destinationPath:(char *)destPath
{
[self init];
if (srcPath && *srcPath){
if (srcPath[0] == '~' ){
strcpy(sPathList, NXHomeDirectory());
strcat(sPathList, &srcPath[1]);
}else {
strcpy(sPathList, srcPath);
}
}
if (destPath && *destPath){
if (destPath[0] == '~' ){
strcpy(dPathList, NXHomeDirectory());
strcat(dPathList, &destPath[1]);
} else {
strcpy(dPathList, destPath);
}
}
[self updateTextFields:self];
[self updateIconViews:self];
return self;
}
/*================================================================
* outlet connection
*================================================================*/
- window
{
return theWindow;
}
- (int)state
{
return currentState;
}
- (const char *)buttonImageName
{
return "JumpBack_notext.tiff";
}
- (const char *)buttonAltImageName
{
return "JumpBack_abort.tiff";
}
- (const char *)stringsTable
{
return "twoPassUI";
}
- setStartButton:anObject
{
startButton = anObject;
[NXImage findImageNamed: [self buttonImageName]];
[startButton setIcon: [self buttonImageName]];
[NXImage findImageNamed: [self buttonAltImageName]];
[startButton setAltIcon: [self buttonAltImageName]];
return self;
}
/* ===========================
* Utility methods
* ===========================*/
/*
* default behavior says to just use the whole path typed in
*/
- updateFromTextFields:sender
{
strcpy(dPathList, [destinationText stringValue]);
strcpy(sPathList, [sourceText stringValue]);
return self;
}
/* simple standard case where all paths are absolute
*/
- updateTextFields:sender
{
[sourceText setStringValue:sPathList];
[destinationText setStringValue:dPathList];
return self;
}
- updateIconViews:sender
{
[sourceDragView useIconForFile:sPathList];
[destinationDragView useIconForFile:dPathList];
return self;
}
/* show a string in the log window */
- logIt:(const char *)s
{
int numChars = [logText textLength];
[[[logText setSel:numChars :numChars] replaceSel:s] scrollSelToVisible];
NXPing();
return self;
}
/* ===========================
* Target/Action stuff
* ===========================*/
#define rhost_string \
"/bin/echo localhost `whoami` | /bin/cat >> ~/.rhosts; /usr/bin/sort ~/.rhosts | /usr/bin/uniq > /tmp/$$ ; /bin/mv /tmp/$$ ~/.rhosts"
- startProcess:sender
{
canContinue=YES;
if ([sender state] == 1){
[logText selectText:self];
[logText replaceSel:startup_string];
if ( !sPathList || !*sPathList){
[self logIt:missing_source];
[sender setState:0];
return nil;
}
if ( !dPathList || !*dPathList) {
[self logIt:missing_dest];
[sender setState:0];
return nil;
}
/* really should scan the rhosts files to make sure this will work */
system(rhost_string);
/* run find (which will spawn rdist), or just run rdist */
if (![self runPassOne:self])
[self runPassTwo:self];
} else [self abortProcess:self];
return self;
}
/* default is no pass one */
- runPassOne:sender
{
return nil;
}
- runPassTwo:sender
{
return self;
}
- abortProcess:sender
{
[self setState: NOTHING_RUNNING];
canContinue = NO;
[subprocessObj terminate:sender ];
[self logIt: abort_string];
[startButton setState:0];
return self;
}
/*=======================================
*
* drag support
*
*=======================================*/
- iconEntered:where
{
[theWindow setTitle:almost_got_it];
return self;
}
- iconLeft:where
{
[theWindow setTitle:title_string];
return self;
}
- iconDropped:where
{
if (sPathList)
[theWindow setTitle:basename(sPathList)];
else
[theWindow setTitle:title_string];
return self;
}
- iconBogus:where
{
[theWindow setTitle:bogus_file_type];
NXBeep();
return self;
}
- (BOOL) isFilePBValid:(Pasteboard *)pboard forView:sender
{
int length;
const char * tPathList;
[pboard readType:NXFilenamePboardType data:&tPathList length:&length];
if (!isDirectory((char *)tPathList))
return NO;
else
return YES;
}
- (BOOL) acceptedFilePB:(Pasteboard *)pboard forView:sender
{
int length;
const char * tPathList;
[pboard readType:NXFilenamePboardType data:&tPathList length:&length];
if (!isDirectory((char *) tPathList))
{
NXRunAlertPanel([NXApp appName],
bogus_file_type,
"OK",NULL,NULL);
return NO;
}
else
{
if (sender == destinationDragView)
{
strcpy(dPathList, tPathList);
}
else
{
strcpy(sPathList, tPathList);
}
[self updateTextFields:self];
}
return YES;
}
- userClicked:(int)numTimes at:(NXPoint *)clickPoint inDragView:sender;
{
const char *ourPath;
if (sender == destinationDragView)
{
ourPath = dPathList;
}
else if (sender == sourceDragView)
{
ourPath = sPathList;
} else
{
return nil;
}
if (numTimes == 1)
[[Application workspace] selectFile:ourPath
inFileViewerRootedAt:""];
else if (numTimes == 2)
[[Application workspace] openFile:ourPath
fromImage: [sender currentImage]
at:clickPoint
inView:sender];
return self;
}
/* ===========================
* subprocess delegation
* ===========================*/
- subprocessOutput:(char *)buffer
{
char *copyBuf;
copyBuf = buffer;
if (currentState == PASS_1_RUNNING){
/*
* The find only returns offensive directories
* if we get anything back from the find,
* it means we have found something bad
*/
if (debug_level >= debug_except_pat)
fprintf(stderr,"find returned: %s\n", copyBuf);
if (canContinue) {
/*
* this is the first one to be found bad
*/
[self logIt: pass_1_found_something];
}
/* log the offensive directory names */
[self logIt: copyBuf];
/* do this so rdist doesn't run later */
canContinue = NO;
/* we don't abort the find cause we want to see them all */
} else if (currentState == PASS_2_RUNNING) {
[self logIt: buffer];
} else {
/* I'm confused unknown state */
}
return self;
}
- subprocessDone
{
if (currentState == PASS_1_RUNNING){
/* if find was running and found no problems */
if (canContinue) {
[self runPassTwo:self];
} else {
[self abortProcess:self];
}
} else if (currentState == PASS_2_RUNNING){
[self setState: NOTHING_RUNNING];
[self logIt:finished_string];
[startButton setState:0];
} else {
/* I'm confused, unknown state */
}
return self;
}
/* ===========================
* window delegation
* ===========================*/
- windowWillClose:sender
{
id retID;
if ([startButton state] == 1)
{
if ( NXRunAlertPanel([NXApp appName],
process_running,
dont_close, close_anyway,NULL) == NX_ALERTDEFAULT )
{
retID= nil;
}
else
{
[self abortProcess:self];
retID= self;
}
}
else
{
retID= self;
}
if (retID == self) {
[self free];
[sender setDelegate:nil];
}
return retID;
}
/* ===========================
* text delegation
* ===========================*/
- textDidEnd:textObject endChar:(unsigned short)whyEnd
{
[ self updateFromTextFields:self];
[ self updateIconViews:self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.