Rev 5721 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/** R.app : a Cocoa front end to: "R A Computer Language for Statistical Data Analysis"** R.app Copyright notes:* Copyright (C) 2004-5 The R Foundation* written by Stefano M. Iacus and Simon Urbanek*** R Copyright notes:* Copyright (C) 1995-1996 Robert Gentleman and Ross Ihaka* Copyright (C) 1998-2001 The R Development Core Team* Copyright (C) 2002-2004 The R Foundation** 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.** A copy of the GNU General Public License is available via WWW at* http://www.gnu.org/copyleft/gpl.html. You can also obtain it by* writing to the Free Software Foundation, Inc., 59 Temple Place,* Suite 330, Boston, MA 02111-1307 USA.*/#import "../RGUI.h"#import "EditorPrefPane.h"#import "../RController.h"#import "../Tools/Authorization.h"@interface EditorPrefPane (Private)- (void)setIdentifier:(NSString *)newIdentifier;- (void)setLabel:(NSString *)newLabel;- (void)setCategory:(NSString *)newCategory;- (void)setIcon:(NSImage *)newIcon;@end@implementation EditorPrefPane- (id)initWithIdentifier:(NSString *)theIdentifier label:(NSString *)theLabel category:(NSString *)theCategory{if ((self = [super init])) {[self setIdentifier:theIdentifier];[self setLabel:theLabel];[self setCategory:theCategory];NSImage *theImage = [[NSImage imageNamed:@"Rdoc"] copy];[theImage setFlipped:NO];[theImage lockFocus];[[NSColor blackColor] set];// [theIdentifier drawAtPoint:NSZeroPoint withAttributes:nil];[theImage unlockFocus];[theImage recache];[self setIcon:theImage];}return self;}- (void) dealloc{[[Preferences sharedPreferences] removeDependent: self];[super dealloc];}- (NSString *)identifier{return identifier;}- (void)setIdentifier:(NSString *)newIdentifier{id old = nil;if (newIdentifier != identifier) {old = identifier;identifier = [newIdentifier copy];[old release];}}- (NSString *)label{return label;}- (void)setLabel:(NSString *)newLabel{id old = nil;if (newLabel != label) {old = label;label = [newLabel copy];[old release];}}- (NSString *)category{return category;}- (void)setCategory:(NSString *)newCategory{id old = nil;if (newCategory != category) {old = category;category = [newCategory copy];[old release];}}- (NSImage *)icon{return icon;}- (void)setIcon:(NSImage *)newIcon{id old = nil;if (newIcon != icon) {old = icon;icon = [newIcon retain];[old release];}}// AMPrefPaneProtocol- (NSView *)mainView{if (!mainView && [NSBundle loadNibNamed:@"EditorPrefPane" owner:self])[self updatePreferences];return mainView;}// AMPrefPaneInformalProtocol- (int)shouldUnselect{// should be NSPreferencePaneUnselectReplyreturn AMUnselectNow;}- (void)willUnselect{/* check for any uncommitted text fields */if (mainView) {NSWindow *w = [mainView window];if (w) {NSResponder *fr = [w firstResponder];if (fr && [fr isMemberOfClass:[NSTextView class]]) {SLog(@"%@ didUnselect: committing text in the current text field", self);[fr insertNewline:self];}}}}/* end of std methods implementation */- (void) awakeFromNib{[self updatePreferences];[[Preferences sharedPreferences] addDependent:self];}- (void) updatePreferences{BOOL flag=[Preferences flagForKey:appOrCommandKey withDefault: YES];if (flag)[appOrCommand selectCellAtRow:0 column:0];else[appOrCommand selectCellAtRow:1 column:0];flag=[Preferences flagForKey:internalOrExternalKey withDefault: YES];if (flag)[internalOrExternal selectCellAtRow:0 column:0];else[internalOrExternal selectCellAtRow:0 column:1];NSData *encodedFont = [[NSUserDefaults standardUserDefaults] dataForKey:RScriptEditorDefaultFont];if (encodedFont)[editorFont setFont:[NSUnarchiver unarchiveObjectWithData:encodedFont]];[showSyntaxColoring setEnabled:flag?NSOnState:NSOffState];[showBraceHighlighting setEnabled:flag?NSOnState:NSOffState];[showLineNumbers setEnabled:flag?NSOnState:NSOffState];[highlightInterval setEnabled:flag?NSOnState:NSOffState];[enableLineWrapping setEnabled:flag?NSOnState:NSOffState];[lineNumberGutterWidth setEnabled:flag?NSOnState:NSOffState];[fragmentPaddingWidth setEnabled:flag?NSOnState:NSOffState];[enableIndentNewLines setEnabled:flag?NSOnState:NSOffState];[braceHiliteStepper setEnabled:flag?NSOnState:NSOffState];[editorFont setEnabled:flag?NSOnState:NSOffState];[editorFontSelectButton setEnabled:flag?NSOnState:NSOffState];[showArgsHints setEnabled:flag?NSOnState:NSOffState];[showBraceHighlighting setEnabled:flag?NSOnState:NSOffState];[matchingPairs setEnabled:flag?NSOnState:NSOffState];[hiliteCurrentLine setEnabled:flag?NSOnState:NSOffState];[autosaveDocuments setEnabled:flag?NSOnState:NSOffState];if (flag) {[highlightIntervalText setTextColor:[NSColor blackColor]];[highlightInterval setTextColor:[NSColor blackColor]];[highlightIntervalTextUnit setTextColor:[NSColor blackColor]];[highlightNoteText setTextColor:[NSColor blackColor]];[showLineNumbersText setTextColor:[NSColor blackColor]];[editorText setTextColor:[NSColor grayColor]];[lineNumberGutterWidthText setTextColor:[NSColor blackColor]];[fragmentPaddingWidthText setTextColor:[NSColor blackColor]];[externalEditorName setTextColor:[NSColor grayColor]];[commandText setTextColor:[NSColor grayColor]];[editorFontLabel setTextColor:[NSColor blackColor]];} else {[highlightIntervalText setTextColor:[NSColor grayColor]];[highlightInterval setTextColor:[NSColor grayColor]];[highlightIntervalTextUnit setTextColor:[NSColor grayColor]];[highlightNoteText setTextColor:[NSColor grayColor]];[showLineNumbersText setTextColor:[NSColor grayColor]];[editorText setTextColor:[NSColor blackColor]];[lineNumberGutterWidthText setTextColor:[NSColor grayColor]];[fragmentPaddingWidthText setTextColor:[NSColor grayColor]];[externalEditorName setTextColor:[NSColor blackColor]];[commandText setTextColor:[NSColor blackColor]];[editorFontLabel setTextColor:[NSColor grayColor]];}[changeEditor setEnabled:(flag?NSOffState:NSOnState)];[appOrCommand setEnabled:(flag?NSOffState:NSOnState)];[externalEditorName setEnabled:(flag?NSOffState:NSOnState)];NSArray *pathComps = [[Preferences stringForKey:externalEditorNameKey withDefault: @"TextEdit"] componentsSeparatedByString:@"/"];NSString *name = [pathComps objectAtIndex: ([pathComps count] - 1)];pathComps = [name componentsSeparatedByString:@".app"];name = [pathComps objectAtIndex:0];[externalEditorName setStringValue:name];[showArgsHints setState:[Preferences flagForKey:prefShowArgsHints withDefault:YES]?NSOnState:NSOffState];[showSyntaxColoring setState:[Preferences flagForKey:showSyntaxColoringKey withDefault: YES]?NSOnState:NSOffState];[showBraceHighlighting setState:[Preferences flagForKey:showBraceHighlightingKey withDefault: YES]?NSOnState:NSOffState];[autosaveDocuments setState:[Preferences flagForKey:kEditorAutosaveKey withDefault: YES] ? NSOnState : NSOffState];// since 1.40 highlightIntervalKey is obsolete since it contains space in its name// which isn't allowed for key-value-bindings; instead using HighlightIntervalKeyif([[NSUserDefaults standardUserDefaults] objectForKey:highlightIntervalKey]) {[[NSUserDefaults standardUserDefaults] setFloat:[[Preferences stringForKey:highlightIntervalKey] doubleValue] forKey:HighlightIntervalKey];[[NSUserDefaults standardUserDefaults] removeObjectForKey:highlightIntervalKey];}[showLineNumbers setState:[Preferences flagForKey:showLineNumbersKey withDefault: YES]?NSOnState:NSOffState];[matchingPairs setState:[Preferences flagForKey:kAutoCloseBrackets withDefault:YES]?NSOnState:NSOffState];// if (![Preferences flagForKey:showLineNumbersKey withDefault: YES]) {// [enableLineWrapping setEnabled:NSOffState];// [lineNumberGutterWidth setEnabled:NSOffState];// [fragmentPaddingWidth setEnabled:NSOffState];// [lineNumberGutterWidthText setTextColor:[NSColor grayColor]];// [fragmentPaddingWidthText setTextColor:[NSColor grayColor]];// }[enableLineWrapping setState:[Preferences flagForKey:enableLineWrappingKey withDefault: YES]?NSOnState:NSOffState];[lineNumberGutterWidth setStringValue:[Preferences stringForKey:lineNumberGutterWidthKey withDefault: @"16.0"]];[fragmentPaddingWidth setStringValue:[Preferences stringForKey:lineFragmentPaddingWidthKey withDefault: @"6.0"]];}- (IBAction) showFontPanel:(id)sender{[[NSFontPanel sharedFontPanel] setPanelFont:[NSUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] dataForKey:RScriptEditorDefaultFont]] isMultiple:NO];[[NSFontPanel sharedFontPanel] makeKeyAndOrderFront:self];}- (IBAction) changeInternalOrExternal:(id)sender{BOOL flag;int res = (int)[sender selectedColumn];if (res)flag = NO;elseflag = YES;[Preferences setKey:internalOrExternalKey withFlag:flag];}- (void)changeExternalEditorName:(id)sender {NSString *name = ([[sender stringValue] length] == 0)?@"TextEdit":[sender stringValue];[Preferences setKey:externalEditorNameKey withObject:name];}- (IBAction) changeShowSyntaxColoring:(id)sender {int tmp = (int)[sender state];BOOL flag = tmp?YES:NO;[Preferences setKey:showSyntaxColoringKey withFlag:flag];}- (IBAction) changeShowBraceHighlighting:(id)sender {int tmp = (int)[sender state];BOOL flag = tmp?YES:NO;[Preferences setKey:showBraceHighlightingKey withFlag:flag];}- (IBAction) changeShowArgsHints:(id)sender {int tmp = (int)[sender state];BOOL flag = tmp?YES:NO;[Preferences setKey:prefShowArgsHints withFlag:flag];}// - (IBAction) changeHighlightInterval:(id)sender {// NSString *interval = ([[sender stringValue] length] == 0)?@"0.2":[sender stringValue];// if ([interval length] == 0) {// interval = @"0.2";// } else {// double value = [interval doubleValue];// if (value < 0.1)// interval = @"0.1";// else if (value > 0.8)// interval = @"0.8";// }// [Preferences setKey:highlightIntervalKey withObject:interval];// }- (IBAction) changeFlag:(id)sender {int tmp = (int)[sender state];BOOL flag = tmp ? YES : NO;NSString *key = nil;if (sender == autosaveDocuments) key = kEditorAutosaveKey;if (sender == showLineNumbers) key = showLineNumbersKey;if (sender == matchingPairs) key = kAutoCloseBrackets;if (key)[Preferences setKey:key withFlag:flag];else {SLog(@"WARNING: changeFlag called by %@ which corresponds to no key!", sender);}}- (IBAction) changeMatchingPairs:(id)sender {int tmp = (int)[sender state];BOOL flag = tmp?YES:NO;[Preferences setKey:kAutoCloseBrackets withFlag:flag];}- (IBAction) changeAppOrCommand:(id)sender {BOOL flag;int res = (int)[sender selectedRow];if (res)flag = NO;elseflag = YES;[Preferences setKey:appOrCommandKey withFlag:flag];}- (IBAction) changeEditor:(id)sender;{int answer;NSOpenPanel *sp;sp = [NSOpenPanel openPanel];[sp setTitle:NLS(@"Select editor application")];answer = [sp runModalForDirectory:@"/Applications" file:nil types:nil];if(answer == NSOKButton) {[Preferences setKey:externalEditorNameKey withObject:[sp filename]];}}- (IBAction) changeEnableLineWrapping:(id)sender {int tmp = (int)[sender state];BOOL flag = tmp?YES:NO;[Preferences setKey:enableLineWrappingKey withFlag:flag];}- (IBAction) changeLineNumberGutterWidth:(id)sender {NSString *interval = ([[sender stringValue] length] == 0)?@"0.2":[sender stringValue];if ([interval length] == 0) {interval = @"16.0";} else {double value = [interval doubleValue];if (value < 6.0)interval = @"6.0";}[Preferences setKey:lineNumberGutterWidthKey withObject:interval];}- (IBAction) changeFragmentPaddingWidth:(id)sender {NSString *interval = ([[sender stringValue] length] == 0)?@"0.2":[sender stringValue];if ([interval length] == 0) {interval = @"6.0";} else {double value = [interval doubleValue];if (value < 3.0)interval = @"3.0";else if (value > 20.0)interval = @"20.0";}[Preferences setKey:lineFragmentPaddingWidthKey withObject:interval];}@end