Annotation of Examples/AppKit/Draw/gvServices.m, revision 1.1

1.1     ! root        1: #import "draw.h"
        !             2: 
        !             3: @implementation GraphicView(Services)
        !             4: 
        !             5: /* Services menu methods */
        !             6: 
        !             7: /*
        !             8:  * Services in Draw are trivial to implement since we leverage heavily
        !             9:  * off of the copy/paste code.  Note that write/readSelectionTo/FromPasteboard:
        !            10:  * do little more than call the copy/paste code.
        !            11:  */
        !            12: 
        !            13: /*
        !            14:  * We are a valid requestor whenever any of the send or return types is
        !            15:  * PostScript, TIFF, or Draw (actually, any return type that NXImage can
        !            16:  * handle is okay with us).
        !            17:  */
        !            18: 
        !            19: - validRequestorForSendType:(NXAtom)sendType andReturnType:(NXAtom)returnType
        !            20: {
        !            21: 
        !            22:     if ((!sendType || !*sendType ||
        !            23:        ((sendType == NXPostScriptPboardType ||
        !            24:          sendType == NXTIFFPboardType ||
        !            25:          sendType == DrawPboardType) && [slist count])) &&
        !            26:        (!returnType || !*returnType ||
        !            27:          IncludesType([NXImage imagePasteboardTypes], returnType) ||
        !            28:          returnType == DrawPboardType)) {
        !            29:        return self;
        !            30:     }
        !            31:  
        !            32:     return [super validRequestorForSendType:sendType andReturnType:returnType];
        !            33: }
        !            34: 
        !            35: /*
        !            36:  * If one of the requested types is one of the ones we handle,
        !            37:  * then we put our selection in the Pasteboard.  The serviceActsOnSelection
        !            38:  * flag is so that we can effectively undo a Service request.
        !            39:  */
        !            40: 
        !            41: - (BOOL)writeSelectionToPasteboard:(Pasteboard *)pboard types:(NXAtom *)types
        !            42: {
        !            43:     while (types && *types) {
        !            44:        if (*types == NXPostScriptPboardType || *types == NXTIFFPboardType || *types == DrawPboardType) break;
        !            45:        types++;
        !            46:     }
        !            47: 
        !            48:     if (types && *types && [self copyToPasteboard:pboard types:types]) {
        !            49:        gvFlags.serviceActsOnSelection = YES;
        !            50:        return YES;
        !            51:     } else {
        !            52:        return NO;
        !            53:     }
        !            54: }
        !            55: 
        !            56: #define SERVICE_CALL_OPERATION NXLocalStringFromTable("Operations", "Service Call", NULL, "The user action of selecting an item in the Services menu.")
        !            57: 
        !            58: /*
        !            59:  * When a result comes back from the Services menu request,
        !            60:  * we replace the selection with the return value.
        !            61:  * If the user really wants the return value in addition to
        !            62:  * the current selection, she can simply copy, then paste
        !            63:  * twice to get two copies, then choose the Services menu item.
        !            64:  */
        !            65: 
        !            66: - readSelectionFromPasteboard:(Pasteboard *)pboard
        !            67: {
        !            68:     id change;
        !            69:     NXRect sbbox;
        !            70:     NXPoint *position = &sbbox.origin;
        !            71:     
        !            72:     change = [[MultipleChange alloc] initChangeName:SERVICE_CALL_OPERATION];
        !            73:     [change startChange];
        !            74:        if (gvFlags.serviceActsOnSelection) {
        !            75:            [self getBBox:&sbbox of:slist extended:NO];
        !            76:            sbbox.origin.x += floor(sbbox.size.width / 2.0 + 0.5);
        !            77:            sbbox.origin.y += floor(sbbox.size.height / 2.0 + 0.5);
        !            78:            [self delete:self];
        !            79:            gvFlags.serviceActsOnSelection = NO;
        !            80:        } else {
        !            81:            position = NULL;
        !            82:        }
        !            83:        [self pasteFromPasteboard:pboard andLink:DontLink at:position];
        !            84:     [change endChange];
        !            85: 
        !            86:     return self;
        !            87: }
        !            88: 
        !            89: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.