|
|
1.1 root 1: #import "draw.h"
2:
3: @implementation GridView
4: /*
5: * This class is the heart of the Grid Inspector modal panel.
6: * It implements the draggable grid. It also provides the external
7: * interface (i.e. the runModalForGraphicView: method) to running
8: * the panel. It is a good example of a modal panel.
9: * See the Interface Builder file for a better understanding of
10: * the outlets and actions sent by controls in the window containing
11: * the GridView.
12: */
13:
14: - runModalForGraphicView:(GraphicView *)view
15: {
16: int gridSpacing;
17: float gridGray;
18:
19: if (graphicView != view) {
20: graphicView = view;
21: gridSpacing = [view gridSpacing];
22: [spacing setIntValue:(gridSpacing >= 4 ? gridSpacing : 10)];
23: gridGray = [view gridGray];
24: [grayField setFloatValue:gridGray];
25: [graySlider setFloatValue:gridGray];
26: [self display];
27: }
28:
29: [NXApp runModalFor:window];
30: [window orderOut:self];
31:
32: return self;
33: }
34:
35: - drawGrid:(int)grid
36: {
37: NXCoord x, y, max, increment;
38:
39: increment = (NXCoord)grid;
40: max = bounds.origin.y + bounds.size.height;
41: for (y = bounds.origin.y; y < max; y += increment) {
42: PSmoveto(0.0, y);
43: PSlineto(bounds.size.width, y);
44: }
45: max = bounds.origin.x + bounds.size.width;
46: for (x = bounds.origin.x; x < max; x += increment) {
47: PSmoveto(x, 0.0);
48: PSlineto(x, bounds.size.height);
49: }
50: PSstroke();
51:
52: return self;
53: }
54:
55: - drawSelf:(const NXRect *)rects :(int)rectCount
56: {
57: int grid;
58: float gray;
59:
60: grid = [spacing intValue];
61: grid = MAX(grid, 0.0);
62: PSsetgray(NX_WHITE);
63: NXRectFillList(rects, rectCount);
64: if (grid >= 4) {
65: gray = [grayField floatValue];
66: gray = MIN(gray, 1.0);
67: gray = MAX(gray, 0.0);
68: PSsetgray(gray);
69: PSsetlinewidth(0.0);
70: [self drawGrid:grid];
71: }
72: PSsetgray(NX_BLACK);
73: NXFrameRect(&bounds);
74:
75: return self;
76: }
77:
78: - mouseDown:(NXEvent *)event
79: {
80: NXPoint p, start;
81: int grid, gridCount;
82:
83: start = event->location;
84: [self convertPoint:&start fromView:nil];
85: grid = MAX([spacing intValue], 1.0);
86: gridCount = (int)MAX(start.x, start.y) / grid;
87: gridCount = MAX(gridCount, 1.0);
88:
89: [window addToEventMask:NX_MOUSEDRAGGEDMASK|NX_MOUSEUPMASK];
90:
91: event = [NXApp getNextEvent:NX_MOUSEDRAGGEDMASK|NX_MOUSEUPMASK];
92: while (event->type != NX_MOUSEUP) {
93: p = event->location;
94: [self convertPoint:&p fromView:nil];
95: grid = (int)MAX(p.x, p.y) / gridCount;
96: grid = MAX(grid, 1.0);
97: if (grid != [spacing intValue]) {
98: [form abortEditing];
99: [spacing setIntValue:grid];
100: [self display];
101: }
102: event = [NXApp getNextEvent:NX_MOUSEDRAGGEDMASK|NX_MOUSEUPMASK];
103: }
104:
105: return self;
106: }
107:
108: /* Target/Action methods */
109:
110: - show:sender
111: {
112: [NXApp stopModal];
113: [graphicView setGridSpacing:[spacing intValue] andGray:[grayField floatValue]];
114: [graphicView setGridVisible:YES];
115: return self;
116: }
117:
118: - off:sender
119: {
120: [NXApp stopModal];
121: [graphicView setGridSpacing:1];
122: return self;
123: }
124:
125: - cancel:sender
126: {
127: [NXApp stopModal];
128: return self;
129: }
130:
131: - changeSpacing:sender
132: {
133: return [self display];
134: }
135:
136: - changeGray:sender
137: {
138: if (sender == graySlider) {
139: [form abortEditing];
140: [grayField setFloatValue:[sender floatValue]];
141: } else {
142: [graySlider setFloatValue:[sender floatValue]];
143: }
144: return [self display];
145: }
146:
147: /* IB outlet-setting methods */
148:
149: - setAppIconButton:anObject
150: {
151: [anObject setIcon:"appIcon"];
152: return self;
153: }
154:
155: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.