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