Annotation of Examples/AppKit/Draw/graphicsUndo.subproj/SimpleGraphicsChange.m, revision 1.1

1.1     ! root        1: #import "drawundo.h"
        !             2: 
        !             3: /*
        !             4:  * Please refer to external documentation about Draw
        !             5:  * with Undo for information about what SimpleGraphicsChange 
        !             6:  * is and where it fits in.
        !             7:  */
        !             8: 
        !             9: @interface SimpleGraphicsChange(PrivateMethods)
        !            10: 
        !            11: - undoDetails;
        !            12: - redoDetails;
        !            13: - (BOOL)subsumeIdenticalChange:change;
        !            14: 
        !            15: @end
        !            16: 
        !            17: @implementation SimpleGraphicsChange
        !            18: 
        !            19: - saveBeforeChange
        !            20: {
        !            21:     [super saveBeforeChange];
        !            22:     [changeDetails makeObjectsPerform:@selector(recordDetail)];
        !            23: 
        !            24:     return self;
        !            25: }
        !            26: 
        !            27: - (BOOL)subsumeChange:change
        !            28: /*
        !            29:  * ChangeManager will call subsumeChange: when we are the last 
        !            30:  * completed change and a new change has just begun. We override
        !            31:  * the subsumeChange: to offer our subclasses a chance to
        !            32:  * consolidate multiple changes into a single change.
        !            33:  * First we check to make sure that the new change is of the
        !            34:  * same class as the last. If it is then we check to make sure
        !            35:  * that it's operating on the same selection. If not we simply
        !            36:  * return NO, declining to subsume it. If it does operate on
        !            37:  * the same change then we offer our subclass a change to 
        !            38:  * subsume it by sending [self subsumeIdenticalChange:change].
        !            39:  *
        !            40:  * For example, if the user presses the up arrow key to move
        !            41:  * a graphic up one pixel, that immediately becomes a complete,
        !            42:  * undoable change, as it should. If she continues to press
        !            43:  * use the arrow keys we don't want to end up making hundreds
        !            44:  * of independent move changes that would each have to be
        !            45:  * undone seperately. So instead we have the first move
        !            46:  * subsume all subsequent MoveGraphicsChanges that operate
        !            47:  * on the same selection.
        !            48:  */
        !            49: {
        !            50:     BOOL               identicalChanges = NO;
        !            51:     List               *selectedGraphics;
        !            52:     int                        count, i;
        !            53: 
        !            54:     if ([change isKindOf:[self class]]) {
        !            55:        if (!graphicsToChange) {
        !            56:            identicalChanges = YES;
        !            57:            selectedGraphics = [graphicView selectedGraphics];
        !            58:            count = [selectedGraphics count];
        !            59:            for (i = 0; (i < count) && (identicalChanges); i++) {
        !            60:                if ([graphics objectAt:i] != [selectedGraphics objectAt:i])
        !            61:                    identicalChanges = NO;
        !            62:            }
        !            63:        }
        !            64:     } 
        !            65:     if (identicalChanges)
        !            66:         return [self subsumeIdenticalChange:change];
        !            67:     else
        !            68:         return NO;
        !            69: }
        !            70: 
        !            71: - undoDetails
        !            72: {
        !            73:     [changeDetails makeObjectsPerform:@selector(undoDetail)];
        !            74:     return self;
        !            75: }
        !            76: 
        !            77: - redoDetails
        !            78: {
        !            79:     [changeDetails makeObjectsPerform:@selector(redoDetail)];
        !            80:     return self;
        !            81: }
        !            82: 
        !            83: - (BOOL)subsumeIdenticalChange:change
        !            84: {
        !            85:     return NO;
        !            86: }
        !            87: 
        !            88: @end

unix.superglobalmegacorp.com

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