/[gnustep]/gnustep/usr-apps/gworkspace/GWorkspace/TShelf/TShelfView.m
ViewVC logotype

Contents of /gnustep/usr-apps/gworkspace/GWorkspace/TShelf/TShelfView.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (show annotations) (download)
Tue Sep 30 15:38:05 2003 UTC (20 years, 6 months ago) by esersale
Branch: MAIN
Changes since 1.5: +5 -0 lines
*** empty log message ***

1 /* TShelfView.m
2 *
3 * Copyright (C) 2003 Free Software Foundation, Inc.
4 *
5 * Author: Enrico Sersale <enrico@imago.ro>
6 * Date: August 2001
7 *
8 * This file is part of the GNUstep GWorkspace application
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 */
24
25
26 #include <AppKit/AppKit.h>
27 #ifdef GNUSTEP
28 #include "GWLib.h"
29 #else
30 #include <GWorkspace/GWLib.h>
31 #endif
32 #include "TShelfView.h"
33 #include "TShelfViewItem.h"
34 #include "GWorkspace.h"
35 #include "GNUstep.h"
36
37 @implementation TShelfView
38
39 - (id)initWithFrame:(NSRect)rect
40 {
41 self = [super initWithFrame: rect];
42
43 if (self) {
44 buttw = 10;
45
46 ASSIGN (items, [NSMutableArray array]);
47 ASSIGN (font, [NSFont boldSystemFontOfSize: 0]);
48
49 hideButton = [[NSButton alloc] initWithFrame: NSMakeRect (0,0, buttw, rect.size.height)];
50 [hideButton setImage: [NSImage imageNamed: @"Dimple.tiff"]];
51 [hideButton setImagePosition: NSImageOnly];
52 [hideButton setTarget: self];
53 [hideButton setAction: @selector (hideShowTabs:)];
54 [self addSubview: hideButton];
55
56 lastItem = nil;
57 selected = nil;
58 hiddentabs = NO;
59 }
60
61 return self;
62 }
63
64 - (void)dealloc
65 {
66 RELEASE (items);
67 RELEASE (font);
68 RELEASE (hideButton);
69
70 [super dealloc];
71 }
72
73 - (void)addTabItem:(TShelfViewItem *)item
74 {
75 [self insertTabItem: item atIndex: [items count]];
76 }
77
78 - (BOOL)insertTabItem:(TShelfViewItem *)item
79 atIndex:(int)index
80 {
81 if (lastItem) {
82 if (index == [items count]) {
83 index--;
84 }
85 RETAIN (lastItem);
86 [items removeObject: lastItem];
87 }
88
89 [item setTShelfView: self];
90 [items insertObject: item atIndex: index];
91
92 if (lastItem) {
93 [items insertObject: lastItem atIndex: [items count]];
94 RELEASE (lastItem);
95 }
96
97 return YES;
98 }
99
100 - (void)setLastTabItem:(TShelfViewItem *)item
101 {
102 lastItem = item;
103 [item setTShelfView: self];
104 [items insertObject: item atIndex: [items count]];
105 }
106
107 - (BOOL)removeTabItem:(TShelfViewItem *)item
108 {
109 unsigned i = [items indexOfObject: item];
110
111 if ((i == NSNotFound) || (item == lastItem)) {
112 return NO;
113 }
114
115 if ([item isEqual: selected]) {
116 [[selected view] removeFromSuperview];
117 selected = nil;
118 }
119
120 [items removeObjectAtIndex: i];
121
122 return YES;
123 }
124
125 - (int)indexOfItem:(TShelfViewItem *)item
126 {
127 return [items indexOfObject: item];
128 }
129
130 - (TShelfViewItem *)selectedTabItem
131 {
132 if ((selectedItem == NSNotFound) || ([items count] == 0)) {
133 return nil;
134 }
135
136 return [items objectAtIndex: selectedItem];
137 }
138
139 - (void)selectTabItem:(TShelfViewItem *)item
140 {
141 NSView *selectedView;
142
143 if (selected != nil) {
144 [selected setTabState: NSBackgroundTab];
145 [[selected view] removeFromSuperview];
146 }
147
148 selected = item;
149
150 selectedItem = [items indexOfObject: selected];
151 [selected setTabState: NSSelectedTab];
152
153 selectedView = [selected view];
154
155 if (selectedView != nil) {
156 [self addSubview: selectedView];
157 [selectedView setFrame: [self contentRect]];
158 [selectedView resizeWithOldSuperviewSize: [selectedView frame].size];
159 [[self window] makeFirstResponder: [selected initialFirstResponder]];
160 }
161
162 [self setNeedsDisplay: YES];
163 }
164
165 - (void)selectTabItemAtIndex:(int)index
166 {
167 if (index < 0) {
168 [self selectTabItem: nil];
169 } else {
170 [self selectTabItem: [items objectAtIndex: index]];
171 }
172 }
173
174 - (NSFont *)font
175 {
176 return font;
177 }
178
179 - (NSRect)contentRect
180 {
181 NSRect cRect = [self bounds];
182
183 cRect.origin.y += 1;
184 cRect.origin.x += (0.5 + buttw);
185 cRect.size.width -= (2 + buttw);
186 cRect.size.height -= 26.5;
187
188 return cRect;
189 }
190
191 - (void)drawRect:(NSRect)rect
192 {
193 float borderThickness;
194 int howMany = [items count];
195 int i;
196 int *states = NSZoneMalloc (NSDefaultMallocZone(), sizeof(int) * howMany);
197 int previousState = 0;
198 NSRect aRect = [self bounds];
199 NSPoint p = aRect.origin;
200 NSSize s = aRect.size;
201 NSRect buttRect = NSMakeRect(p.x - 2 + buttw, p.y, s.width + 4 - buttw, s.height - 24);
202 float lastxspace = 34;
203 float itemxspace = (aRect.size.width - lastxspace - buttw) / (howMany - 1);
204 NSImage *backImage = [[GWorkspace gworkspace] tshelfBackground];
205
206 if (backImage) {
207 [backImage compositeToPoint: NSMakePoint (0.0, 0.0)
208 operation: NSCompositeSourceOver];
209 }
210
211 aRect.size.height -= 24;
212
213 NSDrawButton(buttRect, NSZeroRect);
214 borderThickness = 2;
215
216 if (selected == NO) {
217 [self selectTabItemAtIndex: 0];
218 }
219
220 for (i = 0; i < howMany; i++) {
221 states[i] = [[items objectAtIndex: i] tabState];
222 }
223
224 for (i = howMany - 1; i >= 0; i--) {
225 NSRect r;
226 NSPoint iP;
227 TShelfViewItem *anItem = [items objectAtIndex: i];
228 NSTabState itemState;
229 NSBezierPath *bpath;
230
231 itemState = [anItem tabState];
232
233 if (i == (howMany - 1)) {
234 iP.x = aRect.size.width;
235 iP.y = aRect.size.height;
236
237 iP.x = aRect.size.width - lastxspace;
238
239 if (itemState == NSSelectedTab) {
240 iP.y -= 1;
241 if (howMany > 1) {
242 [[NSImage imageNamed: @"tabUnSelectToSelectedJunction.tiff"]
243 compositeToPoint: iP operation: NSCompositeSourceOver];
244 } else {
245 [[NSImage imageNamed: @"tabSelectedLeft.tiff"]
246 compositeToPoint: iP operation: NSCompositeSourceOver];
247 }
248 iP.y += 1;
249
250 } else if (itemState == NSBackgroundTab) {
251 if (howMany > 1) {
252 previousState = states[i - 1];
253
254 if (previousState == NSSelectedTab) {
255 iP.y -= 1;
256 [[NSImage imageNamed: @"tabSelectedToUnSelectedJunction.tiff"]
257 compositeToPoint: iP operation: NSCompositeSourceOver];
258 iP.y += 1;
259 } else {
260 [[NSImage imageNamed: @"tabUnSelectedJunction.tiff"]
261 compositeToPoint: iP operation: NSCompositeSourceOver];
262 }
263
264 } else {
265 [[NSImage imageNamed: @"tabUnSelectedLeft.tiff"]
266 compositeToPoint: iP operation: NSCompositeSourceOver];
267 }
268 }
269
270 r.origin.x = iP.x + 13;
271 r.origin.y = aRect.size.height;
272 r.size.width = lastxspace - 13;
273 r.size.height = 23;
274
275 bpath = [NSBezierPath bezierPath];
276 [bpath setLineWidth: 1];
277 [bpath moveToPoint: NSMakePoint(r.origin.x, r.origin.y + 24)];
278 [bpath relativeLineToPoint: NSMakePoint(r.size.width, 0)];
279 [[NSColor whiteColor] set];
280 [bpath stroke];
281
282 [anItem drawImage: [NSImage imageNamed: @"DragableDocument.tiff"]
283 inRect: r];
284
285 } else {
286 iP.x -= itemxspace;
287 iP.y = aRect.size.height;
288
289 if (i != 0) {
290 previousState = states[i - 1];
291
292 if (itemState == NSSelectedTab) {
293 iP.y -= 1;
294 [[NSImage imageNamed: @"tabUnSelectToSelectedJunction.tiff"]
295 compositeToPoint: iP operation: NSCompositeSourceOver];
296 } else if (itemState == NSBackgroundTab) {
297 if (previousState == NSSelectedTab) {
298 iP.y -= 1;
299 [[NSImage imageNamed: @"tabSelectedToUnSelectedJunction.tiff"]
300 compositeToPoint: iP operation: NSCompositeSourceOver];
301 iP.y += 1;
302 } else {
303 [[NSImage imageNamed: @"tabUnSelectedJunction.tiff"]
304 compositeToPoint: iP operation: NSCompositeSourceOver];
305 }
306 }
307
308 r.origin.x = iP.x + 13;
309 r.origin.y = aRect.size.height;
310 r.size.width = itemxspace - 13;
311 r.size.height = 23;
312
313 } else {
314 r.origin.x = iP.x;
315 r.origin.y = aRect.size.height;
316 r.size.width = itemxspace;
317 r.size.height = 23;
318 }
319
320 // DPSsetgray(ctxt, 1);
321
322 bpath = [NSBezierPath bezierPath];
323 [bpath setLineWidth: 1];
324 [bpath moveToPoint: NSMakePoint(r.origin.x, r.origin.y + 24)];
325 [bpath relativeLineToPoint: NSMakePoint(r.size.width, 0)];
326 [[NSColor whiteColor] set];
327 [bpath stroke];
328
329 [anItem drawLabelInRect: r];
330 }
331 }
332
333 NSZoneFree (NSDefaultMallocZone(), states);
334 }
335
336
337 - (BOOL)isOpaque
338 {
339 return NO;
340 }
341
342 - (TShelfViewItem*)tabItemAtPoint:(NSPoint)point
343 {
344 int howMany = [items count];
345 int i;
346
347 point = [self convertPoint: point fromView: nil];
348
349 for (i = 0; i < howMany; i++) {
350 TShelfViewItem *anItem = [items objectAtIndex: i];
351
352 if(NSPointInRect(point, [anItem tabRect])) {
353 return anItem;
354 }
355 }
356
357 return nil;
358 }
359
360 - (TShelfViewItem *)lastTabItem
361 {
362 return lastItem;
363 }
364
365 - (NSArray *)items
366 {
367 return items;
368 }
369
370 - (void)setHiddenTabs:(BOOL)value
371 {
372 NSRect frame = [[self window] frame];
373 NSRect scrframe = [[NSScreen mainScreen] frame];
374 NSRect winrect;
375
376 hiddentabs = value;
377
378 if (hiddentabs == NO) {
379 winrect = NSMakeRect(frame.origin.x, frame.origin.y,
380 scrframe.size.width, frame.size.height);
381 [[self window] setFrame: winrect display: YES];
382 } else {
383 winrect = NSMakeRect(frame.origin.x, frame.origin.y, 10, frame.size.height);
384 [[self window] setFrame: winrect display: YES];
385 }
386 }
387
388 - (void)hideShowTabs:(id)sender
389 {
390 NSRect frame = [[self window] frame];
391 NSRect scrframe = [[NSScreen mainScreen] frame];
392 NSRect winrect;
393
394 if (hiddentabs) {
395 winrect = NSMakeRect(frame.origin.x, frame.origin.y,
396 scrframe.size.width, frame.size.height);
397 [[self window] setFrame: winrect display: YES];
398 hiddentabs = NO;
399 } else {
400 winrect = NSMakeRect(frame.origin.x, frame.origin.y, 10, frame.size.height);
401 [[self window] setFrame: winrect display: YES];
402 hiddentabs = YES;
403 }
404
405 [[GWorkspace gworkspace] makeTshelfBackground];
406 }
407
408 - (BOOL)hiddenTabs
409 {
410 return hiddentabs;
411 }
412
413 - (void)mouseDown:(NSEvent *)theEvent
414 {
415 NSPoint location = [theEvent locationInWindow];
416 TShelfViewItem *anItem = [self tabItemAtPoint: location];
417
418 if (anItem && ([anItem isEqual: selected] == NO)) {
419 [self selectTabItem: anItem];
420 }
421 }
422
423 - (BOOL)acceptsFirstResponder
424 {
425 return YES;
426 }
427
428 - (BOOL)acceptsFirstMouse:(NSEvent*)theEvent
429 {
430 return YES;
431 }
432
433 @end

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26