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"
14 #define SW_BORDER 32.0
15 #define SW_IMAGE @"Library"
18 @interface Controller (ITStatusItemSupport)
19 - (void)createStatusItem;
20 - (void)removeStatusItem;
24 @implementation Controller
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];
40 /*************************************************************************/
42 #pragma mark ITStatusItem SUPPORT
43 /*************************************************************************/
45 - (void)createStatusItem
47 statusItem = [[ITStatusItem alloc] initWithStatusBar:[NSStatusBar systemStatusBar]
48 withLength:NSVariableStatusItemLength];
50 if ( [showImageCheckBox state] == NSOnState ) {
51 [statusItem setImage:[NSImage imageNamed:@"ITStatusItem"]];
54 if ( [useInvertedCheckBox state] == NSOnState ) {
55 [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
58 if ( [showTitleCheckBox state] == NSOnState ) {
59 [statusItem setTitle:@"ITStatusItem"];
62 [statusItem setMenu:statusItemMenu];
65 - (void)removeStatusItem
67 [[statusItem statusBar] removeStatusItem:statusItem];
68 [statusItem autorelease];
72 - (IBAction)toggleStatusItem:(id)sender
74 if ( [sender state] == NSOnState ) {
75 [self createStatusItem];
76 [showImageCheckBox setEnabled:YES];
77 [showTitleCheckBox setEnabled:YES];
78 [useInvertedCheckBox setEnabled:YES];
80 [self removeStatusItem];
81 [showImageCheckBox setEnabled:NO];
82 [useInvertedCheckBox setEnabled:NO];
83 [showTitleCheckBox setEnabled:NO];
87 - (IBAction)toggleImage:(id)sender
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];
95 [statusItem setImage:nil];
96 [statusItem setAlternateImage:nil];
97 [useInvertedCheckBox setEnabled:NO];
98 [useInvertedCheckBox setState:NSOffState];
102 - (IBAction)toggleInvertedImage:(id)sender
104 if ( [sender state] == NSOnState ) {
105 [statusItem setAlternateImage:[NSImage imageNamed:@"ITStatusItemInv"]];
107 [statusItem setAlternateImage:nil];
111 - (IBAction)toggleTitle:(id)sender
113 if ( [sender state] == NSOnState ) {
114 [statusItem setTitle:@"ITStatusItem"];
116 [statusItem setTitle:nil];
121 /*************************************************************************/
123 #pragma mark ITTextView SUPPORT
124 /*************************************************************************/
126 - (IBAction)toggleCastsShadow:(id)sender
128 [testTextField setCastsShadow:([sender state] == NSOnState)];
132 /*************************************************************************/
134 #pragma mark ITTransientStatusWindow SUPPORT
135 /*************************************************************************/
137 - (IBAction)buildStatusWindow:(id)sender
139 NSImageView *imageView = nil;
140 ITTextField *textField = nil;
141 NSImage *image = [NSImage imageNamed:SW_IMAGE];
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;
153 NSString *text = [swSampleTextView string];
154 NSArray *lines = [text componentsSeparatedByString:@"\n"];
156 NSEnumerator *lineEnum = [lines objectEnumerator];
158 NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:18];
159 NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
161 // Get image width and height.
162 imageWidth = [image size].width;
163 imageHeight = [image size].height;
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 );
175 // Add 4.0 to the final textHeight to accomodate the shadow.
178 // Set the content height to the greater of the text and image heights.
179 contentHeight = ( ( imageHeight > textHeight ) ? imageHeight : textHeight );
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)];
187 // Setup, position, fill, and add the image view to the content view.
188 imageRect = NSMakeRect( SW_PAD,
189 (SW_PAD + ((contentHeight - imageHeight) / 2)),
192 imageView = [[[NSImageView alloc] initWithFrame:imageRect] autorelease];
193 [imageView setImage:image];
194 [[statusWindow contentView] addSubview:imageView];
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)),
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];
212 [[statusWindow contentView] setNeedsDisplay:YES];
215 - (IBAction)toggleStatusWindow:(id)sender
217 if ( ([statusWindow visibilityState] == ITWindowHiddenState) ||
218 ([statusWindow visibilityState] == ITWindowVanishingState) ) {
219 [[statusWindow contentView] setNeedsDisplay:YES];
220 [statusWindow appear:self];
222 [statusWindow vanish:self];
226 - (IBAction)changeWindowSetting:(id)sender
228 if ( [sender tag] == 3010 ) {
230 if ( [sender indexOfSelectedItem] == 0) {
231 [statusWindow setExitMode:ITTransientStatusWindowExitAfterDelay];
232 } else if ( [sender indexOfSelectedItem] == 1) {
233 [statusWindow setExitMode:ITTransientStatusWindowExitOnCommand];
236 } else if ( [sender tag] == 3020 ) {
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 ) {
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]];
261 [[statusWindow entryEffect] setEffectTime:[swSpeedSlider floatValue]];
263 } else if ( [sender tag] == 3080 ) {
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]];
277 [[statusWindow exitEffect] setEffectTime:[swSpeedSlider floatValue]];
283 /*************************************************************************/
285 #pragma mark ITTabView SUPPORT
286 /*************************************************************************/
288 - (IBAction)toggleTabDragging:(id)sender
290 if ([sender state] == NSOnState) {
291 [tabView setAllowsDragging:YES];
293 [tabView setAllowsDragging:NO];
297 - (IBAction)toggleCommandDragging:(id)sender
299 if ([sender state] == NSOnState) {
300 [tabView setRequiredModifiers:NSCommandKeyMask];
302 [tabView setRequiredModifiers:0];
306 - (IBAction)toggleControlDragging:(id)sender
310 - (IBAction)toggleOptionDragging:(id)sender
314 - (IBAction)toggleShiftDragging:(id)sender
319 /*************************************************************************/
321 #pragma mark NSWindow DELEGATE METHODS
322 /*************************************************************************/
324 - (void)windowWillMiniaturize:(NSNotification *)note
326 [[note object] setMiniwindowImage:[NSImage imageNamed:@"ITStatusItem"]];