OLD | NEW |
| (Empty) |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #import "chrome/browser/ui/cocoa/font_language_settings_controller.h" | |
6 | |
7 #import <Cocoa/Cocoa.h> | |
8 #import "base/mac/mac_util.h" | |
9 #include "base/sys_string_conversions.h" | |
10 #include "chrome/browser/character_encoding.h" | |
11 #include "chrome/browser/fonts_languages_window.h" | |
12 #include "chrome/browser/prefs/pref_service.h" | |
13 #include "chrome/browser/profiles/profile.h" | |
14 #include "chrome/common/pref_names.h" | |
15 | |
16 NSString* const kCharacterInfoEncoding = @"encoding"; | |
17 NSString* const kCharacterInfoName = @"name"; | |
18 NSString* const kCharacterInfoID = @"id"; | |
19 | |
20 void ShowFontsLanguagesWindow(gfx::NativeWindow window, | |
21 FontsLanguagesPage page, | |
22 Profile* profile) { | |
23 NOTIMPLEMENTED(); | |
24 } | |
25 | |
26 @interface FontLanguageSettingsController (Private) | |
27 - (void)updateDisplayField:(NSTextField*)field | |
28 withFont:(NSFont*)font | |
29 withLabel:(NSTextField*)label; | |
30 @end | |
31 | |
32 @implementation FontLanguageSettingsController | |
33 | |
34 - (id)initWithProfile:(Profile*)profile { | |
35 DCHECK(profile); | |
36 NSString* nibpath = [base::mac::MainAppBundle() | |
37 pathForResource:@"FontLanguageSettings" | |
38 ofType:@"nib"]; | |
39 if ((self = [super initWithWindowNibPath:nibpath owner:self])) { | |
40 profile_ = profile; | |
41 | |
42 // Convert the name/size preference values to NSFont objects. | |
43 serifName_.Init(prefs::kWebKitSerifFontFamily, profile->GetPrefs(), NULL); | |
44 serifSize_.Init(prefs::kWebKitDefaultFontSize, profile->GetPrefs(), NULL); | |
45 NSString* serif = base::SysUTF8ToNSString(serifName_.GetValue()); | |
46 serifFont_.reset( | |
47 [[NSFont fontWithName:serif size:serifSize_.GetValue()] retain]); | |
48 | |
49 sansSerifName_.Init(prefs::kWebKitSansSerifFontFamily, profile->GetPrefs(), | |
50 NULL); | |
51 sansSerifSize_.Init(prefs::kWebKitDefaultFontSize, profile->GetPrefs(), | |
52 NULL); | |
53 NSString* sansSerif = base::SysUTF8ToNSString(sansSerifName_.GetValue()); | |
54 sansSerifFont_.reset( | |
55 [[NSFont fontWithName:sansSerif | |
56 size:sansSerifSize_.GetValue()] retain]); | |
57 | |
58 fixedWidthName_.Init(prefs::kWebKitFixedFontFamily, profile->GetPrefs(), | |
59 NULL); | |
60 fixedWidthSize_.Init(prefs::kWebKitDefaultFixedFontSize, | |
61 profile->GetPrefs(), NULL); | |
62 NSString* fixedWidth = base::SysUTF8ToNSString(fixedWidthName_.GetValue()); | |
63 fixedWidthFont_.reset( | |
64 [[NSFont fontWithName:fixedWidth | |
65 size:fixedWidthSize_.GetValue()] retain]); | |
66 | |
67 // Generate a list of encodings. | |
68 NSInteger count = CharacterEncoding::GetSupportCanonicalEncodingCount(); | |
69 NSMutableArray* encodings = [NSMutableArray arrayWithCapacity:count]; | |
70 for (NSInteger i = 0; i < count; ++i) { | |
71 int commandId = CharacterEncoding::GetEncodingCommandIdByIndex(i); | |
72 string16 name = CharacterEncoding::\ | |
73 GetCanonicalEncodingDisplayNameByCommandId(commandId); | |
74 std::string encoding = | |
75 CharacterEncoding::GetCanonicalEncodingNameByCommandId(commandId); | |
76 NSDictionary* strings = [NSDictionary dictionaryWithObjectsAndKeys: | |
77 base::SysUTF16ToNSString(name), kCharacterInfoName, | |
78 base::SysUTF8ToNSString(encoding), kCharacterInfoEncoding, | |
79 [NSNumber numberWithInt:commandId], kCharacterInfoID, | |
80 nil | |
81 ]; | |
82 [encodings addObject:strings]; | |
83 } | |
84 | |
85 // Sort the encodings. | |
86 scoped_nsobject<NSSortDescriptor> sorter( | |
87 [[NSSortDescriptor alloc] initWithKey:kCharacterInfoName | |
88 ascending:YES]); | |
89 NSArray* sorterArray = [NSArray arrayWithObject:sorter.get()]; | |
90 encodings_.reset( | |
91 [[encodings sortedArrayUsingDescriptors:sorterArray] retain]); | |
92 | |
93 // Find and set the default encoding. | |
94 defaultEncoding_.Init(prefs::kDefaultCharset, profile->GetPrefs(), NULL); | |
95 NSString* defaultEncoding = | |
96 base::SysUTF8ToNSString(defaultEncoding_.GetValue()); | |
97 NSUInteger index = 0; | |
98 for (NSDictionary* entry in encodings_.get()) { | |
99 NSString* encoding = [entry objectForKey:kCharacterInfoEncoding]; | |
100 if ([encoding isEqualToString:defaultEncoding]) { | |
101 defaultEncodingIndex_ = index; | |
102 break; | |
103 } | |
104 ++index; | |
105 } | |
106 | |
107 // Register as a KVO observer so we can receive updates when the encoding | |
108 // changes. | |
109 [self addObserver:self | |
110 forKeyPath:@"defaultEncodingIndex_" | |
111 options:NSKeyValueObservingOptionNew | |
112 context:NULL]; | |
113 } | |
114 return self; | |
115 } | |
116 | |
117 - (void)dealloc { | |
118 [self removeObserver:self forKeyPath:@"defaultEncodingIndex_"]; | |
119 [super dealloc]; | |
120 } | |
121 | |
122 - (void)awakeFromNib { | |
123 DCHECK([self window]); | |
124 [[self window] setDelegate:self]; | |
125 | |
126 // Set up the font display. | |
127 [self updateDisplayField:serifField_ | |
128 withFont:serifFont_.get() | |
129 withLabel:serifLabel_]; | |
130 [self updateDisplayField:sansSerifField_ | |
131 withFont:sansSerifFont_.get() | |
132 withLabel:sansSerifLabel_]; | |
133 [self updateDisplayField:fixedWidthField_ | |
134 withFont:fixedWidthFont_.get() | |
135 withLabel:fixedWidthLabel_]; | |
136 } | |
137 | |
138 - (void)windowWillClose:(NSNotification*)notif { | |
139 [self autorelease]; | |
140 } | |
141 | |
142 - (IBAction)selectFont:(id)sender { | |
143 if (sender == serifButton_) { | |
144 currentFont_ = serifFont_.get(); | |
145 currentType_ = FontSettingSerif; | |
146 } else if (sender == sansSerifButton_) { | |
147 currentFont_ = sansSerifFont_.get(); | |
148 currentType_ = FontSettingSansSerif; | |
149 } else if (sender == fixedWidthButton_) { | |
150 currentFont_ = fixedWidthFont_.get(); | |
151 currentType_ = FontSettingFixed; | |
152 } else { | |
153 NOTREACHED(); | |
154 } | |
155 | |
156 // Validate whatever editing is currently happening. | |
157 if ([[self window] makeFirstResponder:nil]) { | |
158 NSFontManager* manager = [NSFontManager sharedFontManager]; | |
159 [manager setTarget:self]; | |
160 [manager setSelectedFont:currentFont_ isMultiple:NO]; | |
161 [manager orderFrontFontPanel:self]; | |
162 } | |
163 } | |
164 | |
165 // Called by the font manager when the user has selected a new font. We should | |
166 // then persist those changes into the preference system. | |
167 - (void)changeFont:(id)fontManager { | |
168 switch (currentType_) { | |
169 case FontSettingSerif: | |
170 serifFont_.reset([[fontManager convertFont:serifFont_] retain]); | |
171 [self updateDisplayField:serifField_ | |
172 withFont:serifFont_.get() | |
173 withLabel:serifLabel_]; | |
174 changedSerif_ = YES; | |
175 break; | |
176 case FontSettingSansSerif: | |
177 sansSerifFont_.reset([[fontManager convertFont:sansSerifFont_] retain]); | |
178 [self updateDisplayField:sansSerifField_ | |
179 withFont:sansSerifFont_.get() | |
180 withLabel:sansSerifLabel_]; | |
181 changedSansSerif_ = YES; | |
182 break; | |
183 case FontSettingFixed: | |
184 fixedWidthFont_.reset( | |
185 [[fontManager convertFont:fixedWidthFont_] retain]); | |
186 [self updateDisplayField:fixedWidthField_ | |
187 withFont:fixedWidthFont_.get() | |
188 withLabel:fixedWidthLabel_]; | |
189 changedFixedWidth_ = YES; | |
190 break; | |
191 default: | |
192 NOTREACHED(); | |
193 } | |
194 } | |
195 | |
196 - (IBAction)closeSheet:(id)sender { | |
197 NSFontPanel* panel = [[NSFontManager sharedFontManager] fontPanel:NO]; | |
198 [panel close]; | |
199 [NSApp endSheet:[self window]]; | |
200 } | |
201 | |
202 - (IBAction)save:(id)sender { | |
203 if (changedSerif_) { | |
204 serifName_.SetValue(base::SysNSStringToUTF8([serifFont_ fontName])); | |
205 serifSize_.SetValue([serifFont_ pointSize]); | |
206 } | |
207 if (changedSansSerif_) { | |
208 sansSerifName_.SetValue( | |
209 base::SysNSStringToUTF8([sansSerifFont_ fontName])); | |
210 sansSerifSize_.SetValue([sansSerifFont_ pointSize]); | |
211 } | |
212 if (changedFixedWidth_) { | |
213 fixedWidthName_.SetValue( | |
214 base::SysNSStringToUTF8([fixedWidthFont_ fontName])); | |
215 fixedWidthSize_.SetValue([fixedWidthFont_ pointSize]); | |
216 } | |
217 if (changedEncoding_) { | |
218 NSDictionary* object = [encodings_ objectAtIndex:defaultEncodingIndex_]; | |
219 NSString* newEncoding = [object objectForKey:kCharacterInfoEncoding]; | |
220 std::string encoding = base::SysNSStringToUTF8(newEncoding); | |
221 defaultEncoding_.SetValue(encoding); | |
222 } | |
223 [self closeSheet:sender]; | |
224 } | |
225 | |
226 - (NSArray*)encodings { | |
227 return encodings_.get(); | |
228 } | |
229 | |
230 // KVO notification. | |
231 - (void)observeValueForKeyPath:(NSString*)keyPath | |
232 ofObject:(id)object | |
233 change:(NSDictionary*)change | |
234 context:(void*)context { | |
235 // If this is the default encoding, then set the flag to persist the value. | |
236 if ([keyPath isEqual:@"defaultEncodingIndex_"]) { | |
237 changedEncoding_ = YES; | |
238 return; | |
239 } | |
240 | |
241 [super observeValueForKeyPath:keyPath | |
242 ofObject:object | |
243 change:change | |
244 context:context]; | |
245 } | |
246 | |
247 #pragma mark Private | |
248 | |
249 // Set the baseline for the font field to be aligned with the baseline | |
250 // of its corresponding label. | |
251 - (NSPoint)getFontFieldOrigin:(NSTextField*)field | |
252 forLabel:(NSTextField*)label { | |
253 [field sizeToFit]; | |
254 NSRect labelFrame = [label frame]; | |
255 NSPoint newOrigin = | |
256 [[label superview] convertPoint:labelFrame.origin | |
257 toView:[field superview]]; | |
258 newOrigin.x = 0; // Left-align font field. | |
259 newOrigin.y += [[field font] descender] - [[label font] descender]; | |
260 return newOrigin; | |
261 } | |
262 | |
263 // This will set the font on |field| to be |font|, and will set the string | |
264 // value to something human-readable. | |
265 - (void)updateDisplayField:(NSTextField*)field | |
266 withFont:(NSFont*)font | |
267 withLabel:(NSTextField*)label { | |
268 if (!font) { | |
269 // Something has gone really wrong. Don't make things worse by showing the | |
270 // user "(null)". | |
271 return; | |
272 } | |
273 [field setFont:font]; | |
274 NSString* value = | |
275 [NSString stringWithFormat:@"%@, %g", [font fontName], [font pointSize]]; | |
276 [field setStringValue:value]; | |
277 [field setFrameOrigin:[self getFontFieldOrigin:field forLabel:label]]; | |
278 } | |
279 | |
280 @end | |
OLD | NEW |