· 8 years ago · Jan 22, 2018, 04:22 PM
1/*
2 * ThemeDescriptors.j
3 * CarbonTheme
4 *
5 * Based on Aristo, Copyright 2009, 280 North, Inc. All rights reserved.
6 * Copyright 2011 Intalio, Inc. All rights reserved.
7 */
8
9@import <Foundation/CPObject.j>
10@import <AppKit/AppKit.j>
11@import <AppKit/CPTableHeaderView.j>
12@import <BlendKit/BKThemeDescriptor.j>
13
14var themedButtonValues = nil,
15 themedTextFieldValues = nil,
16 themedVerticalScrollerValues = nil,
17 themedHorizontalScrollerValues = nil,
18 themedSegmentedControlValues = nil,
19 themedHorizontalSliderValues = nil,
20 themedVerticalSliderValues = nil,
21 themedCircularSliderValues = nil,
22 themedButtonBarValues = nil,
23 themedAlertValues = nil;
24
25/*
26 HOW TO ADD OR MODIFY THEMED ELEMENTS
27
28 This file serves both as a means of defining default theme values
29 and of defining an interface for the automatically generated theme showcase,
30 so you have to keep both in mind.
31
32 Let's say you define a new view class and you want to theme it.
33 Here's how to do it with minimum work.
34
35 1. Define +themeAttributes in your class if you define custom attributes.
36
37 2. If you want a custom name to appear in the theme showcase, define +themeClass
38 and return a string with the name all in lowercase and words separated by
39 dashes. If you don't provide +themeClass, Cappuccino will separate the themed
40 class name into words at each uppercased letter followed by lowercase letters.
41
42 3. Use the following template for defining your themed view (using a calendar view as an example).
43 Note that we make a separate method for creating and configuring the view.
44 This is to more clearly separate the two functions of ThemeDescriptors.j (defining
45 themes and defining the showcase interface), and also to allow us to easily reuse
46 the creation/configuration code if we make a HUD version of our themed view.
47
48 // Create a private variable to hold the theme values, we can share this with the HUD theme
49 var themedCalendarViewValues = nil;
50
51 + (CPCalendarView)makeCalendarView
52 {
53 // Define the size of the sample that will appear in the theme showcase.
54 // The maximum width/height is around 180 pixels.
55
56 var calendar = [[CPCalendarView alloc] initWithFrame:CGRectMake(0.0, 0.0, 150.0, 100.0)];
57
58 // Do any other initialization of the calendar you want to do here. In this case
59 // we want the calendar to show our birthdate instead of the current date.
60 [calendar setDate:new Date(1961, 2, 30)];
61
62 return calendar;
63 }
64
65 + (CPCalendarView)themedCalendarView
66 {
67 var calendar = [self makeCalendarView],
68
69 // Now define some pattern colors. We want to define the bezel for the calendar
70 // using a nine part image, which consists of nine slices in the order top/left,
71 // top, top/right, left, center, right, bottom/left, bottom, bottom/right.
72 // We can do this declaritively using the PatternColor function, which takes an array
73 // of slice declarations, with each declaration being an array of [filename, width, height].
74
75 bezelColor = PatternColor(
76 [
77 [@"calendar-bezel-0.png", 10.0, 10.0],
78 [@"calendar-bezel-1.png", 1.0, 10.0],
79 [@"calendar-bezel-2.png", 10.0, 10.0],
80 [@"calendar-bezel-3.png", 10.0, 1.0],
81 [@"calendar-bezel-4.png", 1.0, 1.0],
82 [@"calendar-bezel-5.png", 10.0, 1.0],
83 [@"calendar-bezel-6.png", 10.0, 10.0],
84 [@"calendar-bezel-7.png", 1.0, 10.0],
85 [@"calendar-bezel-8.png", 10.0, 10.0]
86 ]),
87
88 // Define an alternate bezel for when the calendar is disabled.
89
90 disabledBezelColor = PatternColor(
91 [
92 [@"calendar-disabled-bezel-0.png", 10.0, 10.0],
93 [@"calendar-disabled-bezel-1.png", 1.0, 10.0],
94 [@"calendar-disabled-bezel-2.png", 10.0, 10.0],
95 [@"calendar-disabled-bezel-3.png", 10.0, 1.0],
96 [@"calendar-disabled-bezel-4.png", 1.0, 1.0],
97 [@"calendar-disabled-bezel-5.png", 10.0, 1.0],
98 [@"calendar-disabled-bezel-6.png", 10.0, 10.0],
99 [@"calendar-disabled-bezel-7.png", 1.0, 10.0],
100 [@"calendar-disabled-bezel-8.png", 10.0, 10.0]
101 ]),
102
103 // We would like the font to be dark blue and lighter blue when disabled
104
105 textColor = [CPColor colorWithHexString:@"001B48"],
106 disabledTextColor = [textColor colorWithAlphaComponent:0.6];
107
108 // Now we will define our theme values. These are done declaratively in an array,
109 // where each element is an array of 2 or 3 values: attribute name, value, and optional state.
110
111 themedCalendarViewValues =
112 [
113 [@"bezel-color", bezelColor],
114 [@"bezel-color", disabledBezelColor, CPThemeStateDisabled],
115
116 [@"text-color", textColor],
117 [@"text-color", disabledTextColor, CPThemeStateDisabled],
118
119 // We will also define a minimum size
120 [@"min-size", CGSizeMake(100.0, 100.0)]
121 ];
122
123 // Now we just register our values
124
125 [self registerThemeValues:themedCalendarViewValues forView:calendar];
126 }
127
128 That's all there is to it. Note that PatternColor can also be used to create a simple
129 patterned color:
130
131 color = PatternColor(filename, width, height);
132
133 It can also be used to create a three part image by specifying three images slices
134 with [filename, width, height] and an orientation:
135
136 trackColor = PatternColor(
137 [
138 ["horizontal-track-left.png", 4.0, 5.0],
139 ["horizontal-track-center.png", 1.0, 5.0],
140 ["horizontal-track-right.png", 4.0, 5.0]
141 ],
142 PatternIsHorizontal);
143
144 trackColor = PatternColor(
145 [
146 ["vertical-track-top.png", 5.0, 6.0],
147 ["vertical-track-center.png", 5.0, 1.0],
148 ["vertical-track-bottom.png", 5.0, 4.0]
149 ],
150 PatternIsVertical);
151
152
153 EXCLUDING A THEMED OBJECT FROM THE SHOWCASE
154
155 When a theme is compiled, a showcase application is created that displays all of the themed objects
156 by default. There are some cases in which it is either not feasible or not desirable to display
157 the themed object in the showcase.
158
159 You can exclude themed objects from the showcases by defining the following method in your theme class:
160
161 + (CPArray)themeShowcaseExcludes
162
163 If such a method exists, it should return an array of themed object names to exclude from the showcase.
164 For example, let's say we want to exclude the themed objects that are defined by the methods
165 themedAlert, themedCornerview and themedTableDataView. Here is what the themeShowcaseExcludes method
166 could look like:
167
168 + (CPArray)themeShowcaseExcludes
169 {
170 return ["themedAlert", "cornerview", "tableDataView"];
171 }
172
173 Note that to make it easier to do the right thing, the names in the array can begin with "themed" or not.
174 If the name does not begin with "themed", it is prepended. Name matching is case-insensitive, so you
175 don't have to worry about capitalization.
176
177
178 SUBTHEMES
179
180 If you want to create a theme that inherits from another theme, for example the way
181 the Aristo-HUD theme inherits from Aristo, you can do this easily by following
182 these steps:
183
184 1. Your subtheme should be named "<inherited>-<identifier>", where <inherited> is the name
185 of the theme from which you are inheriting, and <identifier> is the subtheme identifier.
186 For example, "Aristo-HUD" inherits from "Aristo".
187
188 2. Decide which elements in the subtheme will be changed and which will be inherited.
189 For example, in a HUD theme you may want to use a dark or black background
190 and white text.
191
192 3. If your subtheme will replace pattern colors in the inherited theme, use the same filename as
193 in the inherited theme and put the pattern images in a subdirectory of the inherited
194 directory. The subdirectory's name should be the same as the subtheme identifier.
195 For example, Aristo-HUD's pattern images are in a "HUD" subdirectory of the "Aristo" directory.
196
197 4. In the subtheme class (such as AristoHUDThemeDescriptor), add a method with this template:
198
199 + (CPCalendarView)themedCalendarView
200 {
201 var calendar = [AristoThemeDescriptor makeCalendarView],
202 subthemeValues = nil; // This may change according to your needs, see below
203
204 [self registerThemeValues:subthemeValues forView:calendar inherit:themedCalendarViewValues];
205
206 return calendar;
207 }
208
209 NOTE: If you pass nil or an empty array for the subthemeValues, ALL pattern images
210 will be automatically inherited and MUST be present in the subtheme directory.
211
212 Depending on your subtheme, you will change subthemeValues to indicate which values you
213 wish to override or remove from the inherited theme.
214
215 For example, let's say in your subtheme you want to use white text instead of dark blue,
216 and slightly gray text when it is disabled. In addition, you decide not to inherit the
217 disabled bezel color pattern. Here is how your updated theme method would look:
218
219 + (CPCalendarView)themedCalendarView
220 {
221 var calendar = [AristoThemeDescriptor makeCalendarView],
222
223 textColor = [CPColor whiteColor],
224 disabledTextColor = [textColor colorWithAlphaComponent:0.6],
225 subthemeValues =
226 [
227 [@"bezel-color", nil, CPThemeStateDisabled],
228 [@"text-color", textColor],
229 [@"text-color", disabledTextColor, CPThemeStateDisabled]
230 ];
231
232 [self registerThemeValues:subthemeValues forView:calendar inherit:themedCalendarViewValues];
233
234 return calendar;
235 }
236
237 If your subtheme consistently applies the same overrides to all themed views, you may
238 want to create a separate method that supplies those overrides. For example, Aristo-HUD
239 uses the following method:
240
241 + (CPArray)defaultThemeOverridesAddedTo:(CPArray)themeValues
242
243 For the example we used above, we could define such a method as follows:
244
245 + (CPArray)defaultThemeOverridesAddedTo:(CPArray)themeValues
246 {
247 var textColor = [CPColor whiteColor],
248 disabledTextColor = [textColor colorWithAlphaComponent:0.6],
249 overrides = [CPArray arrayWithObjects:
250 [@"bezel-color", nil, CPThemeStateDisabled],
251 [@"text-color", textColor],
252 [@"text-color", disabledTextColor, CPThemeStateDisabled]
253 ];
254
255 if (themeValues)
256 [overrides addObjectsFromArray:themeValues];
257
258 return overrides;
259 }
260
261 Note that the values in the themeValues parameter override the defaults provided
262 by the method.
263
264 Our themed view method becomes:
265
266 + (CPCalendarView)themedCalendarView
267 {
268 var calendar = [AristoThemeDescriptor makeCalendarView];
269
270 [self registerThemeValues:[self defaultThemeOverridesAddedTo:nil]
271 forView:calendar
272 inherit:themedCalendarViewValues];
273
274 return calendar;
275 }
276
277 As a last example, let's assume another type of themed view in your subtheme wants
278 to add some new theme values to the default overrides. The theme method might look like this:
279
280 + (CPCalendarView)themedCalendarHeaderView
281 {
282 var header = [AristoThemeDescriptor makeCalendarHeaderView],
283 headerColor = PatternColor(
284 [
285 ["calendar-header-left.png", 5.0, 23.0],
286 ["calendar-header-center.png", 1.0, 23.0],
287 ["calendar-header-right.png", 5.0, 23.0]
288 ],
289 PatternIsHorizontal),
290 subthemeValues =
291 [
292 [@"background-color", headerColor]
293 ];
294
295 [self registerThemeValues:[self defaultThemeOverridesAddedTo:subthemeValues]
296 forView:calendar
297 inherit:themedCalendarHeaderViewValues];
298
299 return calendar;
300 }
301
302
303 ADDING ARISTO-HUD CONTROLS
304
305 If you want to add a new themed control to Aristo-HUD, you should use the
306 +defaultThemeOverridesAddedTo: method to ensure visual consistency with the rest
307 of Aristo-HUD. The overrides returned by this method do the following:
308
309 - Sets the "text-color" attribute to white in the normal state and
310 [CPColor colorWithCalibratedWhite:1.0 alpha:0.6] in the disabled state.
311
312 - Set "text-shadow-color" to black.
313
314 - Sets "text-shadow-offset" to (-1.0, -1.0).
315
316 These are the standards used by Aristo-HUD. If you want to override these defaults,
317 simply add those overrides to the values you pass to +defaultThemeOverridesAddedTo:.
318*/
319@implementation CarbonThemeDescriptor : BKThemeDescriptor
320{
321}
322
323+ (CPString)themeName
324{
325 return @"CarbonTheme";
326}
327
328+ (CPArray)themeShowcaseExcludes
329{
330 return ["alert", "cornerview", "columnHeader", "tableView", "tableHeaderRow", "tableDataView", @"ruleeditor"];
331}
332
333+ (CPButton)makeButton
334{
335 return [[CPButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, CPButtonDefaultHeight)];
336}
337
338+ (CPButton)button
339{
340 var button = [self makeButton],
341
342 // RoundRect
343 bezelColor = PatternColor(
344 [
345 ["button-bezel-left.png", 4.0, 24.0],
346 ["button-bezel-center.png", 1.0, 24.0],
347 ["button-bezel-right.png", 4.0, 24.0]
348 ],
349 PatternIsHorizontal),
350
351 highlightedBezelColor = PatternColor(
352 [
353 ["button-bezel-highlighted-left.png", 4.0, 24.0],
354 ["button-bezel-highlighted-center.png", 1.0, 24.0],
355 ["button-bezel-highlighted-right.png", 4.0, 24.0]
356 ],
357 PatternIsHorizontal),
358
359 disabledBezelColor = PatternColor(
360 [
361 ["button-bezel-disabled-left.png", 4.0, 24.0],
362 ["button-bezel-disabled-center.png", 1.0, 24.0],
363 ["button-bezel-disabled-right.png", 4.0, 24.0]
364 ],
365 PatternIsHorizontal),
366
367 defaultBezelColor = PatternColor(
368 [
369 ["default-button-bezel-left.png", 4.0, 24.0],
370 ["default-button-bezel-center.png", 1.0, 24.0],
371 ["default-button-bezel-right.png", 4.0, 24.0]
372 ],
373 PatternIsHorizontal),
374
375 defaultHighlightedBezelColor = PatternColor(
376 [
377 ["default-button-bezel-highlighted-left.png", 4.0, 24.0],
378 ["default-button-bezel-highlighted-center.png", 1.0, 24.0],
379 ["default-button-bezel-highlighted-right.png", 4.0, 24.0]
380 ],
381 PatternIsHorizontal),
382
383 defaultDisabledBezelColor = PatternColor(
384 [
385 ["default-button-bezel-disabled-left.png", 4.0, 24.0],
386 ["default-button-bezel-disabled-center.png", 1.0, 24.0],
387 ["default-button-bezel-disabled-right.png", 4.0, 24.0]
388 ],
389 PatternIsHorizontal),
390
391
392 // Rounded
393 roundedBezelColor = PatternColor(
394 [
395 ["button-bezel-rounded-left.png", 12.0, 24.0],
396 ["button-bezel-rounded-center.png", 1.0, 24.0],
397 ["button-bezel-rounded-right.png", 12.0, 24.0]
398 ],
399 PatternIsHorizontal),
400
401 roundedHighlightedBezelColor = PatternColor(
402 [
403 ["button-bezel-rounded-highlighted-left.png", 12.0, 24.0],
404 ["button-bezel-rounded-highlighted-center.png", 1.0, 24.0],
405 ["button-bezel-rounded-highlighted-right.png", 12.0, 24.0]
406 ],
407 PatternIsHorizontal),
408
409 roundedDisabledBezelColor = PatternColor(
410 [
411 ["button-bezel-rounded-disabled-left.png", 12.0, 24.0],
412 ["button-bezel-rounded-disabled-center.png", 1.0, 24.0],
413 ["button-bezel-rounded-disabled-right.png", 12.0, 24.0]
414 ],
415 PatternIsHorizontal),
416
417 defaultRoundedBezelColor = PatternColor(
418 [
419 ["default-button-bezel-rounded-left.png", 12.0, 24.0],
420 ["default-button-bezel-rounded-center.png", 1.0, 24.0],
421 ["default-button-bezel-rounded-right.png", 12.0, 24.0]
422 ],
423 PatternIsHorizontal),
424
425 defaultRoundedHighlightedBezelColor = PatternColor(
426 [
427 ["default-button-bezel-rounded-highlighted-left.png", 12.0, 24.0],
428 ["default-button-bezel-rounded-highlighted-center.png", 1.0, 24.0],
429 ["default-button-bezel-rounded-highlighted-right.png", 12.0, 24.0]
430 ],
431 PatternIsHorizontal),
432
433 defaultRoundedDisabledBezelColor = PatternColor(
434 [
435 ["default-button-bezel-rounded-disabled-left.png", 12.0, 24.0],
436 ["default-button-bezel-rounded-disabled-center.png", 1.0, 24.0],
437 ["default-button-bezel-rounded-disabled-right.png", 12.0, 24.0]
438 ],
439 PatternIsHorizontal),
440
441
442 defaultTextColor = [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:1.0],
443 defaultDisabledTextColor = [CPColor colorWithCalibratedRed:13.0 / 255.0 green:51.0 / 255.0 blue:70.0 / 255.0 alpha:0.6];
444
445 themedButtonValues =
446 [
447 [@"font", [CPFont boldSystemFontOfSize:12.0], CPThemeStateBordered],
448 [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]],
449 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateBordered],
450 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateBordered | CPThemeStateDisabled],
451 [@"text-shadow-offset", CGSizeMake(0.0, 1.0), CPThemeStateBordered],
452 [@"line-break-mode", CPLineBreakByTruncatingTail],
453 [@"bezel-color", bezelColor, CPThemeStateBordered],
454 [@"bezel-color", highlightedBezelColor, CPThemeStateBordered | CPThemeStateHighlighted],
455 [@"bezel-color", disabledBezelColor, CPThemeStateBordered | CPThemeStateDisabled],
456 [@"bezel-color", defaultBezelColor, CPThemeStateBordered | CPThemeStateDefault],
457 [@"bezel-color", defaultHighlightedBezelColor, CPThemeStateBordered | CPThemeStateHighlighted | CPThemeStateDefault],
458 [@"bezel-color", defaultDisabledBezelColor, CPThemeStateBordered | CPThemeStateDefault | CPThemeStateDisabled],
459 [@"content-inset", CGInsetMake(0.0, 7.0, 0.0, 7.0), CPThemeStateBordered],
460
461 [@"bezel-color", roundedBezelColor, CPThemeStateBordered | CPButtonStateBezelStyleRounded],
462 [@"bezel-color", roundedHighlightedBezelColor, CPThemeStateBordered | CPThemeStateHighlighted | CPButtonStateBezelStyleRounded],
463 [@"bezel-color", roundedDisabledBezelColor, CPThemeStateBordered | CPThemeStateDisabled | CPButtonStateBezelStyleRounded],
464 [@"bezel-color", defaultRoundedBezelColor, CPThemeStateBordered | CPThemeStateDefault | CPButtonStateBezelStyleRounded],
465 [@"bezel-color", defaultRoundedHighlightedBezelColor, CPThemeStateBordered | CPThemeStateHighlighted | CPThemeStateDefault | CPButtonStateBezelStyleRounded],
466 [@"bezel-color", defaultRoundedDisabledBezelColor, CPThemeStateBordered | CPThemeStateDefault | CPThemeStateDisabled | CPButtonStateBezelStyleRounded],
467 [@"content-inset", CGInsetMake(0.0, 10.0, 0.0, 10.0), CPThemeStateBordered | CPButtonStateBezelStyleRounded],
468
469 [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateDisabled],
470
471
472 [@"text-color", defaultTextColor, CPThemeStateDefault],
473 [@"text-color", defaultDisabledTextColor, CPThemeStateDefault | CPThemeStateDisabled],
474
475 [@"min-size", CGSizeMake(0.0, CPButtonDefaultHeight)],
476 [@"max-size", CGSizeMake(-1.0, CPButtonDefaultHeight)],
477
478 [@"image-offset", CPButtonImageOffset]
479 ];
480
481 [self registerThemeValues:themedButtonValues forView:button];
482
483 return button;
484}
485
486+ (CPButton)themedStandardButton
487{
488 var button = [self button];
489
490 [button setTitle:@"Cancel"];
491
492 return button;
493}
494
495+ (CPButton)themedDefaultButton
496{
497 var button = [self button];
498
499 [button setTitle:@"OK"];
500 [button setThemeState:CPThemeStateDefault];
501
502 return button;
503}
504
505+ (CPButton)themedRoundedButton
506{
507 var button = [self button];
508
509 [button setTitle:@"Save"];
510 [button setThemeState:CPButtonStateBezelStyleRounded];
511
512 return button;
513}
514
515+ (CPPopUpButton)themedPopUpButton
516{
517 var button = [[CPPopUpButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 24.0) pullsDown:NO],
518 color = PatternColor(
519 [
520 ["popup-bezel-left.png", 3.0, 24.0],
521 ["popup-bezel-center.png", 1.0, 24.0],
522 ["popup-bezel-right.png", 21.0, 24.0]
523 ],
524 PatternIsHorizontal),
525
526 disabledColor = PatternColor(
527 [
528 ["popup-bezel-disabled-left.png", 3.0, 24.0],
529 ["popup-bezel-disabled-center.png", 1.0, 24.0],
530 ["popup-bezel-disabled-right.png", 21.0, 24.0]
531 ],
532 PatternIsHorizontal),
533
534 themeValues =
535 [
536 [@"bezel-color", color, CPThemeStateBordered],
537 [@"bezel-color", disabledColor, CPThemeStateBordered | CPThemeStateDisabled],
538
539 [@"content-inset", CGInsetMake(0, 21.0 + 5.0, 0, 5.0), CPThemeStateBordered],
540 [@"font", [CPFont boldSystemFontOfSize:12.0]],
541 [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]],
542 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]],
543
544 [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateBordered | CPThemeStateDisabled],
545 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:0.6], CPThemeStateBordered | CPThemeStateDisabled],
546
547 [@"min-size", CGSizeMake(32.0, 24.0)],
548 [@"max-size", CGSizeMake(-1.0, 24.0)]
549 ];
550
551 [self registerThemeValues:themeValues forView:button];
552
553 [button setTitle:@"Pop Up"];
554 [button addItemWithTitle:@"item"];
555
556 return button;
557}
558
559+ (CPPopUpButton)themedPullDownMenu
560{
561 var button = [[CPPopUpButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 24.0) pullsDown:YES],
562 color = PatternColor(
563 [
564 ["popup-bezel-left.png", 3.0, 24.0],
565 ["popup-bezel-center.png", 1.0, 24.0],
566 ["popup-bezel-right-pullsdown.png", 21.0, 24.0]
567 ],
568 PatternIsHorizontal),
569
570 disabledColor = PatternColor(
571 [
572 ["popup-bezel-disabled-left.png", 3.0, 24.0],
573 ["popup-bezel-disabled-center.png", 1.0, 24.0],
574 ["popup-bezel-disabled-right-pullsdown.png", 21.0, 24.0]
575 ],
576 PatternIsHorizontal),
577
578 themeValues =
579 [
580 [@"bezel-color", color, CPPopUpButtonStatePullsDown | CPThemeStateBordered],
581 [@"bezel-color", disabledColor, CPPopUpButtonStatePullsDown | CPThemeStateBordered | CPThemeStateDisabled],
582
583 [@"content-inset", CGInsetMake(0, 27.0 + 5.0, 0, 5.0), CPThemeStateBordered],
584 [@"font", [CPFont boldSystemFontOfSize:12.0]],
585 [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]],
586 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]],
587
588 [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateBordered | CPThemeStateDisabled],
589 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:0.6], CPThemeStateBordered | CPThemeStateDisabled],
590
591 [@"min-size", CGSizeMake(32.0, 24.0)],
592 [@"max-size", CGSizeMake(-1.0, 24.0)]
593 ];
594
595 [self registerThemeValues:themeValues forView:button];
596
597 [button setTitle:@"Pull Down"];
598 [button addItemWithTitle:@"item"];
599
600 return button;
601}
602
603+ (CPScrollView)themedScrollView
604{
605 var scrollView = [[CPScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)];
606
607 var borderColor = [CPColor colorWithWhite:0.0 alpha:0.2],
608 bottomCornerColor = PatternColor(@"scrollview-bottom-corner-color.png", 15.0, 15.0);
609
610 var themedScrollViewValues =
611 [
612 [@"border-color", borderColor],
613 [@"bottom-corner-color", bottomCornerColor]
614 ];
615
616 [self registerThemeValues:themedScrollViewValues forView:scrollView];
617
618 [scrollView setAutohidesScrollers:YES];
619 [scrollView setBorderType:CPLineBorder];
620
621 return scrollView;
622}
623
624+ (CPScroller)makeVerticalScroller
625{
626 var scroller = [[CPScroller alloc] initWithFrame:CGRectMake(0.0, 0.0, 15.0, 170.0)];
627
628 [scroller setFloatValue:0.1];
629 [scroller setKnobProportion:0.5];
630
631 return scroller;
632}
633
634+ (CPScroller)themedVerticalScroller
635{
636 var scroller = [self makeVerticalScroller],
637 trackColor = PatternColor("scroller-vertical-track.png", 15.0, 1.0),
638 disabledTrackColor = PatternColor("scroller-vertical-track-disabled.png", 15.0, 1.0),
639
640 upArrowColor = PatternColor("scroller-up-arrow.png", 15.0, 24.0),
641 highlightedUpArrowColor = PatternColor("scroller-up-arrow-highlighted.png", 15.0, 24.0),
642 disabledUpArrowColor = PatternColor("scroller-up-arrow-disabled.png", 15.0, 24.0),
643
644 downArrowColor = PatternColor("scroller-down-arrow.png", 15.0, 24.0),
645 highlightedDownArrowColor = PatternColor("scroller-down-arrow-highlighted.png", 15.0, 24.0),
646 disabledDownArrowColor = PatternColor("scroller-down-arrow-disabled.png", 15.0, 24.0),
647
648 knobColor = PatternColor(
649 [
650 ["scroller-vertical-knob-top.png", 15.0, 10.0],
651 ["scroller-vertical-knob-center.png", 15.0, 1.0],
652 ["scroller-vertical-knob-bottom.png", 15.0, 10.0]
653 ],
654 PatternIsVertical),
655
656 disabledKnobColor = PatternColor(
657 [
658 ["scroller-vertical-knob-disabled-top.png", 15.0, 10.0],
659 ["scroller-vertical-knob-disabled-center.png", 15.0, 1.0],
660 ["scroller-vertical-knob-disabled-bottom.png", 15.0, 10.0]
661 ],
662 PatternIsVertical);
663
664 themedVerticalScrollerValues =
665 [
666 [@"minimum-knob-length", 21.0, CPThemeStateVertical],
667 [@"knob-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateVertical],
668 [@"track-inset", CGInsetMake(-10.0, 0.0, -10.0, 0.0), CPThemeStateVertical],
669
670 [@"knob-color", knobColor, CPThemeStateVertical],
671 [@"knob-color", disabledKnobColor, CPThemeStateVertical | CPThemeStateDisabled],
672
673 [@"knob-slot-color", trackColor, CPThemeStateVertical],
674 [@"knob-slot-color", disabledTrackColor, CPThemeStateVertical | CPThemeStateDisabled],
675
676 [@"decrement-line-size", CGSizeMake(15.0, 24.0), CPThemeStateVertical],
677 [@"decrement-line-color", upArrowColor, CPThemeStateVertical],
678 [@"decrement-line-color", highlightedUpArrowColor, CPThemeStateVertical | CPThemeStateHighlighted],
679 [@"decrement-line-color", disabledUpArrowColor, CPThemeStateVertical | CPThemeStateDisabled],
680
681 [@"increment-line-size", CGSizeMake(15.0, 24.0), CPThemeStateVertical],
682 [@"increment-line-color", downArrowColor, CPThemeStateVertical],
683 [@"increment-line-color", highlightedDownArrowColor, CPThemeStateVertical | CPThemeStateHighlighted],
684 [@"increment-line-color", disabledDownArrowColor, CPThemeStateVertical | CPThemeStateDisabled]
685 ];
686
687 [self registerThemeValues:themedVerticalScrollerValues forView:scroller];
688
689 return scroller;
690}
691
692+ (CPScroller)makeHorizontalScroller
693{
694 var scroller = [[CPScroller alloc] initWithFrame:CGRectMake(0.0, 0.0, 170.0, 15.0)];
695
696 [scroller setFloatValue:0.1];
697 [scroller setKnobProportion:0.5];
698
699 return scroller;
700}
701
702+ (CPScroller)themedHorizontalScroller
703{
704 var scroller = [self makeHorizontalScroller],
705 trackColor = PatternColor("scroller-horizontal-track.png", 1.0, 15.0),
706 disabledTrackColor = PatternColor("scroller-horizontal-track-disabled.png", 1.0, 15.0),
707
708 leftArrowColor = PatternColor("scroller-left-arrow.png", 24.0, 15.0),
709 highlightedLeftArrowColor = PatternColor("scroller-left-arrow-highlighted.png", 24.0, 15.0),
710 disabledLeftArrowColor = PatternColor("scroller-left-arrow-disabled.png", 24.0, 15.0),
711
712 rightArrowColor = PatternColor("scroller-right-arrow.png", 24.0, 15.0),
713 highlightedRightArrowColor = PatternColor("scroller-right-arrow-highlighted.png", 24.0, 15.0),
714 disabledRightArrowColor = PatternColor("scroller-right-arrow-disabled.png", 24.0, 15.0),
715
716 knobColor = PatternColor(
717 [
718 ["scroller-horizontal-knob-left.png", 10.0, 15.0],
719 ["scroller-horizontal-knob-center.png", 1.0, 15.0],
720 ["scroller-horizontal-knob-right.png", 10.0, 15.0]
721 ],
722 PatternIsHorizontal),
723
724 disabledKnobColor = PatternColor(
725 [
726 ["scroller-horizontal-knob-disabled-left.png", 10.0, 15.0],
727 ["scroller-horizontal-knob-disabled-center.png", 1.0, 15.0],
728 ["scroller-horizontal-knob-disabled-right.png", 10.0, 15.0]
729 ],
730 PatternIsHorizontal);
731
732 themedHorizontalScrollerValues =
733 [
734 [@"minimum-knob-length", 21.0],
735 [@"knob-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0)],
736 [@"track-inset", CGInsetMake(0.0, -10.0, 0.0, -11.0)],
737
738 [@"knob-color", knobColor],
739 [@"knob-color", disabledKnobColor, CPThemeStateDisabled],
740
741 [@"knob-slot-color", trackColor],
742 [@"knob-slot-color", disabledTrackColor, CPThemeStateDisabled],
743
744 [@"decrement-line-size", CGSizeMake(24.0, 15.0)],
745 [@"decrement-line-color", leftArrowColor],
746 [@"decrement-line-color", highlightedLeftArrowColor, CPThemeStateHighlighted],
747 [@"decrement-line-color", disabledLeftArrowColor, CPThemeStateDisabled],
748
749 [@"increment-line-size", CGSizeMake(24.0, 15.0)],
750 [@"increment-line-color", rightArrowColor],
751 [@"increment-line-color", highlightedRightArrowColor, CPThemeStateHighlighted],
752 [@"increment-line-color", disabledRightArrowColor, CPThemeStateDisabled]
753 ];
754
755 [self registerThemeValues:themedHorizontalScrollerValues forView:scroller];
756
757 return scroller;
758}
759
760+ (CPTextField)themedStandardTextField
761{
762 var textfield = [[CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 29.0)],
763
764 bezelColor = PatternColor(
765 [
766 ["textfield-bezel-square-0.png", 6.0, 6.0],
767 ["textfield-bezel-square-1.png", 1.0, 6.0],
768 ["textfield-bezel-square-2.png", 6.0, 6.0],
769 ["textfield-bezel-square-3.png", 6.0, 1.0],
770 ["textfield-bezel-square-4.png", 1.0, 1.0],
771 ["textfield-bezel-square-5.png", 6.0, 1.0],
772 ["textfield-bezel-square-6.png", 6.0, 6.0],
773 ["textfield-bezel-square-7.png", 1.0, 6.0],
774 ["textfield-bezel-square-8.png", 6.0, 6.0]
775 ]),
776
777 bezelFocusedColor = PatternColor(
778 [
779 ["textfield-bezel-square-focused-0.png", 6.0, 6.0],
780 ["textfield-bezel-square-focused-1.png", 1.0, 6.0],
781 ["textfield-bezel-square-focused-2.png", 6.0, 6.0],
782 ["textfield-bezel-square-focused-3.png", 6.0, 1.0],
783 ["textfield-bezel-square-focused-4.png", 1.0, 1.0],
784 ["textfield-bezel-square-focused-5.png", 6.0, 1.0],
785 ["textfield-bezel-square-focused-6.png", 6.0, 6.0],
786 ["textfield-bezel-square-focused-7.png", 1.0, 6.0],
787 ["textfield-bezel-square-focused-8.png", 6.0, 6.0]
788 ]),
789
790 bezelDisabledColor = PatternColor(
791 [
792 ["textfield-bezel-square-disabled-0.png", 6.0, 6.0],
793 ["textfield-bezel-square-disabled-1.png", 1.0, 6.0],
794 ["textfield-bezel-square-disabled-2.png", 6.0, 6.0],
795 ["textfield-bezel-square-disabled-3.png", 6.0, 1.0],
796 ["textfield-bezel-square-disabled-4.png", 1.0, 1.0],
797 ["textfield-bezel-square-disabled-5.png", 6.0, 1.0],
798 ["textfield-bezel-square-disabled-6.png", 6.0, 6.0],
799 ["textfield-bezel-square-disabled-7.png", 1.0, 6.0],
800 ["textfield-bezel-square-disabled-8.png", 6.0, 6.0]
801 ]),
802
803 textDisabledColor = [CPColor colorWithCalibratedWhite:0.60 alpha:1.0],
804 placeholderColor = [CPColor colorWithCalibratedRed:189.0 / 255.0 green:199.0 / 255.0 blue:211.0 / 255.0 alpha:1.0];
805
806 // Global for reuse by subclasses
807 themedTextFieldValues =
808 [
809 [@"vertical-alignment", CPTopVerticalTextAlignment, CPThemeStateBezeled],
810 [@"bezel-color", bezelColor, CPThemeStateBezeled],
811 [@"bezel-color", bezelFocusedColor, CPThemeStateBezeled | CPThemeStateEditing],
812 [@"bezel-color", bezelDisabledColor, CPThemeStateBezeled | CPThemeStateDisabled],
813 [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateBezeled],
814
815 // no border
816 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0)],
817 [@"content-inset", CGInsetMake(2.0, 2.0, 2.0, 2.0)], // as defined in [CPTextField +themeAttributes]
818
819 // with border
820 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBezeled],
821 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBezeled | CPThemeStateEditing],
822 [@"border-inset", CGInsetMake(3.0, 3.0, 3.0, 3.0), CPThemeStateBezeled],
823 [@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 8.0), CPThemeStateBezeled],
824 [@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 8.0), CPThemeStateBezeled | CPThemeStateEditing],
825
826 [@"text-color", textDisabledColor, CPThemeStateBezeled | CPThemeStateDisabled],
827 [@"text-color", placeholderColor, CPTextFieldStatePlaceholder],
828
829 [@"line-break-mode", CPLineBreakByTruncatingTail, CPThemeStateTableDataView],
830 [@"vertical-alignment", CPCenterVerticalTextAlignment, CPThemeStateTableDataView],
831 [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 4.0), CPThemeStateTableDataView],
832
833 [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView],
834 [@"text-color", [CPColor whiteColor], CPThemeStateTableDataView | CPThemeStateSelectedTableDataView],
835 [@"font", [CPFont boldSystemFontOfSize:12.0], CPThemeStateTableDataView | CPThemeStateSelectedTableDataView],
836 [@"text-color", [CPColor blackColor], CPThemeStateTableDataView | CPThemeStateEditing],
837 [@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 4.0), CPThemeStateTableDataView | CPThemeStateEditing],
838 [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateTableDataView | CPThemeStateEditing],
839 [@"bezel-inset", CGInsetMake(-1.0, -1.0, -1.0, -1.0), CPThemeStateTableDataView | CPThemeStateEditing],
840
841 [@"text-color", [CPColor colorWithCalibratedWhite:125.0 / 255.0 alpha:1.0], CPThemeStateTableDataView | CPThemeStateGroupRow],
842 [@"text-color", [CPColor colorWithCalibratedWhite:1.0 alpha:1.0], CPThemeStateTableDataView | CPThemeStateGroupRow | CPThemeStateSelectedTableDataView],
843 [@"text-shadow-color", [CPColor whiteColor], CPThemeStateTableDataView | CPThemeStateGroupRow],
844 [@"text-shadow-offset", CGSizeMake(0,1), CPThemeStateTableDataView | CPThemeStateGroupRow],
845 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:0.0 alpha:0.6], CPThemeStateTableDataView | CPThemeStateGroupRow | CPThemeStateSelectedTableDataView],
846 [@"font", [CPFont boldSystemFontOfSize:12.0], CPThemeStateTableDataView | CPThemeStateGroupRow]
847 ];
848
849 [self registerThemeValues:themedTextFieldValues forView:textfield];
850
851 [textfield setBezeled:YES];
852
853 [textfield setPlaceholderString:"placeholder"];
854 [textfield setStringValue:""];
855 [textfield setEditable:YES];
856
857 return textfield;
858}
859
860+ (CPTextField)themedRoundedTextField
861{
862 var textfield = [[CPTextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 30.0)],
863 bezelColor = PatternColor(
864 [
865 ["textfield-bezel-rounded-left.png", 15.0, 30.0],
866 ["textfield-bezel-rounded-center.png", 1.0, 30.0],
867 ["textfield-bezel-rounded-right.png", 15.0, 30.0]
868 ],
869 PatternIsHorizontal),
870
871 bezelFocusedColor = PatternColor(
872 [
873 ["textfield-bezel-rounded-focused-left.png", 15.0, 30.0],
874 ["textfield-bezel-rounded-focused-center.png", 1.0, 30.0],
875 ["textfield-bezel-rounded-focused-right.png", 15.0, 30.0]
876 ],
877 PatternIsHorizontal),
878
879 bezelDisabledColor = PatternColor(
880 [
881 ["textfield-bezel-rounded-disabled-left.png", 15.0, 30.0],
882 ["textfield-bezel-rounded-disabled-center.png", 1.0, 30.0],
883 ["textfield-bezel-rounded-disabled-right.png", 15.0, 30.0]
884 ],
885 PatternIsHorizontal),
886
887 placeholderColor = [CPColor colorWithCalibratedRed:189.0 / 255.0 green:199.0 / 255.0 blue:211.0 / 255.0 alpha:1.0];
888
889 // Global for reuse by CPSearchField
890 themedRoundedTextFieldValues =
891 [
892 [@"bezel-color", bezelColor, CPTextFieldStateRounded | CPThemeStateBezeled],
893 [@"bezel-color", bezelFocusedColor, CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateEditing],
894 [@"bezel-color", bezelDisabledColor, CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateDisabled],
895 [@"font", [CPFont systemFontOfSize:12.0]],
896
897 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPTextFieldStateRounded | CPThemeStateBezeled],
898 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateEditing],
899
900 // There is one extra empty pixel at the bottom for size compatibility with an earlier version.
901 [@"content-inset", CGInsetMake(8.0, 15.0, 8.0, 15.0), CPTextFieldStateRounded | CPThemeStateBezeled],
902 [@"content-inset", CGInsetMake(8.0, 15.0, 8.0, 15.0), CPTextFieldStateRounded | CPThemeStateBezeled | CPThemeStateEditing],
903
904 [@"text-color", placeholderColor, CPTextFieldStateRounded | CPTextFieldStatePlaceholder],
905
906 [@"min-size", CGSizeMake(0.0, 30.0), CPTextFieldStateRounded | CPThemeStateBezeled],
907 [@"max-size", CGSizeMake(-1.0, 30.0), CPTextFieldStateRounded | CPThemeStateBezeled]
908 ];
909
910 [self registerThemeValues:themedRoundedTextFieldValues forView:textfield];
911
912 [textfield setBezeled:YES];
913 [textfield setBezelStyle:CPTextFieldRoundedBezel];
914
915 [textfield setPlaceholderString:"placeholder"];
916 [textfield setStringValue:""];
917 [textfield setEditable:YES];
918
919 return textfield;
920}
921
922+ (CPSearchField)themedSearchField
923{
924 var searchField = [[CPSearchField alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 30.0)];
925
926 [self registerThemeValues:nil forView:searchField inherit:themedRoundedTextFieldValues];
927 return searchField;
928}
929
930+ (CPTokenField)themedTokenField
931{
932 var tokenfield = [[CPTokenField alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 29.0)],
933
934 overrides =
935 [
936 // Non-bezeled token field with tokens
937 [@"content-inset", CGInsetMake(5.0, 8.0, 4.0, 8.0)],
938
939 // Non-bezeled token field with no tokens
940 [@"content-inset", CGInsetMake(7.0, 8.0, 6.0, 8.0), CPTextFieldStatePlaceholder],
941
942 // Bezeled token field with tokens
943 [@"content-inset", CGInsetMake(6.0, 8.0, 5.0, 8.0), CPThemeStateBezeled],
944
945 // Bezeled token field with no tokens
946 [@"content-inset", CGInsetMake(8.0, 8.0, 7.0, 8.0), CPThemeStateBezeled | CPTextFieldStatePlaceholder],
947 ];
948
949 [self registerThemeValues:overrides forView:tokenfield inherit:themedTextFieldValues];
950
951 return tokenfield;
952}
953
954+ (_CPTokenFieldToken)themedTokenFieldToken
955{
956 var token = [[_CPTokenFieldToken alloc] initWithFrame:CGRectMake(0.0, 0.0, 60.0, 19.0)],
957
958 bezelColor = PatternColor(
959 [
960 ["token-left.png", 11.0, 19.0],
961 ["token-center.png", 1.0, 19.0],
962 ["token-right.png", 11.0, 19.0]
963 ],
964 PatternIsHorizontal),
965
966 bezelHighlightedColor = PatternColor(
967 [
968 ["token-highlighted-left.png", 11.0, 19.0],
969 ["token-highlighted-center.png", 1.0, 19.0],
970 ["token-highlighted-right.png", 11.0, 19.0]
971 ],
972 PatternIsHorizontal),
973
974 textColor = [CPColor colorWithRed:41.0 / 255.0 green:51.0 / 255.0 blue:64.0 / 255.0 alpha:1.0],
975 textHighlightedColor = [CPColor whiteColor],
976
977 themeValues =
978 [
979 [@"bezel-color", bezelColor, CPThemeStateBezeled],
980 [@"bezel-color", bezelHighlightedColor, CPThemeStateBezeled | CPThemeStateHighlighted],
981
982 [@"text-color", textColor],
983 [@"text-color", textHighlightedColor, CPThemeStateHighlighted],
984
985 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBezeled],
986 [@"content-inset", CGInsetMake(1.0, 23.0, 3.0, 15.0), CPThemeStateBezeled],
987
988 // Minimum height == maximum height since tokens are fixed height.
989 [@"min-size", CGSizeMake(0.0, 19.0)],
990 [@"max-size", CGSizeMake(-1.0, 19.0)],
991
992 [@"vertical-alignment", CPCenterTextAlignment]
993 ];
994
995 [self registerThemeValues:themeValues forView:token];
996
997 return token;
998}
999
1000+ (_CPTokenFieldTokenCloseButton)themedTokenFieldTokenCloseButton
1001{
1002 var button = [[_CPTokenFieldTokenCloseButton alloc] initWithFrame:CGRectMake(0, 0, 9, 9)],
1003
1004 bezelColor = PatternColor("token-close.png", 8.0, 8.0),
1005 bezelHighlightedColor = PatternColor("token-close-highlighted.png", 8.0, 8.0),
1006
1007 themeValues =
1008 [
1009 [@"bezel-color", bezelColor, CPThemeStateBordered],
1010 [@"bezel-color", bezelHighlightedColor, CPThemeStateBordered | CPThemeStateHighlighted],
1011
1012 [@"min-size", CGSizeMake(8.0, 8.0)],
1013 [@"max-size", CGSizeMake(8.0, 8.0)],
1014
1015 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered],
1016 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateBordered | CPThemeStateHighlighted],
1017
1018 [@"offset", CGPointMake(17, 6), CPThemeStateBordered]
1019 ];
1020
1021 [self registerThemeValues:themeValues forView:button];
1022
1023 return button;
1024}
1025
1026+ (CPComboBox)themedComboBox
1027{
1028 var combo = [[CPComboBox alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 29.0)],
1029
1030 bezelColor = PatternColor(
1031 [
1032 ["combobox-bezel-left.png", 6.0, 29.0],
1033 ["combobox-bezel-center.png", 1.0, 29.0],
1034 ["combobox-bezel-right.png", 24.0, 29.0]
1035 ],
1036 PatternIsHorizontal),
1037
1038 bezelFocusedColor = PatternColor(
1039 [
1040 ["combobox-bezel-focused-left.png", 6.0, 29.0],
1041 ["combobox-bezel-focused-center.png", 1.0, 29.0],
1042 ["combobox-bezel-focused-right.png", 24.0, 29.0]
1043 ],
1044 PatternIsHorizontal),
1045
1046 bezelDisabledColor = PatternColor(
1047 [
1048 ["combobox-bezel-disabled-left.png", 6.0, 29.0],
1049 ["combobox-bezel-disabled-center.png", 1.0, 29.0],
1050 ["combobox-bezel-disabled-right.png", 24.0, 29.0]
1051 ],
1052 PatternIsHorizontal),
1053
1054 bezelNoBorderColor = PatternColor(
1055 [
1056 ["combobox-bezel-no-border-left.png", 6.0, 29.0],
1057 ["combobox-bezel-no-border-center.png", 1.0, 29.0],
1058 ["combobox-bezel-no-border-right.png", 24.0, 29.0]
1059 ],
1060 PatternIsHorizontal),
1061
1062 bezelNoBorderFocusedColor = PatternColor(
1063 [
1064 ["combobox-bezel-no-border-focused-left.png", 6.0, 29.0],
1065 ["combobox-bezel-no-border-focused-center.png", 1.0, 29.0],
1066 ["combobox-bezel-no-border-focused-right.png", 24.0, 29.0]
1067 ],
1068 PatternIsHorizontal),
1069
1070 bezelNoBorderDisabledColor = PatternColor(
1071 [
1072 ["combobox-bezel-no-border-disabled-left.png", 6.0, 29.0],
1073 ["combobox-bezel-no-border-disabled-center.png", 1.0, 29.0],
1074 ["combobox-bezel-no-border-disabled-right.png", 24.0, 29.0]
1075 ],
1076 PatternIsHorizontal),
1077
1078 overrides =
1079 [
1080 [@"bezel-color", bezelColor, CPThemeStateBezeled | CPComboBoxStateButtonBordered],
1081 [@"bezel-color", bezelFocusedColor, CPThemeStateBezeled | CPComboBoxStateButtonBordered | CPThemeStateEditing],
1082 [@"bezel-color", bezelDisabledColor, CPThemeStateBezeled | CPComboBoxStateButtonBordered | CPThemeStateDisabled],
1083
1084 [@"bezel-color", bezelNoBorderColor, CPThemeStateBezeled],
1085 [@"bezel-color", bezelNoBorderFocusedColor, CPThemeStateBezeled | CPThemeStateEditing],
1086 [@"bezel-color", bezelNoBorderDisabledColor, CPThemeStateBezeled | CPThemeStateDisabled],
1087
1088 // The right border inset has to make room for the focus ring and popup button
1089 [@"content-inset", CGInsetMake(8.0, 27.0, 7.0, 8.0), CPThemeStateBezeled | CPComboBoxStateButtonBordered],
1090 [@"content-inset", CGInsetMake(8.0, 24.0, 7.0, 8.0), CPThemeStateBezeled],
1091 [@"content-inset", CGInsetMake(8.0, 24.0, 7.0, 8.0), CPThemeStateBezeled | CPThemeStateEditing],
1092
1093 [@"popup-button-size", CGSizeMake(21.0, 23.0), CPThemeStateBezeled | CPComboBoxStateButtonBordered],
1094 [@"popup-button-size", CGSizeMake(17.0, 23.0), CPThemeStateBezeled],
1095
1096 // Because combo box uses a three-part bezel, the height is fixed
1097 [@"min-size", CGSizeMake(0, 29.0)],
1098 [@"max-size", CGSizeMake(-1, 29.0)]
1099 ];
1100
1101 [self registerThemeValues:overrides forView:combo inherit:themedTextFieldValues];
1102
1103 return combo;
1104}
1105
1106+ (CPRadioButton)themedRadioButton
1107{
1108 var button = [CPRadio radioWithTitle:@"Hello Friend!"],
1109
1110 imageNormal = PatternImage("radio-image.png", 17.0, 17.0),
1111 imageSelected = PatternImage("radio-image-selected.png", 17.0, 17.0),
1112 imageSelectedHighlighted = PatternImage("radio-image-selected-highlighted.png", 17.0, 17.0),
1113 imageSelectedDisabled = PatternImage("radio-image-selected-disabled.png", 17.0, 17.0),
1114 imageDisabled = PatternImage("radio-image-disabled.png", 17.0, 17.0),
1115 imageHighlighted = PatternImage("radio-image-highlighted.png", 17.0, 17.0),
1116
1117 themeValues =
1118 [
1119 [@"alignment", CPLeftTextAlignment, CPThemeStateNormal],
1120 [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateNormal],
1121 [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateNormal],
1122
1123 [@"image", imageNormal, CPThemeStateNormal],
1124 [@"image", imageSelected, CPThemeStateSelected],
1125 [@"image", imageSelectedHighlighted, CPThemeStateSelected | CPThemeStateHighlighted],
1126 [@"image", imageHighlighted, CPThemeStateHighlighted],
1127 [@"image", imageDisabled, CPThemeStateDisabled],
1128 [@"image", imageSelectedDisabled, CPThemeStateSelected | CPThemeStateDisabled],
1129 [@"image-offset", CPRadioImageOffset],
1130
1131 [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], CPThemeStateDisabled],
1132
1133 [@"min-size", CGSizeMake(0.0, 17.0)],
1134 [@"max-size", CGSizeMake(-1.0, -1.0)]
1135 ];
1136
1137 [self registerThemeValues:themeValues forView:button];
1138
1139 return button;
1140}
1141
1142+ (CPCheckBox)themedCheckBoxButton
1143{
1144 var button = [CPCheckBox checkBoxWithTitle:@"Another Option"],
1145
1146 imageNormal = PatternImage("check-box-image.png", 15.0, 16.0),
1147 imageSelected = PatternImage("check-box-image-selected.png", 15.0, 16.0),
1148 imageSelectedHighlighted = PatternImage("check-box-image-selected-highlighted.png", 15.0, 16.0),
1149 imageSelectedDisabled = PatternImage("check-box-image-selected-disabled.png", 15.0, 16.0),
1150 imageDisabled = PatternImage("check-box-image-disabled.png", 15.0, 16.0),
1151 imageHighlighted = PatternImage("check-box-image-highlighted.png", 15.0, 16.0),
1152
1153 themeValues =
1154 [
1155 [@"alignment", CPLeftTextAlignment, CPThemeStateNormal],
1156 [@"font", [CPFont systemFontOfSize:12.0], CPThemeStateNormal],
1157 [@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateNormal],
1158
1159 [@"image", imageNormal, CPThemeStateNormal],
1160 [@"image", imageSelected, CPThemeStateSelected],
1161 [@"image", imageSelectedHighlighted, CPThemeStateSelected | CPThemeStateHighlighted],
1162 [@"image", imageHighlighted, CPThemeStateHighlighted],
1163 [@"image", imageDisabled, CPThemeStateDisabled],
1164 [@"image", imageSelectedDisabled, CPThemeStateSelected | CPThemeStateDisabled],
1165 [@"image-offset", CPCheckBoxImageOffset],
1166
1167 [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0], CPThemeStateDisabled],
1168
1169 [@"min-size", CGSizeMake(0.0, 17.0)],
1170 [@"max-size", CGSizeMake(-1.0, -1.0)]
1171 ];
1172
1173 [self registerThemeValues:themeValues forView:button];
1174
1175 return button;
1176}
1177
1178+ (CPCheckBox)themedMixedCheckBoxButton
1179{
1180 var button = [self themedCheckBoxButton];
1181
1182 [button setAllowsMixedState:YES];
1183 [button setState:CPMixedState];
1184
1185 var mixedHighlightedImage = PatternImage("check-box-image-mixed-highlighted.png", 15.0, 16.0),
1186 mixedDisabledImage = PatternImage("check-box-image-mixed-disabled.png", 15.0, 16.0),
1187 mixedImage = PatternImage("check-box-image-mixed.png", 15.0, 16.0),
1188
1189 themeValues =
1190 [
1191 [@"image", mixedImage, CPButtonStateMixed],
1192 [@"image", mixedHighlightedImage, CPButtonStateMixed | CPThemeStateHighlighted],
1193 [@"image", mixedDisabledImage, CPButtonStateMixed | CPThemeStateDisabled],
1194 [@"image-offset", CPCheckBoxImageOffset, CPButtonStateMixed],
1195 [@"max-size", CGSizeMake(-1.0, -1.0)]
1196 ];
1197
1198 [self registerThemeValues:themeValues forView:button];
1199
1200 return button;
1201}
1202
1203+ (CPSegmentedControl)makeSegmentedControl
1204{
1205 var segmentedControl = [[CPSegmentedControl alloc] initWithFrame:CGRectMake(0.0, 0.0, 0.0, 24.0)];
1206
1207 [segmentedControl setTrackingMode:CPSegmentSwitchTrackingSelectAny];
1208 [segmentedControl setSegmentCount:3];
1209
1210 [segmentedControl setWidth:40.0 forSegment:0];
1211 [segmentedControl setLabel:@"foo" forSegment:0];
1212 [segmentedControl setTag:1 forSegment:0];
1213
1214 [segmentedControl setWidth:60.0 forSegment:1];
1215 [segmentedControl setLabel:@"bar" forSegment:1];
1216 [segmentedControl setTag:2 forSegment:1];
1217
1218 [segmentedControl setWidth:35.0 forSegment:2];
1219 [segmentedControl setLabel:@"1" forSegment:2];
1220 [segmentedControl setTag:3 forSegment:2];
1221
1222 return segmentedControl;
1223};
1224
1225+ (CPSegmentedControl)themedSegmentedControl
1226{
1227 var segmentedControl = [self makeSegmentedControl],
1228
1229 centerBezelColor = PatternColor("segmented-control-bezel-center.png", 1.0, 24.0),
1230 dividerBezelColor = PatternColor("segmented-control-bezel-divider.png", 1.0, 24.0),
1231 centerHighlightedBezelColor = PatternColor("segmented-control-bezel-highlighted-center.png", 1.0, 24.0),
1232 dividerHighlightedBezelColor = PatternColor("segmented-control-bezel-highlighted-divider.png", 1.0, 24.0),
1233
1234 leftHighlightedBezelColor = PatternColor([
1235 ["segmented-control-bezel-highlighted-left.png", 4.0, 24.0],
1236 ["segmented-control-bezel-highlighted-center.png", 1.0, 24.0],
1237 ["segmented-control-bezel-highlighted-center.png", 1.0, 24.0]
1238 ], PatternIsHorizontal),
1239 rightHighlightedBezelColor = PatternColor([
1240 ["segmented-control-bezel-highlighted-center.png", 1.0, 24.0],
1241 ["segmented-control-bezel-highlighted-center.png", 1.0, 24.0],
1242 ["segmented-control-bezel-highlighted-right.png", 4.0, 24.0]
1243 ], PatternIsHorizontal),
1244
1245 inactiveCenterBezelColor = PatternColor("segmented-control-bezel-disabled-center.png", 1.0, 24.0),
1246 inactiveDividerBezelColor = PatternColor("segmented-control-bezel-disabled-divider.png", 1.0, 24.0),
1247
1248 inactiveLeftBezelColor = PatternColor([
1249 ["segmented-control-bezel-disabled-left.png", 4.0, 24.0],
1250 ["segmented-control-bezel-disabled-center.png", 1.0, 24.0],
1251 ["segmented-control-bezel-disabled-center.png", 1.0, 24.0]
1252 ], PatternIsHorizontal),
1253 inactiveRightBezelColor = PatternColor([
1254 ["segmented-control-bezel-disabled-center.png", 1.0, 24.0],
1255 ["segmented-control-bezel-disabled-center.png", 1.0, 24.0],
1256 ["segmented-control-bezel-disabled-right.png", 4.0, 24.0]
1257 ], PatternIsHorizontal),
1258
1259 inactiveHighlightedCenterBezelColor = PatternColor("segmented-control-bezel-highlighted-disabled-center.png", 1.0, 24.0),
1260 inactiveHighlightedDividerBezelColor = PatternColor("segmented-control-bezel-highlighted-disabled-divider.png", 1.0, 24.0),
1261
1262 inactiveHighlightedLeftBezelColor = PatternColor([
1263 ["segmented-control-bezel-highlighted-disabled-left.png", 4.0, 24.0],
1264 ["segmented-control-bezel-highlighted-disabled-center.png", 1.0, 24.0],
1265 ["segmented-control-bezel-highlighted-disabled-center.png", 1.0, 24.0]
1266 ], PatternIsHorizontal),
1267 inactiveHighlightedRightBezelColor = PatternColor([
1268 ["segmented-control-bezel-highlighted-disabled-center.png", 1.0, 24.0],
1269 ["segmented-control-bezel-highlighted-disabled-center.png", 1.0, 24.0],
1270 ["segmented-control-bezel-highlighted-disabled-right.png", 4.0, 24.0]
1271 ], PatternIsHorizontal),
1272
1273
1274 leftBezelColor = PatternColor([
1275 ["segmented-control-bezel-left.png", 4.0, 24.0],
1276 ["segmented-control-bezel-center.png", 1.0, 24.0],
1277 ["segmented-control-bezel-center.png", 1.0, 24.0]
1278 ], PatternIsHorizontal),
1279 rightBezelColor = PatternColor([
1280 ["segmented-control-bezel-center.png", 1.0, 24.0],
1281 ["segmented-control-bezel-center.png", 1.0, 24.0],
1282 ["segmented-control-bezel-right.png", 4.0, 24.0]
1283 ], PatternIsHorizontal),
1284
1285 pushedCenterBezelColor = PatternColor("segmented-control-bezel-pushed-center.png", 1.0, 24.0),
1286
1287 pushedLeftBezelColor = PatternColor([
1288 ["segmented-control-bezel-pushed-left.png", 4.0, 24.0],
1289 ["segmented-control-bezel-pushed-center.png", 1.0, 24.0],
1290 ["segmented-control-bezel-pushed-center.png", 1.0, 24.0]
1291 ], PatternIsHorizontal),
1292 pushedRightBezelColor = PatternColor([
1293 ["segmented-control-bezel-pushed-center.png", 1.0, 24.0],
1294 ["segmented-control-bezel-pushed-center.png", 1.0, 24.0],
1295 ["segmented-control-bezel-pushed-right.png", 4.0, 24.0]
1296 ], PatternIsHorizontal),
1297
1298 pushedHighlightedCenterBezelColor = PatternColor("segmented-control-bezel-pushed-highlighted-center.png", 1.0, 24.0),
1299
1300 pushedHighlightedLeftBezelColor = PatternColor([
1301 ["segmented-control-bezel-pushed-highlighted-left.png", 4.0, 24.0],
1302 ["segmented-control-bezel-pushed-highlighted-center.png", 1.0, 24.0],
1303 ["segmented-control-bezel-pushed-highlighted-center.png", 1.0, 24.0]
1304 ], PatternIsHorizontal),
1305 pushedHighlightedRightBezelColor = PatternColor([
1306 ["segmented-control-bezel-pushed-highlighted-center.png", 1.0, 24.0],
1307 ["segmented-control-bezel-pushed-highlighted-center.png", 1.0, 24.0],
1308 ["segmented-control-bezel-pushed-highlighted-right.png", 4.0, 24.0]
1309 ], PatternIsHorizontal),
1310
1311 themedSegmentedControlValues =
1312 [
1313 [@"center-segment-bezel-color", centerBezelColor, CPThemeStateNormal],
1314 [@"center-segment-bezel-color", inactiveCenterBezelColor, CPThemeStateDisabled],
1315 [@"center-segment-bezel-color", inactiveHighlightedCenterBezelColor, CPThemeStateSelected | CPThemeStateDisabled],
1316 [@"center-segment-bezel-color", centerHighlightedBezelColor, CPThemeStateSelected],
1317 [@"center-segment-bezel-color", pushedCenterBezelColor, CPThemeStateHighlighted],
1318 [@"center-segment-bezel-color", pushedHighlightedCenterBezelColor, CPThemeStateHighlighted | CPThemeStateSelected],
1319
1320 [@"divider-bezel-color", dividerBezelColor, CPThemeStateNormal],
1321 [@"divider-bezel-color", inactiveDividerBezelColor, CPThemeStateDisabled],
1322 [@"divider-bezel-color", inactiveHighlightedDividerBezelColor, CPThemeStateSelected | CPThemeStateDisabled],
1323 [@"divider-bezel-color", dividerHighlightedBezelColor, CPThemeStateSelected],
1324
1325 [@"left-segment-bezel-color", leftBezelColor, CPThemeStateNormal],
1326 [@"left-segment-bezel-color", inactiveLeftBezelColor, CPThemeStateDisabled],
1327 [@"left-segment-bezel-color", inactiveHighlightedLeftBezelColor, CPThemeStateSelected | CPThemeStateDisabled],
1328 [@"left-segment-bezel-color", leftHighlightedBezelColor, CPThemeStateSelected],
1329 [@"left-segment-bezel-color", pushedLeftBezelColor, CPThemeStateHighlighted],
1330 [@"left-segment-bezel-color", pushedHighlightedLeftBezelColor, CPThemeStateHighlighted | CPThemeStateSelected],
1331
1332 [@"right-segment-bezel-color", rightBezelColor, CPThemeStateNormal],
1333 [@"right-segment-bezel-color", inactiveRightBezelColor, CPThemeStateDisabled],
1334 [@"right-segment-bezel-color", inactiveHighlightedRightBezelColor, CPThemeStateSelected | CPThemeStateDisabled],
1335 [@"right-segment-bezel-color", rightHighlightedBezelColor, CPThemeStateSelected],
1336 [@"right-segment-bezel-color", pushedRightBezelColor, CPThemeStateHighlighted],
1337 [@"right-segment-bezel-color", pushedHighlightedRightBezelColor, CPThemeStateHighlighted | CPThemeStateSelected],
1338
1339 [@"content-inset", CGInsetMake(0.0, 4.0, 0.0, 4.0), CPThemeStateNormal],
1340 [@"bezel-inset", CGInsetMake(0.0, 0.0, 0.0, 0.0), CPThemeStateNormal],
1341
1342 [@"font", [CPFont boldSystemFontOfSize:12.0]],
1343 [@"text-color", [CPColor colorWithCalibratedWhite:79.0 / 255.0 alpha:1.0]],
1344 [@"text-color", [CPColor colorWithCalibratedWhite:0.6 alpha:1.0], CPThemeStateDisabled],
1345 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0]],
1346 [@"text-shadow-color", [CPColor colorWithCalibratedWhite:240.0 / 255.0 alpha:1.0], CPThemeStateDisabled],
1347 [@"text-shadow-offset", CGSizeMake(0.0, 1.0)],
1348 [@"line-break-mode", CPLineBreakByTruncatingTail],
1349
1350 [@"divider-thickness", 1.0],
1351 [@"default-height", 24.0]
1352 ];
1353
1354 [self registerThemeValues:themedSegmentedControlValues forView:segmentedControl];
1355
1356 return segmentedControl;
1357}
1358
1359+ (CPSlider)makeHorizontalSlider
1360{
1361 return [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, 24.0)];
1362}
1363
1364+ (CPSlider)themedHorizontalSlider
1365{
1366 var slider = [self makeHorizontalSlider],
1367
1368 trackColor = PatternColor(
1369 [
1370 ["horizontal-track-left.png", 4.0, 5.0],
1371 ["horizontal-track-center.png", 1.0, 5.0],
1372 ["horizontal-track-right.png", 4.0, 5.0]
1373 ],
1374 PatternIsHorizontal),
1375
1376 trackDisabledColor = PatternColor(
1377 [
1378 ["horizontal-track-disabled-left.png", 4.0, 5.0],
1379 ["horizontal-track-disabled-center.png", 1.0, 5.0],
1380 ["horizontal-track-disabled-right.png", 4.0, 5.0]
1381 ],
1382 PatternIsHorizontal),
1383
1384 knobColor = PatternColor("knob.png", 23.0, 24.0),
1385 knobHighlightedColor = PatternColor("knob-highlighted.png", 23.0, 24.0),
1386 knobDisabledColor = PatternColor("knob-disabled.png", 23.0, 24.0);
1387
1388 themedHorizontalSliderValues =
1389 [
1390 [@"track-width", 5.0],
1391 [@"track-color", trackColor],
1392 [@"track-color", trackDisabledColor, CPThemeStateDisabled],
1393
1394 [@"knob-size", CGSizeMake(23.0, 24.0)],
1395 [@"knob-color", knobColor],
1396 [@"knob-color", knobHighlightedColor, CPThemeStateHighlighted],
1397 [@"knob-color", knobDisabledColor, CPThemeStateDisabled]
1398 ];
1399
1400 [self registerThemeValues:themedHorizontalSliderValues forView:slider];
1401
1402 return slider;
1403}
1404
1405+ (CPSlider)makeVerticalSlider
1406{
1407 return [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 24.0, 50.0)];
1408}
1409
1410+ (CPSlider)themedVerticalSlider
1411{
1412 var slider = [self makeVerticalSlider],
1413
1414 trackColor = PatternColor(
1415 [
1416 ["vertical-track-top.png", 5.0, 6.0],
1417 ["vertical-track-center.png", 5.0, 1.0],
1418 ["vertical-track-bottom.png", 5.0, 4.0]
1419 ],
1420 PatternIsVertical),
1421
1422 trackDisabledColor = PatternColor(
1423 [
1424 ["vertical-track-disabled-top.png", 5.0, 6.0],
1425 ["vertical-track-disabled-center.png", 5.0, 1.0],
1426 ["vertical-track-disabled-bottom.png", 5.0, 4.0]
1427 ],
1428 PatternIsVertical),
1429
1430 knobColor = PatternColor("knob.png", 23.0, 24.0),
1431 knobHighlightedColor = PatternColor("knob-highlighted.png", 23.0, 24.0),
1432 knobDisabledColor = PatternColor("knob-disabled.png", 23.0, 24.0);
1433
1434 themedVerticalSliderValues =
1435 [
1436 [@"track-width", 5.0],
1437 [@"track-color", trackColor, CPThemeStateVertical],
1438 [@"track-color", trackDisabledColor, CPThemeStateVertical | CPThemeStateDisabled],
1439
1440 [@"knob-size", CGSizeMake(23.0, 24.0)],
1441 [@"knob-color", knobColor],
1442 [@"knob-color", knobHighlightedColor, CPThemeStateHighlighted],
1443 [@"knob-color", knobDisabledColor, CPThemeStateDisabled]
1444 ];
1445
1446 [self registerThemeValues:themedVerticalSliderValues forView:slider];
1447
1448 return slider;
1449}
1450
1451+ (CPSlider)makeCircularSlider
1452{
1453 var slider = [[CPSlider alloc] initWithFrame:CGRectMake(0.0, 0.0, 34.0, 34.0)];
1454
1455 [slider setSliderType:CPCircularSlider];
1456
1457 return slider;
1458}
1459
1460+ (CPSlider)themedCircularSlider
1461{
1462 var slider = [self makeCircularSlider],
1463
1464 trackColor = PatternColor("slider-circular-bezel.png", 34.0, 34.0),
1465 trackDisabledColor = PatternColor("slider-circular-disabled-bezel.png", 34.0, 34.0),
1466 knobColor = PatternColor("slider-circular-knob.png", 5.0, 5.0),
1467 knobDisabledColor = PatternColor("slider-circular-disabled-knob.png", 5.0, 5.0),
1468 knobHighlightedColor = knobColor;
1469
1470 themedCircularSliderValues =
1471 [
1472 [@"track-color", trackColor, CPThemeStateCircular],
1473 [@"track-color", trackDisabledColor, CPThemeStateCircular | CPThemeStateDisabled],
1474
1475 [@"knob-size", CGSizeMake(5.0, 5.0), CPThemeStateCircular],
1476 [@"knob-color", knobColor, CPThemeStateCircular],
1477 [@"knob-color", knobHighlightedColor, CPThemeStateCircular | CPThemeStateHighlighted],
1478 [@"knob-color", knobDisabledColor, CPThemeStateCircular | CPThemeStateDisabled]
1479 ];
1480
1481 [self registerThemeValues:themedCircularSliderValues forView:slider];
1482
1483 return slider;
1484}
1485
1486+ (CPButtonBar)makeButtonBar
1487{
1488 var buttonBar = [[CPButtonBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 147.0, 26.0)];
1489
1490 [buttonBar setHasResizeControl:YES];
1491
1492 var popup = [CPButtonBar actionPopupButton];
1493 [popup addItemWithTitle:"Item 1"];
1494 [popup addItemWithTitle:"Item 2"];
1495
1496 [buttonBar setButtons:[[CPButtonBar plusButton], [CPButtonBar minusButton], popup]];
1497
1498 return buttonBar;
1499}
1500
1501+ (CPButtonBar)themedButtonBar
1502{
1503 var buttonBar = [self makeButtonBar],
1504
1505 color = PatternColor("buttonbar-bezel.png", 1.0, 26.0),
1506 resizeColor = PatternColor("buttonbar-resize-control.png", 5.0, 10.0),
1507 buttonBezelColor = PatternColor(
1508 [
1509 ["buttonbar-button-bezel-left.png", 2.0, 25.0],
1510 ["buttonbar-button-bezel-center.png", 1.0, 25.0],
1511 ["buttonbar-button-bezel-right.png", 2.0, 25.0]
1512 ],
1513 PatternIsHorizontal),
1514
1515 buttonBezelHighlightedColor = PatternColor(
1516 [
1517 ["buttonbar-button-bezel-highlighted-left.png", 2.0, 25.0],
1518 ["buttonbar-button-bezel-highlighted-center.png", 1.0, 25.0],
1519 ["buttonbar-button-bezel-highlighted-right.png", 2.0, 25.0]
1520 ],
1521 PatternIsHorizontal),
1522
1523 buttonBezelDisabledColor = PatternColor(
1524 [
1525 ["buttonbar-button-bezel-disabled-left.png", 2.0, 25.0],
1526 ["buttonbar-button-bezel-disabled-center.png", 1.0, 25.0],
1527 ["buttonbar-button-bezel-disabled-right.png", 2.0, 25.0]
1528 ],
1529 PatternIsHorizontal);
1530
1531 themedButtonBarValues =
1532 [
1533 [@"bezel-color", color],
1534
1535 [@"resize-control-size", CGSizeMake(5.0, 10.0)],
1536 [@"resize-control-inset", CGInsetMake(9.0, 4.0, 7.0, 4.0)],
1537 [@"resize-control-color", resizeColor],
1538
1539 [@"button-bezel-color", buttonBezelColor],
1540 [@"button-bezel-color", buttonBezelHighlightedColor, CPThemeStateHighlighted],
1541 [@"button-bezel-color", buttonBezelDisabledColor, CPThemeStateDisabled],
1542 [@"button-text-color", [CPColor blackColor]]
1543 ];
1544
1545 [self registerThemeValues:themedButtonBarValues forView:buttonBar];
1546
1547 return buttonBar;
1548}
1549
1550+ (_CPTableColumnHeaderView)makeColumnHeader
1551{
1552 var header = [[_CPTableColumnHeaderView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 24.0)];
1553
1554 [header setStringValue:@"Table Header"];
1555
1556 return header;
1557}
1558
1559+ (_CPTableColumnHeaderView)themedColumnHeader
1560{
1561 var header = [self makeColumnHeader],
1562 highlightedPressed = PatternColor("tableview-headerview-highlighted-pressed.png", 1.0, 23.0),
1563 highlighted = PatternColor("tableview-headerview-highlighted.png", 1.0, 23.0),
1564 pressed = PatternColor("tableview-headerview-pressed.png", 1.0, 23.0),
1565 normal = PatternColor("tableview-headerview.png", 1.0, 23.0),
1566
1567 themedColumnHeaderValues =
1568 [
1569 [@"background-color", normal],
1570
1571 [@"text-inset", CGInsetMake(0, 5, 0, 5)],
1572 [@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0]],
1573 [@"text-font", [CPFont boldSystemFontOfSize:12.0]],
1574 [@"text-shadow-color", [CPColor whiteColor]],
1575 [@"text-shadow-offset", CGSizeMake(0.0, 1.0)],
1576 [@"text-alignment", CPLeftTextAlignment],
1577
1578 [@"background-color", pressed, CPThemeStateHighlighted],
1579 [@"background-color", highlighted, CPThemeStateSelected],
1580 [@"background-color", highlightedPressed, CPThemeStateHighlighted | CPThemeStateSelected]
1581 ];
1582
1583 [self registerThemeValues:themedColumnHeaderValues forView:header];
1584
1585 return header;
1586}
1587
1588+ (CPTableHeaderView)themedTableHeaderRow
1589{
1590 var header = [[CPTableHeaderView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 23.0)],
1591 normal = PatternColor("tableview-headerview.png", 1.0, 23.0),
1592 gridColor = [CPColor colorWithHexString:@"dce0e2"];
1593
1594 [header setValue:normal forThemeAttribute:@"background-color"];
1595 [header setValue:gridColor forThemeAttribute:@"divider-color"];
1596
1597 return header;
1598}
1599
1600+ (_CPCornerView)themedCornerview
1601{
1602 var scrollerWidth = [CPScroller scrollerWidth],
1603 corner = [[_CPCornerView alloc] initWithFrame:CGRectMake(0.0, 0.0, scrollerWidth, 23.0)],
1604 normal = PatternColor("tableview-headerview.png", 1.0, 23.0),
1605 dividerColor = [CPColor colorWithHexString:@"dce0e2"];
1606
1607 [corner setValue:normal forThemeAttribute:"background-color"];
1608 [corner setValue:dividerColor forThemeAttribute:"divider-color"];
1609
1610 return corner;
1611}
1612
1613+ (CPTableView)themedTableView
1614{
1615 // This is a bit more complicated than the rest because we actually set theme values for several different (table related) controls in this method
1616
1617 var tableview = [[CPTableView alloc] initWithFrame:CGRectMake(0.0, 0.0, 150.0, 150.0)],
1618
1619 sortImage = PatternImage("tableview-headerview-ascending.png", 9.0, 8.0),
1620 sortImageReversed = PatternImage("tableview-headerview-descending.png", 9.0, 8.0),
1621 alternatingRowColors = [[CPColor whiteColor], [CPColor colorWithRed:245.0 / 255.0 green:249.0 / 255.0 blue:252.0 / 255.0 alpha:1.0]],
1622 gridColor = [CPColor colorWithHexString:@"dce0e2"],
1623 selectionColor = [CPColor colorWithHexString:@"5f83b9"],
1624 sourceListSelectionColor = [CPDictionary dictionaryWithObjects: [CGGradientCreateWithColorComponents(CGColorSpaceCreateDeviceRGB(), [98.0 / 255.0, 143.0 / 210.0, 209.0 / 255.0, 1.0, 46.0 / 255.0, 88.0 / 176.0, 208.0 / 255.0,1.0], [0,1], 2),
1625 [CPColor colorWithCalibratedRed:81.0 / 255.0 green:127.0 / 255.0 blue:200.0 / 255.0 alpha:1.0],
1626 [CPColor colorWithCalibratedRed:34.0 / 255.0 green:63.0 / 255.0 blue:123.0 / 255.0 alpha:1.0]
1627 ]
1628 forKeys: [CPSourceListGradient, CPSourceListTopLineColor, CPSourceListBottomLineColor]],
1629
1630 themedTableViewValues =
1631 [
1632 [@"alternating-row-colors", alternatingRowColors],
1633 [@"grid-color", gridColor],
1634 [@"highlighted-grid-color", [CPColor whiteColor]],
1635 [@"selection-color", selectionColor],
1636 [@"sourcelist-selection-color", sourceListSelectionColor],
1637 [@"sort-image", sortImage],
1638 [@"sort-image-reversed", sortImageReversed]
1639 ];
1640
1641 [self registerThemeValues:themedTableViewValues forView:tableview];
1642
1643 return tableview;
1644}
1645
1646+ (CPTextField)themedTableDataView
1647{
1648 var view = [self themedStandardTextField];
1649
1650 [view setBezeled:NO];
1651 [view setEditable:NO];
1652 [view setThemeState:CPThemeStateTableDataView];
1653
1654 return view;
1655}
1656
1657+ (CPSplitView)themedSplitView
1658{
1659 var splitView = [[CPSplitView alloc] initWithFrame:CGRectMake(0.0, 0.0, 200.0, 200.0)],
1660 leftView = [[CPView alloc] initWithFrame:CGRectMake(0.0, 0.0, 75.0, 150.0)],
1661 rightView = [[CPView alloc] initWithFrame:CGRectMake(75.0, 0.0, 75.0, 150.0)];
1662
1663 [splitView addSubview:leftView];
1664 [splitView addSubview:rightView];
1665
1666
1667 [splitView setIsPaneSplitter:YES];
1668
1669 var themedSplitViewValues =
1670 [
1671 [@"divider-thickness", 1.0],
1672 [@"pane-divider-thickness", 10.0],
1673 [@"pane-divider-color", [CPColor colorWithRed:165.0 / 255.0 green:165.0 / 255.0 blue:165.0 / 255.0 alpha:1.0]]
1674 ];
1675
1676 [self registerThemeValues:themedSplitViewValues forView:splitView];
1677
1678 return splitView;
1679}
1680
1681+ (CPAlert)themedAlert
1682{
1683 var alert = [CPAlert new],
1684
1685 buttonOffset = 10.0,
1686 defaultElementsMargin = 3.0,
1687 errorIcon = PatternImage("alert-error.png", 53.0, 46.0),
1688 helpIcon = PatternImage("alert-help.png", 24.0, 24.0),
1689 helpIconPressed = PatternImage("alert-help-pressed.png", 24.0, 24.0),
1690 helpLeftOffset = 15,
1691 imageOffset = CGPointMake(15, 18),
1692 informationIcon = PatternImage("alert-info.png", 53.0, 46.0),
1693 informativeFont = [CPFont systemFontOfSize:12.0],
1694 inset = CGInsetMake(15, 15, 15, 80),
1695 messageFont = [CPFont boldSystemFontOfSize:13.0],
1696 size = CGSizeMake(400.0, 110.0),
1697 suppressionButtonXOffset = 2.0,
1698 suppressionButtonYOffset = 10.0,
1699 suppressionButtonFont = [CPFont systemFontOfSize:12.0],
1700 warningIcon = PatternImage("alert-warning.png", 53.0, 46.0);
1701
1702 themedAlertValues =
1703 [
1704 [@"button-offset", buttonOffset],
1705 [@"content-inset", inset],
1706 [@"default-elements-margin", defaultElementsMargin],
1707 [@"error-image", errorIcon],
1708 [@"help-image", helpIcon],
1709 [@"help-image-left-offset", helpLeftOffset],
1710 [@"help-image-pressed", helpIconPressed],
1711 [@"image-offset", imageOffset],
1712 [@"information-image", informationIcon],
1713 [@"informative-text-alignment", CPJustifiedTextAlignment],
1714 [@"informative-text-color", [CPColor blackColor]],
1715 [@"informative-text-font", informativeFont],
1716 [@"message-text-alignment", CPJustifiedTextAlignment],
1717 [@"message-text-color", [CPColor blackColor]],
1718 [@"message-text-font", messageFont],
1719 [@"suppression-button-text-color", [CPColor blackColor]],
1720 [@"suppression-button-text-font", suppressionButtonFont],
1721 [@"size", size],
1722 [@"suppression-button-x-offset", suppressionButtonXOffset],
1723 [@"suppression-button-y-offset", suppressionButtonYOffset],
1724 [@"warning-image", warningIcon]
1725 ];
1726
1727 [self registerThemeValues:themedAlertValues forView:alert];
1728
1729 return alert;
1730}
1731
1732+ (CPStepper)themedStepper
1733{
1734 var stepper = [CPStepper stepper],
1735
1736 bezelUp = PatternColor(
1737 [
1738 ["stepper-bezel-big-up-left.png", 3.0, 13.0],
1739 ["stepper-bezel-big-up-center.png", 13.0, 13.0],
1740 ["stepper-bezel-big-up-right.png", 3.0, 13.0]
1741 ],
1742 PatternIsHorizontal),
1743
1744 bezelDown = PatternColor(
1745 [
1746 ["stepper-bezel-big-down-left.png", 3.0, 12.0],
1747 ["stepper-bezel-big-down-center.png", 13.0, 12.0],
1748 ["stepper-bezel-big-down-right.png", 3.0, 12.0]
1749 ],
1750 PatternIsHorizontal),
1751
1752 bezelUpDisabled = PatternColor(
1753 [
1754 ["stepper-bezel-big-disabled-up-left.png", 3.0, 13.0],
1755 ["stepper-bezel-big-disabled-up-center.png", 13.0, 13.0],
1756 ["stepper-bezel-big-disabled-up-right.png", 3.0, 13.0]
1757 ],
1758 PatternIsHorizontal),
1759
1760 bezelDownDisabled = PatternColor(
1761 [
1762 ["stepper-bezel-big-disabled-down-left.png", 3.0, 12.0],
1763 ["stepper-bezel-big-disabled-down-center.png", 13.0, 12.0],
1764 ["stepper-bezel-big-disabled-down-right.png", 3.0, 12.0]
1765 ],
1766 PatternIsHorizontal),
1767
1768 bezelUpHighlighted = PatternColor(
1769 [
1770 [@"stepper-bezel-big-highlighted-up-left.png", 3.0, 13.0],
1771 [@"stepper-bezel-big-highlighted-up-center.png", 13.0, 13.0],
1772 [@"stepper-bezel-big-highlighted-up-right.png", 3.0, 13.0]
1773 ],
1774 PatternIsHorizontal),
1775
1776 bezelDownHighlighted = PatternColor(
1777 [
1778 [@"stepper-bezel-big-highlighted-down-left.png", 3.0, 12.0],
1779 [@"stepper-bezel-big-highlighted-down-center.png", 13.0, 12.0],
1780 [@"stepper-bezel-big-highlighted-down-right.png", 3.0, 12.0]
1781 ],
1782 PatternIsHorizontal),
1783
1784 themeValues =
1785 [
1786 [@"bezel-color-up-button", bezelUp, CPThemeStateBordered],
1787 [@"bezel-color-down-button", bezelDown, CPThemeStateBordered],
1788 [@"bezel-color-up-button", bezelUpDisabled, CPThemeStateBordered | CPThemeStateDisabled],
1789 [@"bezel-color-down-button", bezelDownDisabled, CPThemeStateBordered | CPThemeStateDisabled],
1790 [@"bezel-color-up-button", bezelUpHighlighted, CPThemeStateBordered | CPThemeStateHighlighted],
1791 [@"bezel-color-down-button", bezelDownHighlighted, CPThemeStateBordered | CPThemeStateHighlighted],
1792 [@"min-size", CGSizeMake(19.0, 25.0)]
1793 ];
1794
1795 [self registerThemeValues:themeValues forView:stepper];
1796
1797 return stepper;
1798}
1799
1800+ (CPRuleEditor)themedRuleEditor
1801{
1802 var ruleEditor = [[CPRuleEditor alloc] initWithFrame:CGRectMake(0, 0, 400, 300)];
1803
1804 var backgroundColors = [[CPColor whiteColor], [CPColor colorWithRed:235/255 green:239/255 blue:252/255 alpha:1]],
1805 selectedActiveRowColor = [CPColor colorWithHexString:@"5f83b9"],
1806 selectedInactiveRowColor = [CPColor colorWithWhite:0.83 alpha:1],
1807 sliceTopBorderColor = [CPColor colorWithWhite:0.9 alpha:1],
1808 sliceBottomBorderColor = [CPColor colorWithWhite:0.729412 alpha:1],
1809 sliceLastBottomBorderColor = [CPColor colorWithWhite:0.6 alpha:1],
1810 addImage = PatternImage(@"rule-editor-add.png", 8.0, 8.0),
1811 removeImage = PatternImage(@"rule-editor-remove.png", 8.0, 8.0);
1812
1813 var ruleEditorThemedValues =
1814 [
1815 [@"alternating-row-colors", backgroundColors],
1816 [@"selected-color", selectedActiveRowColor, CPThemeStateNormal],
1817 [@"selected-color", selectedInactiveRowColor, CPThemeStateDisabled],
1818 [@"slice-top-border-color", sliceTopBorderColor],
1819 [@"slice-bottom-border-color", sliceBottomBorderColor],
1820 [@"slice-last-bottom-border-color", sliceLastBottomBorderColor],
1821 [@"font", [CPFont systemFontOfSize:10.0]],
1822 [@"add-image", addImage],
1823 [@"remove-image", removeImage]
1824 ];
1825
1826 [self registerThemeValues:ruleEditorThemedValues forView:ruleEditor];
1827
1828 return ruleEditor;
1829}
1830
1831@end
1832
1833@implementation CarbonThemeHUDThemeDescriptor : BKThemeDescriptor
1834{
1835}
1836
1837+ (CPString)themeName
1838{
1839 return @"CarbonTheme-HUD";
1840}
1841
1842+ (CPArray)themeShowcaseExcludes
1843{
1844 return ["alert"];
1845}
1846
1847+ (CPColor)defaultShowcaseBackgroundColor
1848{
1849 return [CPColor blackColor];
1850}
1851
1852+ (CPArray)defaultThemeOverridesAddedTo:(CPArray)themeValues
1853{
1854 var overrides = [CPArray arrayWithObjects:
1855 [@"text-color", [CPColor whiteColor]],
1856 [@"text-color", [CPColor colorWithCalibratedWhite:1.0 alpha:0.6], CPThemeStateDisabled],
1857 [@"text-shadow-color", [CPColor blackColor]],
1858 [@"text-shadow-color", [CPColor blackColor], CPThemeStateDisabled],
1859 [@"text-shadow-offset", CGSizeMake(-1.0, -1.0)]
1860 ];
1861
1862 if (themeValues)
1863 [overrides addObjectsFromArray:themeValues];
1864
1865 return overrides;
1866}
1867
1868+ (CPPopUpButton)themedSegmentedControl
1869{
1870 var segmentedControl = [self makeSegmentedControl];
1871
1872 [self registerThemeValues:[self defaultThemeOverridesAddedTo:nil] forView:segmentedControl inherit:themedSegmentedControlValues];
1873
1874 return segmentedControl;
1875}
1876
1877+ (CPButton)button
1878{
1879 var button = [self makeButton];
1880
1881 [self registerThemeValues:[self defaultThemeOverridesAddedTo:nil] forView:button inherit:themedButtonValues];
1882
1883 return button;
1884}
1885
1886+ (CPButton)themedStandardButton
1887{
1888 var button = [self button];
1889
1890 [button setTitle:@"Cancel"];
1891
1892 return button;
1893}
1894
1895+ (CPButton)themedDefaultButton
1896{
1897 var button = [self button];
1898
1899 [button setTitle:@"OK"];
1900 [button setThemeState:CPThemeStateDefault];
1901
1902 return button;
1903}
1904
1905+ (CPScroller)themedVerticalScroller
1906{
1907 var scroller = [self makeVerticalScroller],
1908 overrides =
1909 [
1910 [@"knob-color", nil, CPThemeStateVertical | CPThemeStateDisabled]
1911 ];
1912
1913 [self registerThemeValues:[self defaultThemeOverridesAddedTo:overrides] forView:scroller inherit:themedVerticalScrollerValues];
1914
1915 return scroller;
1916}
1917
1918+ (CPScroller)themedHorizontalScroller
1919{
1920 var scroller = [self makeHorizontalScroller],
1921 overrides =
1922 [
1923 [@"knob-color", nil, CPThemeStateDisabled]
1924 ];
1925
1926 [self registerThemeValues:[self defaultThemeOverridesAddedTo:overrides] forView:scroller inherit:themedHorizontalScrollerValues];
1927
1928 return scroller;
1929}
1930
1931+ (CPSlider)themedHorizontalSlider
1932{
1933 var slider = [self makeHorizontalSlider];
1934
1935 [self registerThemeValues:[self defaultThemeOverridesAddedTo:nil] forView:slider inherit:themedHorizontalSliderValues];
1936
1937 return slider;
1938}
1939
1940+ (CPSlider)themedVerticalSlider
1941{
1942 var slider = [self makeVerticalSlider];
1943
1944 [self registerThemeValues:[self defaultThemeOverridesAddedTo:nil] forView:slider inherit:themedVerticalSliderValues];
1945
1946 return slider;
1947}
1948
1949+ (CPSlider)themedCircularSlider
1950{
1951 var slider = [self makeCircularSlider];
1952
1953 [self registerThemeValues:[self defaultThemeOverridesAddedTo:nil] forView:slider inherit:themedCircularSliderValues];
1954
1955 return slider;
1956}
1957
1958+ (CPAlert)themedAlert
1959{
1960 var alert = [CPAlert new],
1961
1962 hudSpecificValues =
1963 [
1964 [@"message-text-color", [CPColor whiteColor]],
1965 [@"informative-text-color", [CPColor whiteColor]],
1966 [@"suppression-button-text-color", [CPColor whiteColor]],
1967 ];
1968
1969 [self registerThemeValues:hudSpecificValues forView:alert inherit:themedAlertValues];
1970
1971 return alert;
1972}
1973
1974@end