Annotation of Examples/AppKit/Draw/Ruler.m, revision 1.1.1.1

1.1       root        1: #import "draw.h"
                      2: 
                      3: /*
                      4:  * This Ruler should really look at the NXMeasurementUnit default
                      5:  * and, based on that, use the proper units (whether centimeters
                      6:  * or inches) rather than just always using inches.
                      7:  */
                      8: 
                      9: #define LINE_X (15.0)
                     10: #define WHOLE_HT (10.0)
                     11: #define HALF_HT (8.0)
                     12: #define QUARTER_HT (4.0)
                     13: #define EIGHTH_HT (2.0)
                     14: #define NUM_X (3.0)
                     15: 
                     16: #define WHOLE (72)
                     17: #define HALF (WHOLE/2)
                     18: #define QUARTER (WHOLE/4)
                     19: #define EIGHTH (WHOLE/8)
                     20: 
                     21: @implementation Ruler
                     22: 
                     23: + (NXCoord)width
                     24: {
                     25:     return 23.0;
                     26: }
                     27: 
                     28: - initFrame:(const NXRect *)frameRect
                     29: {
                     30:     [super initFrame:frameRect];
                     31:     [self setFont:[Font systemFontOfSize:8.0 matrix:NX_IDENTITYMATRIX]];
                     32:     startX = [[self class] width];
                     33:     return self;
                     34: }
                     35: 
                     36: - setFlipped:(BOOL)flag
                     37: /*
                     38:  * This view doesn't work when it's "flipped," so we
                     39:  * recycle that idea to mean whether the ruler has "0" at
                     40:  * the origin of the view or not.
                     41:  */
                     42: {
                     43:     flipped = flag ? YES : NO;
                     44:     return self;
                     45: }
                     46: 
                     47: - setFont:(Font *)aFont
                     48: {
                     49:     NXCoord as, lh;
                     50: 
                     51:     font = aFont;
                     52:     NXTextFontInfo(aFont, &as, &descender, &lh);
                     53:     if (descender < 0.0) descender = -1.0 * descender;
                     54: 
                     55:     return self;
                     56: }
                     57: 
                     58: - drawHorizontal:(const NXRect *)rects
                     59: {
                     60:     NXRect line, clip;
                     61:     int curPos, last, mod, i, j;
                     62: 
                     63:     PSsetgray(NX_LTGRAY);
                     64:     NXRectFill(rects);
                     65: 
                     66:     if (lastlp >= rects->origin.x && lastlp < rects->origin.x + rects->size.width) lastlp = -1.0;
                     67:     if (lasthp >= rects->origin.x && lasthp < rects->origin.x + rects->size.width) lasthp = -1.0;
                     68: 
                     69:     line = bounds;                             /* draw bottom line */
                     70:     line.size.height = 1.0;
                     71:     PSsetgray(NX_DKGRAY);
                     72:     if (NXIntersectionRect(rects, &line)) NXRectFill(&line);
                     73: 
                     74:     line = bounds;
                     75:     line.size.width = 1.0;
                     76:     line.origin.x = startX - 1.0;
                     77:     if (NXIntersectionRect(rects, &line)) NXRectFill(&line);
                     78: 
                     79:     line = bounds;                             /* draw ruler line */
                     80:     line.origin.y = LINE_X;
                     81:     line.size.height = 1.0;
                     82:     line.origin.x = startX;
                     83:     line.size.width = bounds.size.width - startX;
                     84: 
                     85:     PSsetgray(NX_BLACK);
                     86:     if (NXIntersectionRect(rects, &line)) NXRectFill(&line);
                     87: 
                     88:     clip = *rects;
                     89:     clip.origin.x = startX;
                     90:     clip.size.width = bounds.size.width - startX;
                     91:     if (NXIntersectionRect(rects, &clip)) {
                     92:        curPos = (int)(NX_X(&clip) - startX);
                     93:        last = (int)(NX_MAXX(&clip) - startX);
                     94:        if (mod = (curPos % EIGHTH)) curPos -= mod;
                     95:        if (mod = (last % EIGHTH)) last -= mod;
                     96:        line.size.width = 1.0;
                     97:        [font set];
                     98:        for (j = curPos; j <= last; j += EIGHTH) {
                     99:            i = flipped ? bounds.size.width - j : j;
                    100:            line.origin.x =  startX + (float)i - (flipped ? 1.0 : 0.0);
                    101:            if (!(i % WHOLE)) {
                    102:                char buf[10];
                    103:                line.origin.y = LINE_X - WHOLE_HT;
                    104:                line.size.height = WHOLE_HT;
                    105:                NXRectFill(&line);
                    106:                PSmoveto(((float) j + NUM_X) + startX, descender + line.origin.y - 2.0);
                    107:                sprintf(buf, "%d", i / WHOLE);
                    108:                PSshow(buf);
                    109:            } else if (!(i % HALF)) {
                    110:                line.origin.y = LINE_X - HALF_HT;
                    111:                line.size.height = HALF_HT;
                    112:                NXRectFill(&line);
                    113:            } else if (!(i % QUARTER)) {
                    114:                line.origin.y = LINE_X - QUARTER_HT;
                    115:                line.size.height = QUARTER_HT;
                    116:                NXRectFill(&line);
                    117:            } else if (!(i % EIGHTH)) {
                    118:                line.origin.y = LINE_X - EIGHTH_HT;
                    119:                line.size.height = EIGHTH_HT;
                    120:                NXRectFill(&line);
                    121:            }
                    122:        }
                    123:     }
                    124: 
                    125:     return self;
                    126: }
                    127: 
                    128: 
                    129: - drawVertical:(const NXRect *)rects
                    130: {
                    131:     NXRect line, clip;
                    132:     int curPos, last, mod, i, j;
                    133: 
                    134:     PSsetgray(NX_LTGRAY);
                    135:     NXRectFill(rects);
                    136: 
                    137:     if (lastlp >= rects->origin.y && lastlp < rects->origin.y + rects->size.height) lastlp = -1.0;
                    138:     if (lasthp >= rects->origin.y && lasthp < rects->origin.y + rects->size.height) lasthp = -1.0;
                    139: 
                    140:     line = bounds;                             /* draw bottom line */
                    141:     line.origin.x = bounds.size.width - 1.0;
                    142:     line.size.width = 1.0;
                    143:     PSsetgray(NX_DKGRAY);
                    144:     if (NXIntersectionRect(rects, &line)) NXRectFill(&line);
                    145: 
                    146:     line = bounds;                             /* draw ruler line */
                    147:     line.origin.x = bounds.size.width - LINE_X - 2.0;
                    148:     line.size.width = 1.0;
                    149:     PSsetgray(NX_BLACK);
                    150:     if (NXIntersectionRect(rects, &line)) NXRectFill(&line);
                    151: 
                    152:     clip = *rects;
                    153:     line.origin.x++;
                    154:     if (NXIntersectionRect(rects, &clip)) {
                    155:        curPos = (int)(NX_Y(&clip));
                    156:        last = (int)(NX_MAXY(&clip));
                    157:        if (flipped) {
                    158:            if (mod = ((int)(bounds.size.height - curPos) % EIGHTH)) curPos += mod;
                    159:            if (mod = ((int)(bounds.size.height - last) % EIGHTH)) last += mod;
                    160:        } else {
                    161:            if (mod = (curPos % EIGHTH)) curPos -= mod;
                    162:            if (mod = (last % EIGHTH)) last -= mod;
                    163:        }
                    164:        line.size.height = 1.0;
                    165:        [font set];
                    166:        for (j = curPos; j <= last; j += EIGHTH) {
                    167:            i = flipped ? bounds.size.height - j : j;
                    168:            line.origin.y = (float)j - (flipped ? 1.0 : 0.0);
                    169:            if (!(i % WHOLE)) {
                    170:                char buf[10];
                    171:                line.size.width = WHOLE_HT;
                    172:                NXRectFill(&line);
                    173:                PSmoveto(line.origin.x + 5.0, (float)j + (flipped ? - 10.0 : 2.0));
                    174:                sprintf(buf, "%d", i / WHOLE);
                    175:                PSshow(buf);
                    176:            } else if (!(i % HALF)) {
                    177:                line.size.width = HALF_HT;
                    178:                NXRectFill(&line);
                    179:            } else if (!(i % QUARTER)) {
                    180:                line.size.width = QUARTER_HT;
                    181:                NXRectFill(&line);
                    182:            } else if (!(i % EIGHTH)) {
                    183:                line.size.width = EIGHTH_HT;
                    184:                NXRectFill(&line);
                    185:            }
                    186:        }
                    187:     }
                    188: 
                    189:     return self;
                    190: }
                    191: 
                    192: - drawSelf:(const NXRect *) rects :(int)rectCount
                    193: {
                    194:     if (frame.size.width < frame.size.height) {
                    195:        [self drawVertical:rects];
                    196:     } else {
                    197:        [self drawHorizontal:rects];
                    198:     }
                    199:     return self;
                    200: }
                    201: 
                    202: 
                    203: #define SETPOSITION(value) (isVertical ? (rect.origin.y = value - (absolute ? 0.0 : 1.0)) : (rect.origin.x = value + (absolute ? 0.0 : startX)))
                    204: #define SETSIZE(value) (isVertical ? (rect.size.height = value) : (rect.size.width = value))
                    205: #define SIZE (isVertical ? rect.size.height : rect.size.width)
                    206: 
                    207: - doShowPosition:(NXCoord)lp :(NXCoord)hp absolute:(BOOL)absolute
                    208: {
                    209:     NXRect rect;
                    210:     BOOL isVertical = (frame.size.width < frame.size.height);
                    211: 
                    212:     rect = bounds;
                    213: 
                    214:     if (!absolute && !isVertical) {
                    215:        if (lp < 0.0) lp -= startX;
                    216:        if (hp < 0.0) hp -= startX;
                    217:     }
                    218: 
                    219:     SETSIZE(1.0);
                    220:     lastlp = SETPOSITION(lp);
                    221:     NXHighlightRect(&rect);
                    222:     lasthp = SETPOSITION(hp);
                    223:     NXHighlightRect(&rect);
                    224: 
                    225:     return self;
                    226: }
                    227: 
                    228: - showPosition:(NXCoord)lp :(NXCoord)hp
                    229: {
                    230:     [self lockFocus];
                    231:     if (notHidden) [self doShowPosition:lastlp :lasthp absolute:YES];
                    232:     [self doShowPosition:lp :hp absolute:NO];
                    233:     [self unlockFocus];
                    234:     notHidden = YES;
                    235:     return self;
                    236: }
                    237: 
                    238: - hidePosition
                    239: {
                    240:     if (notHidden) {
                    241:        [self lockFocus];
                    242:        [self doShowPosition:lastlp :lasthp absolute:YES];
                    243:        [self unlockFocus];
                    244:        notHidden = NO;
                    245:     }
                    246:     return self;
                    247: }
                    248: 
                    249: @end

unix.superglobalmegacorp.com

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