home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula
/
nebula.bin
/
SourceCode
/
Classes
/
FileQueue
/
FileQueue.m
< prev
next >
Wrap
Text File
|
1993-01-19
|
10KB
|
294 lines
/*****************************************************************************/
// FileQueue.m
// implementation file of FileQueue class of ViewGif2 application
// January 1990 Carl F. Sutter
// FileQueue is a generic IB module that keeps a queue of strings that can be
// returned on demand by a controlling object. It can display a panel
// that lets the user control the order etc. of the queue. Most of the
// controls are set up in the IB, making customization easy.
/*****************************************************************************/
#import "FileQueue.h"
#import <appkit/Application.h>
#import <appkit/Window.h>
#import <appkit/TextField.h>
#import <appkit/Matrix.h>
#import <appkit/publicWraps.h> // for NXBeep
#import <sys/param.h> // for MAXPATHLEN
#import <string.h> // for strcpy
@implementation FileQueue
/*****************************************************************************/
/* new - factory method */
/*****************************************************************************/
+ new
{
self = [super new];
[self setup];
return( self );
} /* new 1/22/90 CFS */
/*****************************************************************************/
/* new - factory method with target and action */
/*****************************************************************************/
+ new:(id )targ action:(SEL )act
{
self = [super new];
[self setup];
target = targ;
action = act;
return( self );
} /* new:action: 1/23/90 CFS */
/*****************************************************************************/
/* setup - initialize instance variables and panel etc. */
/*****************************************************************************/
- setup
{
NXSize nxsList;
NXSize nxsCell;
/* load nib defining panel and outlets */
[NXApp loadNibSection:"FileQueue.nib" owner:self];
/* set attributes for the scrollview and matrix */
[queueScroll setVertScrollerRequired:YES];
[queueScroll setBorderType:NX_BEZEL];
[queueScroll getContentSize:&nxsList];
[queueMatrix getCellSize:&nxsCell];
nxsCell.width = nxsList.width;
[queueMatrix setCellSize:&nxsCell];
[queueMatrix setAutoscroll:YES];
/* attach the matrix to the scrollview */
[queueScroll setDocView:queueMatrix];
/* remove any matrix cells drawn in the IB */
while ([queueMatrix cellCount]) [queueMatrix removeRowAt:0 andFree:YES];
[queueMatrix sizeToCells];
/* init instance variables */
nNumRows = 0;
bPaused = NO;
bSendWhenReady = NO;
return( self );
} /* setup 1/23/90 CFS */
/*****************************************************************************/
/* outlet initialization methods */
/*****************************************************************************/
- setQueuePanel:anObject { queuePanel = anObject; return( self ); }
- setQueueScroll:anObject { queueScroll = anObject; return( self ); }
- setQueueMatrix:anObject { queueMatrix = anObject; return( self ); }
/***************************************************************************/
/* windowWillResize - Delegate message sent from main window. */
/* Prevent window from getting too small. */
/***************************************************************************/
- windowWillResize:sender toSize:(NXSize *)frameSize
{
/* minimum size to allow for the buttons and a small scrollview */
frameSize->width = MAX( 250, frameSize->width );
frameSize->height = MAX( 150, frameSize->height );
return( self );
} /* windowWillResize 9/14/89 CFS */
/*****************************************************************************/
/* show - display the queue panel */
/*****************************************************************************/
- show:sender
{
[queuePanel makeKeyAndOrderFront:self];
return( self );
} /* show 1/22/90 CFS */
/*****************************************************************************/
/* pause - pause the queue */
/*****************************************************************************/
- pause:sender
{
bPaused = !bPaused;
if (!bPaused && bSendWhenReady) [self sendNext];
return( self );
} /* pause 1/22/90 CFS */
/*****************************************************************************/
/* remove - remove highlighted cells */
/*****************************************************************************/
- remove:sender
{
int i;
/* enumerate the highlighted cells */
nNumSelected = 0;
[queueMatrix sendAction:@selector(countOneSelected:) to:self forAllCells:NO];
/* delete the selected cells */
for (i=0; i<nNumSelected; i++)
{
[queueMatrix removeRowAt:(nSelectedRows[i]-i) andFree:YES];
nNumRows--;
}
[queueMatrix sizeToCells];
[queueScroll display];
return( self );
} /* remove 1/18/90 CFS */
/*****************************************************************************/
/* toTop - move selected cells to the top of the queue */
/*****************************************************************************/
- toTop:sender
{
int nRealRow, i;
/* enumerate the highlighted cells */
nNumSelected = 0;
[queueMatrix sendAction:@selector(countOneSelected:) to:self forAllCells:NO];
/* move the selected cells to the top */
for (i=nNumSelected-1; i>=0; i--)
{
[queueMatrix insertRowAt:0];
nRealRow = nSelectedRows[i] + nNumSelected - i;
[[queueMatrix cellAt:0 :0] setStringValue:
[[queueMatrix cellAt:nRealRow :0] stringValue]];
[queueMatrix removeRowAt:nRealRow andFree:YES];
}
[queueMatrix sizeToCells];
[queueScroll display];
return( self );
} /* toTop 1/18/90 CFS */
/*****************************************************************************/
/* toBottom - move selected cells to the bottom of the queue */
/*****************************************************************************/
- toBottom:sender
{
int nRealRow, i;
/* enumerate the highlighted cells */
nNumSelected = 0;
[queueMatrix sendAction:@selector(countOneSelected:) to:self forAllCells:NO];
/* move the selected cells to the bottom */
for (i=0; i<nNumSelected; i++)
{
[queueMatrix addRow];
nRealRow = nSelectedRows[i] - i;
[[queueMatrix cellAt:nNumRows :0] setStringValue:
[[queueMatrix cellAt:nRealRow :0] stringValue]];
[queueMatrix removeRowAt:nRealRow andFree:YES];
}
[queueMatrix sizeToCells];
[queueScroll display];
return( self );
} /* toBottom 1/18/90 CFS */
/*****************************************************************************/
/* countOneSelected - enumerates one cell, adds row to the selected list */
/*****************************************************************************/
- (BOOL)countOneSelected:cell
{
int nRow, nCol;
[queueMatrix getRow:&nRow andCol:&nCol ofCell:cell];
nSelectedRows[nNumSelected] = nRow;
nNumSelected++;
if (nNumSelected == MAXSELECTABLE) return( NO );
return( YES ); // to continue to next highlighted cell
} /* countOneSelected 1/18/90 CFS */
/*****************************************************************************/
/* setTarget - sets the object to return queue items to */
/*****************************************************************************/
- setTarget:(id)targ
{
target = targ;
return( self );
} /* setTarget 1/22/90 CFS */
/*****************************************************************************/
/* setAction - sets the method that will be called with the new item */
/* there will be one parameter - a pointer to a standard C string */
/*****************************************************************************/
- setAction:(SEL)aSelector
{
action = aSelector;
return( self );
} /* setAction 1/22/90 CFS */
/*****************************************************************************/
/* addItem - adds one string to the bottom of the queue */
/*****************************************************************************/
- (BOOL)addItem:(const char *)szFileName
{
[queueMatrix addRow];
[queueMatrix sizeToCells];
[[queueMatrix cellAt:nNumRows :0] setStringValue:szFileName];
[queueScroll display];
nNumRows++;
if (!bPaused && bSendWhenReady) [self sendNext];
return( YES );
} /* addItem 1/22/90 CFS */
/*****************************************************************************/
/* retrieveNext - immediately return the next string on the queue */
/* disregards the pause button - use retrieveNextWhenReady for that function */
/*****************************************************************************/
- (char *)retrieveNext
{
char szReturn[MAXPATHLEN + 1];
if (nNumRows == 0) return( NULL );
strcpy( szReturn , [[queueMatrix cellAt:0 :0] stringValue] );
[queueMatrix removeRowAt:0 andFree:YES];
[queueMatrix sizeToCells];
[queueScroll display];
nNumRows--;
return( szReturn );
} /* retrieveNext 1/22/90 CFS */
/*****************************************************************************/
/* retrieveNextWhenReady - send the next queue item when it is available */
/*****************************************************************************/
- retrieveNextWhenReady
{
bSendWhenReady = YES;
if (!bPaused) [self sendNext];
return( self );
} /* retrieveNextWhenReady 1/22/90 CFS */
/*****************************************************************************/
/* sendNext - send the next queue item to the target object */
/*****************************************************************************/
- sendNext
{
char szReturn[MAXPATHLEN + 1];
if (nNumRows > 0)
{
strcpy( szReturn, [self retrieveNext] );
[target perform:action with:(id)szReturn];
bSendWhenReady = NO;
}
return( self );
} /* sendNext 1/22/90 CFS */
@end