Removing the use of private CoreGraphics APIs to draw shadows, and replacing with...
[ITKit.git] / Showcase / Controller.m
1 #import "Controller.h"
2 //#import "ITTransientStatusWindow.h"
3 #import "ITIconAndTextStatusWindow.h"
4 #import "ITTSWBackgroundView.h"
5 #import "ITTextField.h"
6 #import "ITBevelView.h"
7 #import "ITCutWindowEffect.h"
8 #import "ITDissolveWindowEffect.h"
9 #import "ITSlideHorizontallyWindowEffect.h"
10 #import "ITSlideVerticallyWindowEffect.h"
11 #import "ITPivotWindowEffect.h"
12 #import "ITZoomWindowEffect.h"
13 #import "ITMultilineTextFieldCell.h"
14
15
16 #define SW_PAD    24.0
17 #define SW_SPACE  24.0
18 #define SW_MINW   211.0
19 #define SW_BORDER 32.0
20 #define SW_IMAGE  @"Library"
21
22
23 @interface Controller (ITStatusItemSupport)
24 - (void)createStatusItem;
25 - (void)removeStatusItem;
26 @end
27
28
29 @implementation Controller
30
31 - (void)awakeFromNib
32 {
33     [self createStatusItem];
34     [button setBezelStyle:1001];
35     [button setFont:[NSFont fontWithName:@"LucidaGrande-Bold" size:14]];
36     [button setTitle:@"Launch Manually"];
37     [button sizeToFit];
38     [button setFrameSize:NSMakeSize([button frame].size.width + 8, 24)];
39     [testTextField setCastsShadow:YES];
40     [tabView setAllowsDragging:YES];
41     [bevelView setBevelDepth:10];
42     statusWindow = [ITIconAndTextStatusWindow sharedWindow];
43     [statusWindow setEntryEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]];
44     [statusWindow setExitEffect:[[ITCutWindowEffect alloc] initWithWindow:statusWindow]];
45     [[statusWindow entryEffect] setEffectTime:[swEntrySpeedSlider floatValue]];
46     [[statusWindow exitEffect]  setEffectTime:[swExitSpeedSlider floatValue]];
47     [self populateEffectPopups];
48 //  [tabView setAllowsDragging:YES];
49     [[NSColorPanel sharedColorPanel] setShowsAlpha:YES];
50     
51     [tableView setRowHeight:200];
52     [[tableView tableColumnWithIdentifier:@"custom"] setDataCell:[[[ITMultilineTextFieldCell alloc] init] autorelease]];
53     [[tableView tableColumnWithIdentifier:@"image"] setDataCell:[[[NSImageCell alloc] init] autorelease]];
54 }
55
56 /*************************************************************************/
57 #pragma mark -
58 #pragma mark ITStatusItem SUPPORT
59 /*************************************************************************/
60
61 - (void)createStatusItem
62 {
63     statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar]
64                                               withLength:NSVariableStatusItemLength];
65
66     if ( [showImageCheckBox state] == NSOnState ) {
67         [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]];
68     }
69
70     if ( [useInvertedCheckBox state] == NSOnState ) {
71         [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
72     }
73
74     if ( [showTitleCheckBox state] == NSOnState ) {
75         [statusItem setTitle:@"ITStatusItem"];
76     }
77
78     [statusItem setMenu:statusItemMenu];
79
80     [statusItemMenu addItemWithTitle:[NSString stringWithUTF8String:"★★★★★"]
81                               action:nil
82                        keyEquivalent:@""];
83 }
84
85 - (void)removeStatusItem
86 {
87     [[statusItem statusBar] removeStatusItem:statusItem];
88     [statusItem autorelease];
89     statusItem = nil;
90 }
91
92 - (IBAction)toggleStatusItem:(id)sender
93 {
94     if ( [sender state] == NSOnState ) {
95         [self createStatusItem];
96         [showImageCheckBox   setEnabled:YES];
97         [showTitleCheckBox   setEnabled:YES];
98         [useInvertedCheckBox setEnabled:YES];
99     } else {
100         [self removeStatusItem];
101         [showImageCheckBox   setEnabled:NO];
102         [useInvertedCheckBox setEnabled:NO];
103         [showTitleCheckBox   setEnabled:NO];
104     }
105 }
106
107 - (IBAction)toggleImage:(id)sender
108 {
109     if ( [sender state] == NSOnState ) {
110         [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]];
111         [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
112         [useInvertedCheckBox setEnabled:YES];
113         [useInvertedCheckBox setState:NSOnState];
114     } else {
115         [statusItem setImage:nil];
116         [statusItem setAlternateImage:nil];
117         [useInvertedCheckBox setEnabled:NO];
118         [useInvertedCheckBox setState:NSOffState];
119     }
120 }
121
122 - (IBAction)toggleInvertedImage:(id)sender
123 {
124     if ( [sender state] == NSOnState ) {
125         [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
126     } else {
127         [statusItem setAlternateImage:nil];
128     }
129 }
130
131 - (IBAction)toggleTitle:(id)sender
132 {
133     if ( [sender state] == NSOnState ) {
134         [statusItem setTitle:@"ITStatusItem"];
135     } else {
136         [statusItem setTitle:nil];
137     }
138 }
139
140
141 /*************************************************************************/
142 #pragma mark -
143 #pragma mark ITTextView SUPPORT
144 /*************************************************************************/
145
146 - (IBAction)toggleCastsShadow:(id)sender
147 {
148     [testTextField setCastsShadow:([sender state] == NSOnState)];
149 }
150
151
152 /*************************************************************************/
153 #pragma mark -
154 #pragma mark ITTransientStatusWindow SUPPORT
155 /*************************************************************************/
156
157 - (void)populateEffectPopups
158 {
159     NSArray *effects = [ITWindowEffect effectClasses];
160     int i;
161     [entryEffectPopup removeAllItems];
162     [exitEffectPopup removeAllItems];
163     for (i = 0; i < [effects count]; i++) {
164         id anItem = [effects objectAtIndex:i];
165         [entryEffectPopup addItemWithTitle:[anItem effectName]];
166         [exitEffectPopup addItemWithTitle:[anItem effectName]];
167         [[entryEffectPopup lastItem] setRepresentedObject:anItem];
168         [[exitEffectPopup lastItem] setRepresentedObject:anItem];
169     }
170 }
171
172 - (IBAction)buildStatusWindow:(id)sender
173 {
174     NSImage     *image        = [NSImage imageNamed:SW_IMAGE];
175     NSString    *text     = [swSampleTextView string];
176     [statusWindow setImage:image];
177     [statusWindow buildTextWindowWithString:text];
178 }
179
180 - (IBAction)toggleStatusWindow:(id)sender
181 {
182     if ( ([statusWindow visibilityState] == ITWindowHiddenState) ||
183          ([statusWindow visibilityState] == ITWindowVanishingState) ) {
184         [[statusWindow contentView] setNeedsDisplay:YES];
185         [statusWindow appear:self];
186     } else {
187         [statusWindow vanish:self];
188     }
189 }
190
191 - (IBAction)changeWindowSetting:(id)sender
192 {
193     if ( [sender tag] == 3010 ) {
194
195         if ( [sender indexOfSelectedItem] == 0) {
196             [statusWindow setExitMode:ITTransientStatusWindowExitAfterDelay];
197         } else if ( [sender indexOfSelectedItem] == 1) {
198             [statusWindow setExitMode:ITTransientStatusWindowExitOnCommand];
199         }
200
201     } else if ( [sender tag] == 3020 ) {
202         // Not yet supported
203     } else if ( [sender tag] == 3030 ) {
204         [statusWindow setExitDelay:[sender floatValue]];
205     } else if ( [sender tag] == 3040 ) {
206         [statusWindow setVerticalPosition:[sender indexOfSelectedItem]];
207     } else if ( [sender tag] == 3050 ) {
208         [statusWindow setHorizontalPosition:[sender indexOfSelectedItem]];
209     } else if ( [sender tag] == 3060 ) {
210         [[statusWindow entryEffect] setEffectTime:[sender floatValue]];
211     } else if ( [sender tag] == 3061 ) {
212         [[statusWindow exitEffect]  setEffectTime:[sender floatValue]];
213     } else if ( [sender tag] == 3070 ) {
214         [statusWindow setEntryEffect:[[[[[sender selectedItem] representedObject] alloc] initWithWindow:statusWindow] autorelease]];
215         [[statusWindow entryEffect] setEffectTime:[swEntrySpeedSlider floatValue]];
216     } else if ( [sender tag] == 3080 ) {
217         [statusWindow setExitEffect:[[[[[sender selectedItem] representedObject] alloc] initWithWindow:statusWindow] autorelease]];
218         [[statusWindow exitEffect] setEffectTime:[swExitSpeedSlider floatValue]];
219     } else if ( [sender tag] == 3090 ) {
220         if ( [sender indexOfSelectedItem] == 0 ) {
221             [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundMode:ITTSWBackgroundApple];
222         } else if ( [sender indexOfSelectedItem] == 1 ) {
223             [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundMode:ITTSWBackgroundReadable];
224         } else if ( [sender indexOfSelectedItem] == 2 ) {
225             [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundMode:ITTSWBackgroundColored];
226         }
227     } else if ( [sender tag] == 3100 ) {
228         [(ITTSWBackgroundView *)[statusWindow contentView] setBackgroundColor:[sender color]];
229     }
230 }
231
232
233 /*************************************************************************/
234 #pragma mark -
235 #pragma mark ITTabView SUPPORT
236 /*************************************************************************/
237
238 - (IBAction)toggleTabDragging:(id)sender
239 {
240     if ([sender state] == NSOnState) {
241         [tabView setAllowsDragging:YES];
242     } else {
243         [tabView setAllowsDragging:NO];
244     }
245 }
246
247 - (IBAction)toggleCommandDragging:(id)sender
248 {
249     if ([sender state] == NSOnState) {
250         [tabView setRequiredModifiers:NSCommandKeyMask];
251     } else {
252         [tabView setRequiredModifiers:0];
253     }
254 }
255
256 - (IBAction)toggleControlDragging:(id)sender
257 {
258 }
259
260 - (IBAction)toggleOptionDragging:(id)sender
261 {
262 }
263
264 - (IBAction)toggleShiftDragging:(id)sender
265 {
266 }
267
268
269 /*************************************************************************/
270 #pragma mark -
271 #pragma mark ITBevelView SUPPORT
272 /*************************************************************************/
273
274 - (IBAction)changeBevelViewSetting:(id)sender
275 {
276     [bevelView setBevelDepth:[sender intValue]];
277 }
278
279
280 /*************************************************************************/
281 #pragma mark -
282 #pragma mark ITButton SUPPORT
283 /*************************************************************************/
284
285
286 /*************************************************************************/
287 #pragma mark -
288 #pragma mark NSWindow DELEGATE METHODS
289 /*************************************************************************/
290
291 - (void)windowWillMiniaturize:(NSNotification *)note
292 {
293     [[note object] setMiniwindowImage:[NSImage imageNamed:@"ITStatusItem"]];
294 }
295
296 /*************************************************************************/
297 #pragma mark -
298 #pragma mark ITMultilineTextFieldCell SUPPORT
299 /*************************************************************************/
300
301 - (int)numberOfRowsInTableView:(NSTableView *)aTableView {
302     return 50;
303 }
304
305 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex {
306     if ([[aTableColumn dataCell] isKindOfClass:[ITMultilineTextFieldCell class]]) {
307         if (rowIndex%2) {
308             return [NSArray arrayWithObjects:@"Foo", @"Bar", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", @"- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex", nil];
309         } else {
310             return [NSArray arrayWithObjects:[[[NSAttributedString alloc] initWithString:@"This is a demo of ITMultilineTextFieldCell" attributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:@"Gill Sans" size:48], NSFontAttributeName, [NSColor purpleColor], NSForegroundColorAttributeName, nil]] autorelease], [[[NSAttributedString alloc] initWithString:@"Bar" attributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:@"Gadget" size:20], NSFontAttributeName, nil]] autorelease], [[[NSObject alloc] init] autorelease], nil];
311         }
312     } else if ([[aTableColumn dataCell] isKindOfClass:[NSImageCell class]]) {
313         return [NSImage imageNamed:@"NSApplicationIcon"];
314     } else {
315         return @"I like cheese";
316     }
317 }
318
319
320 @end