annotate lisp/oobr/tree-nx/TreeView.m @ 14:9ee227acff29 r19-15b90

Import from CVS: tag r19-15b90
author cvs
date Mon, 13 Aug 2007 08:48:42 +0200
parents 376386a54a3c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 #import "TreeView.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 #import "TreeButton.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 #import "NamedTree.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 #import "Line.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 // constants to determine how the buttons are laid out
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 #define BUTTONWIDTH 155.0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 #define BUTTONHEIGHT 24.0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 #define VERTSPACING 8.0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 #define HORIZSPACING 40.0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 @implementation TreeView
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 - initFrame:(const NXRect *)frameRect
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 [super initFrame:frameRect];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 [self setAutosizing:(unsigned int) (NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE)];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 currentButton = nil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 lineList = nil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 priorButton = nil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 [selectedField setNextText: selectedField];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 [selectedField setPreviousText: selectedField];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 currScale = 1.0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 [self registerForDragging];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 [self setOpaque:YES];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 - buildTreeFromNode:aNode bottom:(double)ybot
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 top:(double)ytop atX:(double)xpos parent:(NXPoint *)pos
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 { // add a button representing the node to the View
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 // This method is recursive.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 NXRect butFrame = {{(xpos + HORIZSPACING),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 (ybot + (ytop - ybot) / 2 - BUTTONHEIGHT / 2)},
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 {BUTTONWIDTH, BUTTONHEIGHT}};
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 id newButton = [[[TreeButton alloc] initFrame:&butFrame]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 setTreeNode:aNode];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 id kid, kids = [aNode branches];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 int numBranches = [kids count];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 int i, treeWidth; double diff, accum = ybot;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 NXPoint myCenter = {(NX_X(&butFrame)),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 (NX_Y(&butFrame) + BUTTONHEIGHT / 2)};
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 id newLine;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 [newButton setTitle:[aNode label]];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 [self addSubview:newButton];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 // line to parent:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 if (pos) { // NULL if root, so no line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 NXPoint parentRight = { pos->x + BUTTONWIDTH, pos->y };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 newLine = [[Line alloc] init];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 [newLine setStart:&parentRight end:&myCenter];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 [lineList addObject:newLine];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 // now add any children and the lines to them.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 for (i=numBranches - 1; i >= 0; i--) { // loop isn't entered if no kids.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 kid = [kids objectAt:i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 treeWidth = [kid width];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 diff = (treeWidth * (BUTTONHEIGHT + VERTSPACING));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 [self buildTreeFromNode:kid bottom:accum
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 top:(accum + diff + VERTSPACING)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 atX:(xpos + BUTTONWIDTH + HORIZSPACING)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 parent:&myCenter];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 accum += diff;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 - attachTree:aTree
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 int treeWidth = [aTree width];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 int treeDepth = [aTree depth];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 double height = (treeWidth * (BUTTONHEIGHT + VERTSPACING) + VERTSPACING);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 double width = (treeDepth * (BUTTONWIDTH + HORIZSPACING) + HORIZSPACING);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 treeRoot = aTree;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 if (lineList) [[lineList freeObjects] free];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 lineList = [[List alloc] init];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 // resize the View to accomodate the Buttons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 [self sizeTo:width :height];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 [self buildTreeFromNode:aTree bottom:0.0 top:height atX:0.0 parent:NULL];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 - drawSelf:(NXRect *)rects :(int)rectCount // standard rendering method
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 NXColor color = [[self window] backgroundColor];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 if (NXEqualColor(color, NX_COLORLTGRAY))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 color = NX_COLORDKGRAY;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 // PSsetgray(NX_DKGRAY);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 NXSetColor(color);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 NXRectFill(&bounds);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 // PSsetgray(NX_BLACK);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 NXSetColor(NX_COLORBLACK);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 PSsetlinewidth(2.0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 [lineList makeObjectsPerform:@selector(render)];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 [[self subviews] makeObjectsPerform:@selector(display)];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 - scale:sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 id popUp = [sender window];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 short index = [popUp indexOfItem:[popUp selectedItem]];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 // 25% 50% 75% 100% 125% 150% 200% SizeToFit
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 // 0 1 2 3 4 5 6 7
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 float factors[] = {0.25, 0.50, 0.75, 1.0, 1.25, 1.50, 2.0, 0.20};
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 NXPoint center;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 NXCoord scale = factors[index];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 // Initialize width and height bounds when view is not scaled.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 if (currScale == 1.0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 origWidth = NX_WIDTH(&bounds);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 origHeight = NX_HEIGHT(&bounds);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 // Remember the center to we can reset it after the scaling.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 center.x = NX_X(&bounds) + NX_WIDTH(&bounds) / 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 center.y = NX_Y(&bounds) + NX_HEIGHT(&bounds) / 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 // Scale the view to its new size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 if (index == 3) // 100% (Normal Size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 [self setDrawSize:origWidth :origHeight];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 currScale = 1.0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 currScale *= scale;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 [self setDrawSize:NX_WIDTH(&bounds) / currScale
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 :NX_HEIGHT(&bounds) / currScale];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 // Reset the center point
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 [self setDrawOrigin:center.x - NX_WIDTH(&bounds) / 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 :center.y - NX_HEIGHT(&bounds) / 2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 // Ensure that selected button, if any, is visible.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 [self displayBut:currentButton];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 [self update];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 - setCurrentButton:but
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 if (but)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 priorButton = currentButton;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 if (priorButton)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 [priorButton setType:NX_MOMENTARYPUSH];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 [priorButton setState:0];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 currentButton = but;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 [currentButton setType:NX_ONOFF]; [currentButton setState:1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 // [selectedField setStringValueNoCopy: [but title]];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 return but;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 - setCurrButtonByName:sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 id currBut = [self getButByName:[sender stringValue]];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 [self displayBut:[self setCurrentButton:currBut]];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 [treeRoot act:currBut];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 return currBut;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 - getButByName:(const char*)name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 id butList = [self subviews];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 id but = nil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 id currBut = nil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 int i = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 while (!currBut && (but = [butList objectAt:i++]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 if (!strcmp([but title], name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 currBut = but;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 return currBut;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 - displayButByName:sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 id but = [self getButByName:[sender stringValue]];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 if (but)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 [self displayBut:but];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 return but;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 - displayBut:but
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 NXRect butRect;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 if (but)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 [[but getBounds:&butRect] convertRectToSuperview:&butRect];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 [self scrollRectToVisible:&butRect];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 @end
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 // Color dragging support
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 BOOL includesType(const NXAtom *types, NXAtom type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 if (types)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 while (*types)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 if (*types++ == type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 return YES;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 return NO;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 @implementation TreeView(Drag)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 - registerForDragging
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 [self registerForDraggedTypes:&NXColorPboardType count:1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 return self;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 - (NXDragOperation)draggingEntered:(id <NXDraggingInfo>)sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 NXDragOperation sourceMask = [sender draggingSourceOperationMask];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 Pasteboard *pboard = [sender draggingPasteboard];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 return ((includesType([pboard types], NXColorPboardType))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 ? NX_DragOperationGeneric : NX_DragOperationNone);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 - (BOOL)prepareForDragOperation:(id <NXDraggingInfo>)sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 return YES;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 - (BOOL)performDragOperation:(id <NXDraggingInfo>)sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 Pasteboard *pboard = [sender draggingPasteboard];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 if (includesType([pboard types], NXColorPboardType))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 NXColor color = NXReadColorFromPasteboard(pboard);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 [[self window] setBackgroundColor:color];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 [self display]; // reflect color change
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 return YES;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 return NO;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 - concludeDragOperation:(id <NXDraggingInfo>)sender
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 // Return value ignored.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 return nil;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 @end