8455cb213df3bee932040efab8cf54108cfc4eee
[ITKit.git] / Showcase / Controller.m
1 #import "Controller.h"
2 #import "ITTransientStatusWindow.h"
3 #import "ITTSWBackgroundView.h"
4 #import "ITTextField.h"
5 #import "ITBevelView.h"
6 #import "ITCutWindowEffect.h"
7 #import "ITDissolveWindowEffect.h"
8 #import "ITSlideHorizontallyWindowEffect.h"
9 #import "ITSlideVerticallyWindowEffect.h"
10 #import "ITPivotWindowEffect.h"
11
12
13 #define SW_PAD    24.0
14 #define SW_SPACE  24.0
15 #define SW_MINW   211.0
16 #define SW_BORDER 32.0
17 #define SW_IMAGE  @"Library"
18
19
20 @interface Controller (ITStatusItemSupport)
21 - (void)createStatusItem;
22 - (void)removeStatusItem;
23 @end
24
25
26 @implementation Controller
27
28 - (void)awakeFromNib
29 {
30     [self createStatusItem];
31     [button setBezelStyle:1001];
32     [button setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:14]];
33     [button setTitle:@"Launch Manually"];
34     [button sizeToFit];
35     [button setFrameSize:NSMakeSize([button frame].size.width + 8, 24)];
36     [testTextField setCastsShadow:YES];
37     [tabView setAllowsDragging:YES];
38     [bevelView setBevelDepth:10];
39     statusWindow = [ITTransientStatusWindow sharedWindow];
40     [statusWindow setEntryEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]];
41     [statusWindow setExitEffect:[[ITDissolveWindowEffect alloc] initWithWindow:statusWindow]];
42     [[statusWindow entryEffect] setEffectTime:[swEntrySpeedSlider floatValue]];
43     [[statusWindow exitEffect]  setEffectTime:[swExitSpeedSlider floatValue]];
44 //  [tabView setAllowsDragging:YES];
45     [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
46 }
47
48 /*************************************************************************/
49 #pragma mark -
50 #pragma mark ITStatusItem SUPPORT
51 /*************************************************************************/
52
53 - (void)createStatusItem
54 {
55     statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar]
56                                               withLength:NSVariableStatusItemLength];
57
58     if ( [showImageCheckBox state] == NSOnState ) {
59         [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]];
60     }
61
62     if ( [useInvertedCheckBox state] == NSOnState ) {
63         [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
64     }
65
66     if ( [showTitleCheckBox state] == NSOnState ) {
67         [statusItem setTitle:@"ITStatusItem"];
68     }
69
70     [statusItem setMenu:statusItemMenu];
71
72     [statusItemMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"]
73                               action:nil
74                        keyEquivalent:@""];
75 }
76
77 - (void)removeStatusItem
78 {
79     [[statusItem statusBar] removeStatusItem:statusItem];
80     [statusItem autorelease];
81     statusItem = nil;
82 }
83
84 - (IBAction)toggleStatusItem:(id)sender
85 {
86     if ( [sender state] == NSOnState ) {
87         [self createStatusItem];
88         [showImageCheckBox   setEnabled:YES];
89         [showTitleCheckBox   setEnabled:YES];
90         [useInvertedCheckBox setEnabled:YES];
91     } else {
92         [self removeStatusItem];
93         [showImageCheckBox   setEnabled:NO];
94         [useInvertedCheckBox setEnabled:NO];
95         [showTitleCheckBox   setEnabled:NO];
96     }
97 }
98
99 - (IBAction)toggleImage:(id)sender
100 {
101     if ( [sender state] == NSOnState ) {
102         [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]];
103         [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
104         [useInvertedCheckBox setEnabled:YES];
105         [useInvertedCheckBox setState:NSOnState];
106     } else {
107         [statusItem setImage:nil];
108         [statusItem setAlternateImage:nil];
109         [useInvertedCheckBox setEnabled:NO];
110         [useInvertedCheckBox setState:NSOffState];
111     }
112 }
113
114 - (IBAction)toggleInvertedImage:(id)sender
115 {
116     if ( [sender state] == NSOnState ) {
117         [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
118     } else {
119         [statusItem setAlternateImage:nil];
120     }
121 }
122
123 - (IBAction)toggleTitle:(id)sender
124 {
125     if ( [sender state] == NSOnState ) {
126         [statusItem setTitle:@"ITStatusItem"];
127     } else {
128         [statusItem setTitle:nil];
129     }
130 }
131
132
133 /*************************************************************************/
134 #pragma mark -
135 #pragma mark ITTextView SUPPORT
136 /*************************************************************************/
137
138 - (IBAction)toggleCastsShadow:(id)sender
139 {
140     [testTextField setCastsShadow:([sender state] == NSOnState)];
141 }
142
143
144 /*************************************************************************/
145 #pragma mark -
146 #pragma mark ITTransientStatusWindow SUPPORT
147 /*************************************************************************/
148
149 - (IBAction)buildStatusWindow:(id)sender
150 {
151     NSImageView *imageView    = nil;
152     ITTextField *textField    = nil;
153     NSImage     *image        = [NSImage imageNamed:SW_IMAGE];
154     NSRect       imageRect;
155     NSRect       textRect;   
156
157     float imageWidth    = 0.0;
158     float imageHeight   = 0.0;
159     float textWidth     = 0.0;
160     float textHeight    = 0.0;
161     float contentHeight = 0.0;
162     float windowWidth   = 0.0;
163     float windowHeight  = 0.0;
164
165     NSString     *text     = [swSampleTextView string];
166     NSArray      *lines    = [text componentsSeparatedByString:@"\n"];
167     id                    oneLine  = nil;
168     NSEnumerator *lineEnum = [lines objectEnumerator];
169
170     NSFont *font           = [NSFont fontWithName:@"Lucida Grande Bold" size:18];
171     NSDictionary *attr     = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
172     
173     // Get image width and height.
174     imageWidth  = [image size].width;
175     imageHeight = [image size].height;
176     
177     // Iterate over each line to get text width and height
178     while ( oneLine = [lineEnum nextObject] ) {
179         // Get the width of one line, adding 8.0 because Apple sucks donkey rectum.
180         float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 );
181         // Add the height of this line to the total text height
182         textHeight += [oneLine sizeWithAttributes:attr].height;
183         // If this line wider than the last one, set it as the text width.
184         textWidth = ( ( textWidth > oneLineWidth ) ? textWidth : oneLineWidth );
185     }
186     
187     // Add 4.0 to the final textHeight to accomodate the shadow.
188     textHeight += 4.0;
189     NSLog(@"%f", textHeight);
190     // Set the content height to the greater of the text and image heights.
191     contentHeight = ( ( imageHeight > textHeight ) ? imageHeight : textHeight );
192     
193     // Setup the Window, and remove all its contentview's subviews.
194     windowWidth  = ( SW_PAD + imageWidth + SW_SPACE + textWidth + SW_PAD );
195     windowHeight = ( SW_PAD + contentHeight + SW_PAD );
196     [statusWindow setFrame:NSMakeRect(SW_BORDER, SW_BORDER, windowWidth, windowHeight) display:YES animate:YES];
197     [[[statusWindow contentView] subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
198     
199     // Setup, position, fill, and add the image view to the content view.
200     imageRect = NSMakeRect( SW_PAD,
201                             (SW_PAD + ((contentHeight - imageHeight) / 2)),
202                             imageWidth,
203                             imageHeight );
204     imageView = [[[NSImageView alloc] initWithFrame:imageRect] autorelease];
205     [imageView setImage:image];
206     [[statusWindow contentView] addSubview:imageView];
207     
208     // Setup, position, fill, and add the text view to the content view.
209     textRect = NSMakeRect( (SW_PAD + imageWidth + SW_SPACE),
210                            (SW_PAD + ((contentHeight - textHeight) / 2)),
211                            textWidth,
212                            textHeight);
213     textField = [[[ITTextField alloc] initWithFrame:textRect] autorelease];
214     [textField setEditable:NO];
215     [textField setSelectable:NO];
216     [textField setBordered:NO];
217     [textField setDrawsBackground:NO];
218     [textField setFont:[NSFont fontWithName:@"Lucida Grande Bold" size:18]];
219     [textField setTextColor:[NSColor whiteColor]];
220     [textField setCastsShadow:YES];
221     [textField setStringValue:text];
222     [[statusWindow contentView] addSubview:textField];
223
224     [[statusWindow contentView] setNeedsDisplay:YES];
225 }
226
227 - (IBAction)toggleStatusWindow:(id)sender
228 {
229     if ( ([statusWindow visibilityState] == ITWindowHiddenState) ||
230          ([statusWindow visibilityState] == ITWindowVanishingState) ) {
231         [[statusWindow contentView] setNeedsDisplay:YES];
232         [statusWindow appear:self];
233     } else {
234         [statusWindow vanish:self];
235     }
236 }
237
238 - (IBAction)changeWindowSetting:(id)sender
239 {
240     if ( [sender tag] == 3010 ) {
241
242         if ( [sender indexOfSelectedItem] == 0) {
243             [statusWindow setExitMode:ITTransientStatusWindowExitAfterDelay];
244         } else if ( [sender indexOfSelectedItem] == 1) {
245             [statusWindow setExitMode:ITTransientStatusWindowExitOnCommand];
246         }
247
248     } else if ( [sender tag] == 3020 ) {
249         // Not yet supported
250     } else if ( [sender tag] == 3030 ) {
251         [statusWindow setExitDelay:[sender floatValue]];
252     } else if ( [sender tag] == 3040 ) {
253         [statusWindow setVerticalPosition:[sender indexOfSelectedItem]];
254     } else if ( [sender tag] == 3050 ) {
255         [statusWindow setHorizontalPosition:[sender indexOfSelectedItem]];
256     } else if ( [sender tag] == 3060 ) {
257         [[statusWindow entryEffect] setEffectTime:[sender floatValue]];
258     } else if ( [sender tag] == 3061 ) {
259         [[statusWindow exitEffect]  setEffectTime:[sender floatValue]];
260     } else if ( [sender tag] == 3070 ) {
261     
262         if ( [sender indexOfSelectedItem] == 0 ) {
263             [statusWindow setEntryEffect:[[[ITCutWindowEffect alloc] initWithWindow:statusWindow] autorelease]];
264         } else if ( [sender indexOfSelectedItem] == 1 ) {
265             [statusWindow setEntryEffect:[[[ITDissolveWindowEffect alloc] initWithWindow:statusWindow] autorelease]];
266         } else if ( [sender indexOfSelectedItem] == 2 ) {
267             [statusWindow setEntryEffect:[[[ITSlideVerticallyWindowEffect alloc] initWithWindow:statusWindow] autorelease]];
268         } else if ( [sender indexOfSelectedItem] == 3 ) {
269             [statusWindow setEntryEffect:[[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:statusWindow] autorelease]];
270         } else if ( [sender indexOfSelectedItem] == 4 ) {
271             [statusWindow setEntryEffect:[[[ITPivotWindowEffect alloc] initWithWindow:statusWindow] autorelease]];
272         }
273
274         [[statusWindow entryEffect] setEffectTime:[swEntrySpeedSlider floatValue]];
275         
276     } else if ( [sender tag] == 3080 ) {
277
278         if ( [sender indexOfSelectedItem] == 0 ) {
279             [statusWindow setExitEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]];
280         } else if ( [sender indexOfSelectedItem] == 1 ) {
281             [statusWindow setExitEffect:[[ITDissolveWindowEffect alloc] initWithWindow:statusWindow]];
282         } else if ( [sender indexOfSelectedItem] == 2 ) {
283             [statusWindow setExitEffect:[[ITSlideVerticallyWindowEffect alloc] initWithWindow:statusWindow]];
284         } else if ( [sender indexOfSelectedItem] == 3 ) {
285             [statusWindow setExitEffect:[[ITSlideHorizontallyWindowEffect alloc] initWithWindow:statusWindow]];
286         } else if ( [sender indexOfSelectedItem] == 4 ) {
287             [statusWindow setExitEffect:[[ITPivotWindowEffect alloc] initWithWindow:statusWindow]];
288         }
289
290         [[statusWindow exitEffect] setEffectTime:[swExitSpeedSlider floatValue]];
291
292     } else if ( [sender tag] == 3090 ) {
293     
294         if ( [sender indexOfSelectedItem] == 0 ) {
295             [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundMode:ITTSWBackgroundApple];
296         } else if ( [sender indexOfSelectedItem] == 1 ) {
297             [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundMode:ITTSWBackgroundReadable];
298         } else if ( [sender indexOfSelectedItem] == 2 ) {
299             [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundMode:ITTSWBackgroundColored];
300         }
301         
302     } else if ( [sender tag] == 3100 ) {
303         [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundColor:[sender color]];
304     }
305 }
306
307
308 /*************************************************************************/
309 #pragma mark -
310 #pragma mark ITTabView SUPPORT
311 /*************************************************************************/
312
313 - (IBAction)toggleTabDragging:(id)sender
314 {
315     if ([sender state] == NSOnState) {
316         [tabView setAllowsDragging:YES];
317     } else {
318         [tabView setAllowsDragging:NO];
319     }
320 }
321
322 - (IBAction)toggleCommandDragging:(id)sender
323 {
324     if ([sender state] == NSOnState) {
325         [tabView setRequiredModifiers:NSCommandKeyMask];
326     } else {
327         [tabView setRequiredModifiers:0];
328     }
329 }
330
331 - (IBAction)toggleControlDragging:(id)sender
332 {
333 }
334
335 - (IBAction)toggleOptionDragging:(id)sender
336 {
337 }
338
339 - (IBAction)toggleShiftDragging:(id)sender
340 {
341 }
342
343
344 /*************************************************************************/
345 #pragma mark -
346 #pragma mark ITBevelView SUPPORT
347 /*************************************************************************/
348
349 - (IBAction)changeBevelViewSetting:(id)sender
350 {
351     [bevelView setBevelDepth:[sender intValue]];
352 }
353
354
355 /*************************************************************************/
356 #pragma mark -
357 #pragma mark ITButton SUPPORT
358 /*************************************************************************/
359
360
361 /*************************************************************************/
362 #pragma mark -
363 #pragma mark NSWindow DELEGATE METHODS
364 /*************************************************************************/
365
366 - (void)windowWillMiniaturize:(NSNotification *)note
367 {
368     [[note object] setMiniwindowImage:[NSImage imageNamed:@"ITStatusItem"]];
369 }
370
371
372 @end