ftp.nice.ch/pub/next/science/mathematics/HippoDraw.2.0.s.tar.gz#/HippoDraw/Hippo.bproj/Draw.subproj/gvServices.m

This is gvServices.m in view mode; [Download] [Up]

#import "draw.h"

@implementation GraphicView(Services)

/* Services menu methods */

/*
 * Services in Draw are trivial to implement since we leverage heavily
 * off of the copy/paste code.  Note that write/readSelectionTo/FromPasteboard:
 * do little more than call the copy/paste code.
 */

/*
 * We are a valid requestor whenever any of the send or return types is
 * PostScript, TIFF, or Draw (actually, any return type that NXImage can
 * handle is okay with us).
 */

- validRequestorForSendType:(NXAtom)sendType andReturnType:(NXAtom)returnType
{

    if ((!sendType || !*sendType ||
	((sendType == NXPostScriptPboardType ||
	  sendType == NXTIFFPboardType ||
	  sendType == DrawPboardType) && [slist count])) &&
	(!returnType || !*returnType ||
	  IncludesType([NXImage imagePasteboardTypes], returnType) ||
	  returnType == DrawPboardType)) {
	return self;
    }
 
    return [super validRequestorForSendType:sendType andReturnType:returnType];
}

/*
 * If one of the requested types is one of the ones we handle,
 * then we put our selection in the Pasteboard.  The serviceActsOnSelection
 * flag is so that we can effectively undo a Service request.
 */

- (BOOL)writeSelectionToPasteboard:(Pasteboard *)pboard types:(NXAtom *)types
{
    while (types && *types) {
	if (*types == NXPostScriptPboardType || *types == NXTIFFPboardType || *types == DrawPboardType) break;
	types++;
    }

    if (types && *types && [self copyToPasteboard:pboard types:types]) {
	gvFlags.serviceActsOnSelection = YES;
	return YES;
    } else {
	return NO;
    }
}

#define SERVICE_CALL_OPERATION NXLocalStringFromTable("Operations", "Service Call", NULL, "The user action of selecting an item in the Services menu.")

/*
 * When a result comes back from the Services menu request,
 * we replace the selection with the return value.
 * If the user really wants the return value in addition to
 * the current selection, she can simply copy, then paste
 * twice to get two copies, then choose the Services menu item.
 */

- readSelectionFromPasteboard:(Pasteboard *)pboard
{
    id change;
    NXRect sbbox;
    NXPoint *position = &sbbox.origin;
    
    change = [[MultipleChange alloc] initChangeName:SERVICE_CALL_OPERATION];
    [change startChange];
	if (gvFlags.serviceActsOnSelection) {
	    [self getBBox:&sbbox of:slist extended:NO];
	    sbbox.origin.x += floor(sbbox.size.width / 2.0 + 0.5);
	    sbbox.origin.y += floor(sbbox.size.height / 2.0 + 0.5);
	    [self delete:self];
	    gvFlags.serviceActsOnSelection = NO;
	} else {
	    position = NULL;
	}
	[self pasteFromPasteboard:pboard andLink:DontLink at:position];
    [change endChange];

    return self;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.