* Adium is the legal property of its developers, whose names are listed in the copyright file included * with this source distribution. * This program is free software; you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * You should have received a copy of the GNU General Public License along with this program; if not, * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #import "ESPurpleRequestWindowController.h" #import <AdiumLibpurple/SLPurpleCocoaAdapter.h> #define MULTILINE_WINDOW_NIB @"PurpleMultilineRequestWindow" #define SINGLELINE_WINDOW_NIB @"PurpleSinglelineRequestWindow" @interface ESPurpleRequestWindowController () - (void)showWindowWithDict:(NSDictionary *)infoDict multiline:(BOOL)multiline; - (NSDictionary *)translatedInfoDict:(NSDictionary *)inDict; @implementation ESPurpleRequestWindowController + (ESPurpleRequestWindowController *)showInputWindowWithDict:(NSDictionary *)infoDict ESPurpleRequestWindowController *requestWindowController; BOOL multiline = [[infoDict objectForKey:@"Multiline"] boolValue]; if ((requestWindowController = [[self alloc] initWithWindowNibName:(multiline ? MULTILINE_WINDOW_NIB : SINGLELINE_WINDOW_NIB) [requestWindowController showWindow:nil]; [[requestWindowController window] makeKeyAndOrderFront:nil]; return requestWindowController; - (id)initWithWindowNibName:(NSString *)windowNibName withDict:(NSDictionary *)infoDict multiline:(BOOL)multiline if ((self = [super initWithWindowNibName:windowNibName])) { [self showWindowWithDict:[self translatedInfoDict:infoDict] - (void)showWindowWithDict:(NSDictionary *)infoDict multiline:(BOOL)multiline NSInteger heightChange = 0; //Ensure the window is loaded windowFrame = [window frame]; //If masked, replace our textField_input with a secure one if ([[infoDict objectForKey:@"Masked"] boolValue]) { NSRect inputFrame = [textField_input frame]; NSSecureTextField *secureTextField = [[[NSSecureTextField alloc] initWithFrame:inputFrame] autorelease]; [[textField_input superview] addSubview:secureTextField]; [secureTextField setNeedsDisplay:YES]; [textField_input removeFromSuperview]; textField_input = secureTextField; //Use the supplied OK text, then shift the button left so that the right side remains in the old location in the window NSString *okText = [infoDict objectForKey:@"OK Text"]; [button_okay setTitle:(okText ? okText : AILocalizedString(@"OK",nil))]; //Use the supplied Cancel text, then shift the button left NSString *cancelText = [infoDict objectForKey:@"Cancel Text"]; [button_cancel setTitle:(cancelText ? cancelText : AILocalizedString(@"Cancel",nil))]; NSString *title = [infoDict objectForKey:@"Title"]; [[self window] setTitle:(title ? title : @"")]; NSScrollView *scrollView_primary = [textView_primary enclosingScrollView]; NSString *primary = [infoDict objectForKey:@"Primary Text"]; NSRect primaryFrame = [scrollView_primary frame]; [textView_primary setVerticallyResizable:YES]; [textView_primary setHorizontallyResizable:NO]; [textView_primary setDrawsBackground:NO]; [textView_primary setTextContainerInset:NSZeroSize]; [scrollView_primary setDrawsBackground:NO]; [textView_primary setString:(primary ? primary : @"")]; //Resize the window frame to fit the error title [textView_primary sizeToFit]; heightChange = [textView_primary frame].size.height - [scrollView_primary documentVisibleRect].size.height; primaryFrame.size.height += heightChange; primaryFrame.origin.y -= heightChange; [scrollView_primary setFrame:primaryFrame]; windowFrame.size.height += heightChange; windowFrame.origin.y -= heightChange; //Resize the window to fit the message //[window setFrame:windowFrame display:YES animate:NO]; NSString *secondary = [infoDict objectForKey:@"Secondary Text"]; NSRect originalFrame = [scrollView_secondary frame]; originalFrame.origin.y -= heightChange; [scrollView_secondary setFrame:originalFrame]; [textView_secondary setVerticallyResizable:YES]; [textView_secondary setHorizontallyResizable:NO]; [textView_secondary setDrawsBackground:NO]; [textView_secondary setTextContainerInset:NSZeroSize]; [scrollView_secondary setDrawsBackground:NO]; [textView_secondary setString:(secondary ? secondary : @"")]; //Resize the window frame to fit the error title [textView_secondary sizeToFit]; heightChange = [textView_secondary frame].size.height - [scrollView_secondary documentVisibleRect].size.height; windowFrame.size.height += heightChange; windowFrame.origin.y -= heightChange; //Resize the window to fit the message [window setFrame:windowFrame display:YES animate:NO]; NSString *defaultValue = [infoDict objectForKey:@"Default Value"]; [textField_input setStringValue:(defaultValue ? defaultValue : @"")]; [textField_input selectText:nil]; okayCallbackValue = [[infoDict objectForKey:@"OK Callback"] retain]; cancelCallbackValue = [[infoDict objectForKey:@"Cancel Callback"] retain]; userDataValue = [[infoDict objectForKey:@"userData"] retain]; - (void)doRequestInputCbValue:(NSValue *)inCallBackValue withUserDataValue:(NSValue *)inUserDataValue inputString:(NSString *)inString PurpleRequestInputCb callBack = [inCallBackValue pointerValue]; callBack([inUserDataValue pointerValue],[inString UTF8String]); - (IBAction)pressedButton:(id)sender if (sender == button_okay) { [self doRequestInputCbValue:okayCallbackValue withUserDataValue:userDataValue inputString:[[[textField_input stringValue] copy] autorelease]]; [cancelCallbackValue release]; cancelCallbackValue = nil; } else if (sender == button_cancel) { [[self window] performClose:nil]; [okayCallbackValue release]; okayCallbackValue = nil; [cancelCallbackValue release]; cancelCallbackValue = nil; [userDataValue release]; userDataValue = nil; - (void)doWindowWillClose if (cancelCallbackValue) { [self doRequestInputCbValue:cancelCallbackValue withUserDataValue:userDataValue inputString:[[[textField_input stringValue] copy] autorelease]]; * @brief Translate the strings in the info dictionary * The following declarations let genstrings know about what translations we want * AILocalizedString(@"Set your friendly name.","Title for the MSN display name setting dialogue box") * AILocalizedString(@"This is the name that other MSN buddies will see you as.", "Description for the MSN display name setting dialogue.") * AILocalizedString(@"Set your home phone number.", "Title for the dialogue prompting for your home phone number") * AILocalizedString(@"Set your work phone number.", "Title for the dialogue prompting for your work phone number") * AILocalizedString(@"Set your mobile phone number.", "Title for the dialogue prompting for your mobile phone number") - (NSDictionary *)translatedInfoDict:(NSDictionary *)inDict NSMutableDictionary *translatedDict = [inDict mutableCopy]; NSString *primary = [inDict objectForKey:@"Primary Text"]; NSString *secondary = [inDict objectForKey:@"Secondary Text"]; NSString *okText = [inDict objectForKey:@"OK Text"]; NSString *cancelText = [inDict objectForKey:@"Cancel Text"]; NSBundle *thisBundle = [NSBundle bundleForClass:[self class]]; //Replace each string with a translated version if possible [translatedDict setObject:[thisBundle localizedStringForKey:primary [translatedDict setObject:[thisBundle localizedStringForKey:secondary forKey:@"Secondary Text"]; [translatedDict setObject:[thisBundle localizedStringForKey:okText [translatedDict setObject:[thisBundle localizedStringForKey:cancelText return [translatedDict autorelease];