Annotation of Examples/IndexingKit/Ledger/MoneyWell.m, revision 1.1

1.1     ! root        1: /*
        !             2:  * Money Well - cool dragging stuff
        !             3:  *
        !             4:  * Author: Kris Younger, NeXT Systems Engineering
        !             5:  * You may freely copy, distribute and reuse the code in this example.  
        !             6:  * NeXT disclaims any warranty of any kind, expressed or implied, as to 
        !             7:  * its fitness for any particular use.
        !             8:  */
        !             9: 
        !            10: #import "MoneyWell.h"
        !            11: #import "Transaction.h"
        !            12: #import "MainDelegate.h"
        !            13: #import "LedgerController.h"
        !            14: 
        !            15: #define BOX(X,Y,W,H) PSmoveto(X,Y); PSrlineto(0, H); PSrlineto (W, 0); \
        !            16:                PSrlineto(0, (-1 * H)); PSclosepath()
        !            17: 
        !            18: @implementation MoneyWell
        !            19: 
        !            20: #define TRANS_PBOARDTYPE_NAME  "Transaction"
        !            21: 
        !            22: NXAtom TransPboardType = NULL;
        !            23: static id           dragObject = nil;
        !            24: static id           dragPBoard = nil;
        !            25: 
        !            26: 
        !            27: - initFrame:(const NXRect *)frameRect
        !            28: {
        !            29:     NXAtom              type = NXUniqueString(TRANS_PBOARDTYPE_NAME);
        !            30: 
        !            31:     [super initFrame:frameRect];
        !            32:     image = [[NXImage alloc] initFromSection:"well"];
        !            33:     TransPboardType = type;
        !            34:     [self registerForDraggedTypes:&type count:1];
        !            35:     sel = NO;
        !            36:     return self;
        !            37: }
        !            38: 
        !            39: - (BOOL)acceptsFirstResponder
        !            40: {
        !            41:     return YES;
        !            42: }
        !            43: 
        !            44: - (BOOL)acceptsFirstMouse
        !            45: {
        !            46:     return YES;
        !            47: }
        !            48: 
        !            49: - free
        !            50: {
        !            51:     [self unregisterDraggedTypes];
        !            52:     return[super free];
        !            53: }
        !            54: 
        !            55: - drawSelf:(const NXRect *)rects :(int)rectCount
        !            56: {
        !            57:     NXSize              imsze;
        !            58:     NXPoint             origin;
        !            59:     NXRect              inbounds;
        !            60: 
        !            61:     NXDrawButton(&bounds, rects);
        !            62:     if (sel) {
        !            63:        PSsetgray(1.0);
        !            64:        BOX((bounds.origin.x + 1), (bounds.origin.y + 2),
        !            65:            (bounds.size.width - 4), (bounds.size.height - 3));
        !            66:        PSfill();
        !            67:     }
        !            68:     inbounds.origin.x = inbounds.origin.y = 6;
        !            69:     inbounds.size.width = bounds.size.width - 12;
        !            70:     inbounds.size.height = bounds.size.height - 12;
        !            71:     NXDrawGrayBezel(&inbounds, rects);
        !            72:     [image getSize:&imsze];
        !            73:     origin.x = (bounds.size.width / 2) - (imsze.width / 2);
        !            74:     origin.y = (bounds.size.height / 2) - (imsze.height / 2);
        !            75:     [image composite:NX_SOVER toPoint:&origin];
        !            76: 
        !            77:     return self;
        !            78: }
        !            79: 
        !            80: #define mask (NX_LMOUSEUPMASK|NX_LMOUSEDRAGGEDMASK)
        !            81: #define Shift(e) (e->flags&(NX_NEXTLSHIFTKEYMASK|NX_NEXTRSHIFTKEYMASK))
        !            82: #ifndef abs
        !            83: #define abs(x) (((x)<0)? -(x) : (x))
        !            84: #endif
        !            85: 
        !            86: int
        !            87: aMouseMoved(NXPoint *o, int n)
        !            88: {                              /* true if mouse moves > n pixels from 'o' */
        !            89:     NXEvent            *e;
        !            90:     NXPoint             p;
        !            91:     float               d;
        !            92: 
        !            93:     do {
        !            94:        e = [NXApp getNextEvent:mask];
        !            95:        p = e->location;
        !            96:        d = abs(p.x - o->x);
        !            97:        if (d < abs(p.y - o->y))
        !            98:            d = abs(p.y - o->y);
        !            99:     } while (e->type != NX_LMOUSEUP && d < n);
        !           100:     *o = p;
        !           101:     return e->type != NX_LMOUSEUP;
        !           102: }
        !           103: 
        !           104: #define COPYPOINT(A, B) A.x = B.x; A.y = B.y
        !           105: - mouseDown:(NXEvent *)e
        !           106: {
        !           107:     NXPoint             hit, me;
        !           108:     int                 oldMask;
        !           109:     NXEvent             saveEvent;
        !           110:     Pasteboard         *dragPasteboard;
        !           111: 
        !           112:     oldMask = [window eventMask];
        !           113:     [window setEventMask:(oldMask | mask)];
        !           114:     saveEvent = *e;
        !           115:     hit = e->location;
        !           116:     COPYPOINT(me, hit);
        !           117:     [self convertPoint:&me fromView:nil];
        !           118: 
        !           119:     if (((me.x <= 7.0) || (me.x >= (bounds.size.width - 7.0))) ||
        !           120:        ((me.y <= 7.0) || (me.y >= (bounds.size.height - 7.0)))) {
        !           121:        if (sel) {
        !           122:            sel = NO;
        !           123:            [self display];
        !           124:        } else {
        !           125:            sel = YES;
        !           126:            [self display];
        !           127:        }
        !           128:     } else {
        !           129:        if (aMouseMoved(&hit, 4)) {
        !           130:            NXRect              dragRect;
        !           131: 
        !           132:            [self convertPoint:&hit fromView:nil];
        !           133:            [self getBounds:&dragRect];
        !           134:            dragRect.origin.x = 8;
        !           135:            dragRect.origin.y = 8;
        !           136:            dragPasteboard = [Pasteboard newName:NXDragPboard];
        !           137:            [dragPasteboard declareTypes:&TransPboardType num:1 owner:self];
        !           138:            dragObject = nil;
        !           139: 
        !           140:            [self dragImage:image at:&(dragRect.origin) offset :&hit
        !           141:             event:&saveEvent pasteboard:dragPasteboard
        !           142:             source:self slideBack:YES];
        !           143:        }
        !           144:     }
        !           145:     return[super mouseDown:e];
        !           146: }
        !           147: 
        !           148: - transaction:requestor
        !           149: {
        !           150:     id                  farOne, nearOne;
        !           151:     double              trValue;
        !           152:     const char         *today;
        !           153:     char                buf[256];
        !           154: 
        !           155:     trValue = [valueTF doubleValue];
        !           156:     if (trValue > 0.0) {
        !           157:        nearOne = [[Transaction alloc] init];
        !           158:        farOne = [[Transaction alloc] init];
        !           159:        today = [[NXApp delegate] todaysDate];
        !           160: 
        !           161:        [nearOne setTAmount:-trValue];
        !           162:        [farOne setTAmount:trValue];
        !           163:        [nearOne setTDate:today];
        !           164:        [farOne setTDate:today];
        !           165:        strcpy(buf, "Transfer to ");
        !           166:        strcat(buf,[requestor accountName]);
        !           167:        [nearOne setTMemo:buf];
        !           168:        strcpy(buf, "Transfer from ");
        !           169:        strcat(buf,[ledgerController accountName]);
        !           170:        [farOne setTMemo:buf];
        !           171: 
        !           172:        [ledgerController appendThis:nearOne];
        !           173:        [ledgerController commit:self];
        !           174:        [valueTF setStringValue:"0.00"];
        !           175:        return farOne;
        !           176:     } else
        !           177:        return nil;
        !           178: }
        !           179: 
        !           180: //Drag Support
        !           181: - (NXDragOperation) draggingSourceOperationMaskForLocal:(BOOL)flag
        !           182: {
        !           183:     return (flag) ? NX_DragOperationCopy : NX_DragOperationNone;
        !           184: }
        !           185: 
        !           186: static BOOL 
        !           187: includesType(const NXAtom * types, NXAtom type)
        !           188: {
        !           189:     if (types)
        !           190:        while (*types)
        !           191:            if (*types++ == type)
        !           192:                return YES;
        !           193:     return NO;
        !           194: }
        !           195: 
        !           196: - (NXDragOperation) draggingEntered:(id <NXDraggingInfo >)sender
        !           197: {
        !           198:     char       *transName;
        !           199:     const char *const * types;
        !           200:     int                length;
        !           201:     id aPasteboard;
        !           202: 
        !           203:     aPasteboard = [sender draggingPasteboard];
        !           204:     for (types = [aPasteboard types]; *types; types++)
        !           205:        if (*types == TransPboardType)
        !           206:        {
        !           207:            [aPasteboard readType:*types data:&transName length:&length];
        !           208:            dragObject = [sender draggingSource];
        !           209:            [aPasteboard deallocatePasteboardData:transName length:length];
        !           210:            break;
        !           211:        }
        !           212: 
        !           213:     return (dragObject != nil) ? NX_DragOperationCopy : NX_DragOperationNone;
        !           214: }
        !           215: 
        !           216: - declareTypesFor:anObject inPasteboard:aPasteboard
        !           217: {
        !           218:     const char         *types[1] = {TransPboardType};
        !           219: 
        !           220:     if ([anObject isKindOfClassNamed:NXUniqueString(TRANS_PBOARDTYPE_NAME)]) {
        !           221:        [aPasteboard declareTypes:types num:1 owner:self];
        !           222:        dragObject = anObject;
        !           223:        dragPBoard = aPasteboard;
        !           224:        return self;
        !           225:     }
        !           226:     return nil;
        !           227: }
        !           228: 
        !           229: - draggingExited:sender
        !           230: {
        !           231:     if (includesType([[sender draggingPasteboard] types], TransPboardType)) {
        !           232:        dropping = NO;
        !           233:        dragObject = nil;
        !           234:        [self display];
        !           235:     }
        !           236:     return self;
        !           237: }
        !           238: 
        !           239: - (BOOL)performDragOperation:(id <NXDraggingInfo >)sender
        !           240: {
        !           241:     Pasteboard         *pboard = [sender draggingPasteboard];
        !           242: 
        !           243:     dropping = NO;
        !           244:     if (includesType([pboard types], TransPboardType)) {
        !           245:        [ledgerController appendThis: [dragObject transaction:ledgerController]];
        !           246:        [ledgerController commit:self];
        !           247:        [valueTF setStringValue:"0.00"];
        !           248:        return YES;
        !           249:     } else
        !           250:        return NO;
        !           251: }
        !           252: 
        !           253: @end

unix.superglobalmegacorp.com

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