From b7ff643a344bf723d1f6eea9ca5c7de97b406a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Wed, 27 Feb 2013 22:26:52 +0100 Subject: [PATCH 001/145] Fixed: when clicking and dragging inside a menu, mouseEntered and mouseExited was mixed up for custom views. --- AppKit/CPMenu/_CPMenuManager.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPMenu/_CPMenuManager.j b/AppKit/CPMenu/_CPMenuManager.j index 45c8ac321..4093c76a0 100644 --- a/AppKit/CPMenu/_CPMenuManager.j +++ b/AppKit/CPMenu/_CPMenuManager.j @@ -221,9 +221,9 @@ var STICKY_TIME_INTERVAL = 0.4, if (_lastMouseOverMenuView != mouseOverMenuView) { - [mouseOverMenuView mouseExited:anEvent]; + [_lastMouseOverMenuView mouseExited:anEvent]; // FIXME: Possibly multiple of these? - [_lastMouseOverMenuView mouseEntered:anEvent]; + [mouseOverMenuView mouseEntered:anEvent]; _lastMouseOverMenuView = mouseOverMenuView; } From 262bd5b7c1e2cef57a8020f8e42e97eb11650805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Wed, 6 Mar 2013 19:30:17 +0100 Subject: [PATCH 002/145] Use dedicated class, _CPStateMarker, instead of CPString for selection markers. --- AppKit/CPKeyValueBinding.j | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index e48f9fc22..705ec8be6 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -347,7 +347,7 @@ var CPBindingOperationAnd = 0, - (void)_placeholderForMarker:aMarker { - var placeholder = _placeholderForMarker[aMarker]; + var placeholder = _placeholderForMarker[[aMarker hash]]; if (placeholder) return placeholder['value']; @@ -359,14 +359,14 @@ var CPBindingOperationAnd = 0, { if (isDefault) { - var existingPlaceholder = _placeholderForMarker[aMarker]; + var existingPlaceholder = _placeholderForMarker[[aMarker hash]]; // Don't overwrite an explicitly set placeholder with a default. if (existingPlaceholder && !existingPlaceholder['isDefault']) return; } - _placeholderForMarker[aMarker] = { 'isDefault': isDefault, 'value': aPlaceholder }; + _placeholderForMarker[[aMarker hash]] = { 'isDefault': isDefault, 'value': aPlaceholder }; } @end @@ -802,6 +802,26 @@ var CPBindingOperationAnd = 0, @end +@implementation _CPStateMarker : CPObject +{ + CPString _name; +} + +- (id)initWithName:(CPString)aName +{ + if (self = [super init]) + _name = aName + + return self; +} + +- (CPString)description +{ + return "<" + _name + ">"; +} + +@end + // Keys in options dictionary @@ -811,10 +831,10 @@ CPObservedKeyPathKey = @"CPObservedKeyPathKey"; CPOptionsKey = @"CPOptionsKey"; // special markers -CPMultipleValuesMarker = @"CPMultipleValuesMarker"; -CPNoSelectionMarker = @"CPNoSelectionMarker"; -CPNotApplicableMarker = @"CPNotApplicableMarker"; -CPNullMarker = @"CPNullMarker"; +CPNoSelectionMarker = [[_CPStateMarker alloc] initWithName:@"NO SELECTION MARKER"]; +CPMultipleValuesMarker = [[_CPStateMarker alloc] initWithName:@"MULTIPLE VALUES MARKER"]; +CPNotApplicableMarker = [[_CPStateMarker alloc] initWithName:@"NOT APPLICABLE MARKER"]; +CPNullMarker = [[_CPStateMarker alloc] initWithName:@"NULL MARKER"]; // Binding name constants CPAlignmentBinding = @"alignment"; From 51e682335bb66c0ab163eb9fc48e41e43c3fac6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Thu, 7 Mar 2013 12:37:35 +0100 Subject: [PATCH 003/145] Use UID instead of hash. --- AppKit/CPKeyValueBinding.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index 705ec8be6..ab9a9f369 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -347,7 +347,7 @@ var CPBindingOperationAnd = 0, - (void)_placeholderForMarker:aMarker { - var placeholder = _placeholderForMarker[[aMarker hash]]; + var placeholder = _placeholderForMarker[[aMarker UID]]; if (placeholder) return placeholder['value']; @@ -359,14 +359,14 @@ var CPBindingOperationAnd = 0, { if (isDefault) { - var existingPlaceholder = _placeholderForMarker[[aMarker hash]]; + var existingPlaceholder = _placeholderForMarker[[aMarker UID]]; // Don't overwrite an explicitly set placeholder with a default. if (existingPlaceholder && !existingPlaceholder['isDefault']) return; } - _placeholderForMarker[[aMarker hash]] = { 'isDefault': isDefault, 'value': aPlaceholder }; + _placeholderForMarker[[aMarker UID]] = { 'isDefault': isDefault, 'value': aPlaceholder }; } @end From 455ff57eeca48c16f865bd054bbefbc72a65187a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Thu, 7 Mar 2013 12:39:04 +0100 Subject: [PATCH 004/145] Fixed return type for _placeholderForMarker: --- AppKit/CPKeyValueBinding.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index ab9a9f369..96bc70687 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -345,7 +345,7 @@ var CPBindingOperationAnd = 0, [self _updatePlaceholdersWithOptions:options]; } -- (void)_placeholderForMarker:aMarker +- (JSObject)_placeholderForMarker:aMarker { var placeholder = _placeholderForMarker[[aMarker UID]]; From bd269501ace03d37117e031fef44820bad077440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Thu, 7 Mar 2013 12:49:19 +0100 Subject: [PATCH 005/145] Fixed parameter type for _placeholderForMarker: --- AppKit/CPKeyValueBinding.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index 96bc70687..524f7e0dd 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -345,7 +345,7 @@ var CPBindingOperationAnd = 0, [self _updatePlaceholdersWithOptions:options]; } -- (JSObject)_placeholderForMarker:aMarker +- (JSObject)_placeholderForMarker:(id)aMarker { var placeholder = _placeholderForMarker[[aMarker UID]]; From c381672aeecd19ba1ad645619ae36f5b7cd8df84 Mon Sep 17 00:00:00 2001 From: Kjell Nilsson Date: Fri, 8 Mar 2013 09:52:55 +0100 Subject: [PATCH 006/145] Added localization of tooltips with the standard localizer --- AppKit/CPRuleEditor/CPRuleEditor.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AppKit/CPRuleEditor/CPRuleEditor.j b/AppKit/CPRuleEditor/CPRuleEditor.j index 107e8c972..e001a103e 100644 --- a/AppKit/CPRuleEditor/CPRuleEditor.j +++ b/AppKit/CPRuleEditor/CPRuleEditor.j @@ -1877,17 +1877,17 @@ TODO: implement - (CPString)_toolTipForAddCompoundRowButton { - return @"Add Compound row"; + return [_standardLocalizer localizedStringForString:@"Add Compound row"]; } - (CPString)_toolTipForAddSimpleRowButton { - return @"Add row"; + return [_standardLocalizer localizedStringForString:@"Add row"]; } - (CPString)_toolTipForDeleteRowButton { - return @"Delete row"; + return [_standardLocalizer localizedStringForString:@"Delete row"]; } - (void)_updateSliceIndentations From 197decc84220a86ce9202be4489c3ba1b683bf71 Mon Sep 17 00:00:00 2001 From: Kjell Nilsson Date: Fri, 8 Mar 2013 13:47:46 +0100 Subject: [PATCH 007/145] Changed tooltip word to lowercase to follow other tooltip formatting --- AppKit/CPRuleEditor/CPRuleEditor.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPRuleEditor/CPRuleEditor.j b/AppKit/CPRuleEditor/CPRuleEditor.j index e001a103e..50e2905b8 100644 --- a/AppKit/CPRuleEditor/CPRuleEditor.j +++ b/AppKit/CPRuleEditor/CPRuleEditor.j @@ -1877,7 +1877,7 @@ TODO: implement - (CPString)_toolTipForAddCompoundRowButton { - return [_standardLocalizer localizedStringForString:@"Add Compound row"]; + return [_standardLocalizer localizedStringForString:@"Add compound row"]; } - (CPString)_toolTipForAddSimpleRowButton From 7fab8d9782d4604c4441e48701f9207e4a2b4229 Mon Sep 17 00:00:00 2001 From: Blair Duncan Date: Fri, 8 Mar 2013 12:27:19 -0500 Subject: [PATCH 008/145] don't allow views from another window to be next/previouskeyViews --- AppKit/CPView.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 49e0e4aea..2827158ab 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -2557,7 +2557,7 @@ setBoundsOrigin: - (void)_setPreviousKeyView:(CPView)previous { - if ([previous isEqual:self]) + if ([previous isEqual:self] || ![[previous window] isEqual:[self window]]) _previousKeyView = nil; else _previousKeyView = previous; @@ -2565,7 +2565,7 @@ setBoundsOrigin: - (void)setNextKeyView:(CPView)next { - if ([next isEqual:self]) + if ([next isEqual:self] || ![[next window] isEqual:[self window]]) _nextKeyView = nil; else { From 5fd241f7d7c83e03b8e261b5ec3ab17ce41fa2c3 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Fri, 8 Mar 2013 23:04:23 -0500 Subject: [PATCH 009/145] Fix #1284: Update Emacs documentation Small fix to update documentation for emacs. Fixes #1284. --- Tools/Editors/Emacs/README.txt | 3 +-- Tools/Editors/Emacs/objj-mode.el | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Tools/Editors/Emacs/README.txt b/Tools/Editors/Emacs/README.txt index 2e4d9e506..0ae28549d 100644 --- a/Tools/Editors/Emacs/README.txt +++ b/Tools/Editors/Emacs/README.txt @@ -18,8 +18,7 @@ Installation Add objc-c-mode.el and objj-mode.el to your load path and require objj-mode. - (add-to-list 'load-path "/path/to/objc-c-mode.el") - (add-to-list 'load-path "/path/to/objj-mode.el") + (add-to-list 'load-path "/path/to/cappuccino/Tools/Editors/Emacs/") (require 'objj-mode) Other diff --git a/Tools/Editors/Emacs/objj-mode.el b/Tools/Editors/Emacs/objj-mode.el index 6ffea6da0..6a80cbd7e 100644 --- a/Tools/Editors/Emacs/objj-mode.el +++ b/Tools/Editors/Emacs/objj-mode.el @@ -5,8 +5,7 @@ ;;; To install, save this somewhere and add the following to your .emacs file: ;;; -;;; (add-to-list 'load-path "/path/to/objc-c-mode.el") -;;; (add-to-list 'load-path "/path/to/objj-mode.el") +;;; (add-to-list 'load-path "/path/to/cappuccino/Tools/Editors/Emacs/") ;;; (require 'objj-mode) ;;; ;;; Features: From a01de54b652189152e9bcede4eb06d5f81a31b3e Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Sat, 9 Mar 2013 14:34:58 -0500 Subject: [PATCH 010/145] Fixed: optimize access to object property Accessing a property via dot notation is faster than indexing via a string. --- AppKit/CPKeyValueBinding.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPKeyValueBinding.j b/AppKit/CPKeyValueBinding.j index 524f7e0dd..db0b238da 100644 --- a/AppKit/CPKeyValueBinding.j +++ b/AppKit/CPKeyValueBinding.j @@ -350,7 +350,7 @@ var CPBindingOperationAnd = 0, var placeholder = _placeholderForMarker[[aMarker UID]]; if (placeholder) - return placeholder['value']; + return placeholder.value; return nil; } @@ -362,7 +362,7 @@ var CPBindingOperationAnd = 0, var existingPlaceholder = _placeholderForMarker[[aMarker UID]]; // Don't overwrite an explicitly set placeholder with a default. - if (existingPlaceholder && !existingPlaceholder['isDefault']) + if (existingPlaceholder && !existingPlaceholder.isDefault) return; } From eb6cdfe97c4376b03be5782eabec38880870792e Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Sat, 9 Mar 2013 14:35:16 -0500 Subject: [PATCH 011/145] Typo: fixed spelling in comment --- Objective-J/Runtime.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index 5014fb2f8..7b1929384 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -400,7 +400,7 @@ GLOBAL(objj_allocateClassPair) = function(/*Class*/ superclass, /*String*/ aName // Give our current allocator all the instance variables of our super class' allocator. classObject.allocator.prototype = new superclass.allocator; - // "Inheret" parent properties. + // "Inherit" parent properties. classObject.ivar_dtable = classObject.ivar_store.prototype = new superclass.ivar_store; classObject.method_dtable = classObject.method_store.prototype = new superclass.method_store; From 34faf362d1704be65d48fd8e7591b2d7f8f3474a Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 12:06:41 +0000 Subject: [PATCH 012/145] New: @ref and @deref in Objective-J 2.0. --- Objective-J/ObjJAcornCompiler.js | 53 +++++++++++++++++++++++++++++++- Objective-J/acorn.js | 26 ++++++++++++++-- Objective-J/acornwalk.js | 8 +++++ 3 files changed, 84 insertions(+), 3 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 57657769b..e5aac0072 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -348,7 +348,7 @@ Program: function(node, st, c) { for (var i = 0; i < node.body.length; ++i) { c(node.body[i], st, "Statement"); } - CONCAT(st.compiler.jsBuffer,st.compiler.source.substring(st.compiler.lastPos, node.end)); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.end)); // Check maybe warnings var maybeWarnings = st.maybeWarnings(); if (maybeWarnings) for (var i = 0; i < maybeWarnings.length; i++) { @@ -405,6 +405,37 @@ VariableDeclaration: function(node, scope, c) { } }, AssignmentExpression: function(node, st, c) { + if (node.left.type === "Dereference") { + // @deref(x) = z -> x(z) etc + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + + // Output the dereference function, "(...)(z)" + CONCAT(st.compiler.jsBuffer, "("); + // What's being dereferenced could itself be an expression, such as when dereferencing a deref. + st.compiler.lastPos = node.left.expr.start; + c(node.left.expr, st, "Expression"); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.left.expr.end)); + CONCAT(st.compiler.jsBuffer, ")("); + + // Now "(x)(...)". We have to manually expand +=, -=, *= etc. + if (node.operator !== "=") { + // Output the whole .left, not just .left.expr. + st.compiler.lastPos = node.left.start; + c(node.left, st, "Expression"); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.left.end)); + CONCAT(st.compiler.jsBuffer, " " + node.operator.substring(0, 1) + " "); + } + + st.compiler.lastPos = node.right.start; + c(node.right, st, "Expression"); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.right.end)); + CONCAT(st.compiler.jsBuffer, ")"); + + st.compiler.lastPos = node.end; + + return; + } + var saveAssignment = st.assignment; st.assignment = true; c(node.left, st, "Expression"); @@ -833,6 +864,26 @@ SelectorLiteralExpression: function(node, st, c) { CONCAT(st.compiler.jsBuffer, "\")"); st.compiler.lastPos = node.end; }, +Reference: function(node, st, c) { + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + CONCAT(st.compiler.jsBuffer, "function(__input) { if (arguments.length) return "); + CONCAT(st.compiler.jsBuffer, node.element.name); + CONCAT(st.compiler.jsBuffer, " = __input; return "); + CONCAT(st.compiler.jsBuffer, node.element.name); + CONCAT(st.compiler.jsBuffer, "; }"); + st.compiler.lastPos = node.end; +}, +Dereference: function(node, st, c) { + // @deref(y) -> y() + // @deref(@deref(y)) -> y()() + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + st.compiler.lastPos = node.expr.start; + c(node.expr, st, "Expression"); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.expr.end)); + CONCAT(st.compiler.jsBuffer, "()"); + st.compiler.lastPos = node.end; + +}, Literal: function(node, st, c) { if (node.raw && node.raw.charAt(0) === "@") { diff --git a/Objective-J/acorn.js b/Objective-J/acorn.js index d40104433..e4adc242e 100644 --- a/Objective-J/acorn.js +++ b/Objective-J/acorn.js @@ -274,6 +274,7 @@ if (!exports.acorn) { var _end = {keyword: "end"}, _import = {keyword: "import", afterImport: true}; var _action = {keyword: "action"}, _selector = {keyword: "selector"}, _class = {keyword: "class"}, _global = {keyword: "global"}; var _dictionaryLiteral = {keyword: "{"}, _arrayLiteral = {keyword: "["}; + var _ref = {keyword: "ref"}, _deref = {keyword: "deref"}; // Objective-J keywords @@ -302,7 +303,8 @@ if (!exports.acorn) { // Map Objective-J "@" keyword names to token types. var objJAtKeywordTypes = {"implementation": _implementation, "outlet": _outlet, "accessors": _accessors, "end": _end, - "import": _import, "action": _action, "selector": _selector, "class": _class, "global": _global}; + "import": _import, "action": _action, "selector": _selector, "class": _class, "global": _global, + "ref": _ref, "deref": _deref}; // Punctuation token types. Again, the `type` property is purely for debugging. @@ -1174,7 +1176,7 @@ if (!exports.acorn) { // to. function checkLVal(expr) { - if (expr.type !== "Identifier" && expr.type !== "MemberExpression") + if (expr.type !== "Identifier" && expr.type !== "MemberExpression" && expr.type !== "Dereference") raise(expr.start, "Assigning to rvalue"); if (strict && expr.type === "Identifier" && isStrictBadIdWord(expr.name)) raise(expr.start, "Assigning to " + expr.name + " in strict mode"); @@ -1924,6 +1926,26 @@ if (!exports.acorn) { expect(_parenR, "Expected closing ')' after selector"); return finishNode(node, "SelectorLiteralExpression"); + case _ref: + var node = startNode(); + next(); + expect(_parenL, "Expected '(' after '@ref'"); + node.element = parseIdent(node, _parenR); + expect(_parenR, "Expected closing ')' after ref"); + return finishNode(node, "Reference"); + + case _deref: + var node = startNode(); + next(); + expect(_parenL, "Expected '(' after '@deref'"); + node.expr = parseExpression(true, true); + expect(_parenR, "Expected closing ')' after deref"); + + if (node.expr.type !== "Identifier" && node.expr.type !== "MemberExpression" && node.expr.type !== "Reference" && node.expr.type !== "Dereference") + raise(node, "Dereference of " + node.expr.type); + + return finishNode(node, "Dereference"); + default: unexpected(); } diff --git a/Objective-J/acornwalk.js b/Objective-J/acornwalk.js index 470fbb88a..326d0dc72 100644 --- a/Objective-J/acornwalk.js +++ b/Objective-J/acornwalk.js @@ -228,6 +228,14 @@ if (!exports.acorn) { exports.SelectorLiteralExpression = ignore; + exports.Reference = function(node, st, c) { + c(node.element, st, "Identifier"); + } + + exports.Dereference = function(node, st, c) { + c(node.expr, st, "Expression"); + } + // A custom walker that keeps track of the scope chain and the // variables defined in it. function makeScope(prev) { From 9b4c126534e29217df08b5602a62ce8e0bb71007 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 12:17:59 +0000 Subject: [PATCH 013/145] Unit test @ref and @deref. --- Tests/Objective-J/PassByReferenceTest.j | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Tests/Objective-J/PassByReferenceTest.j diff --git a/Tests/Objective-J/PassByReferenceTest.j b/Tests/Objective-J/PassByReferenceTest.j new file mode 100644 index 000000000..d55dd0344 --- /dev/null +++ b/Tests/Objective-J/PassByReferenceTest.j @@ -0,0 +1,83 @@ +@import + +var addRef = function(aRef) + { + @deref(aRef) += 1; + }, + subtractRef = function(aRef) + { + @deref(aRef) -= 1; + }, + multiplyRef = function(aRef) + { + @deref(aRef) *= 2; + }, + divideRef = function(aRef) + { + @deref(aRef) /= 2; + }, + setRef = function(aRef) + { + @deref(aRef) = 5; + }, + getRef = function(aRef) + { + return @deref(aRef) + }; + +@implementation PassByReferenceTest : OJTestCase + +- (void)testGetByReference +{ + var x = -1; + + [self assert:-1 equals:@deref(@ref(x))]; + [self assert:-1 equals:getRef(@ref(x))]; +} + +- (void)testSetByReference +{ + var x = -1; + + setRef(@ref(x)); + + [self assert:5 equals:x]; +} + +- (void)testAddByReference +{ + var x = -1; + + addRef(@ref(x)); + + [self assert:0 equals:x]; +} + +- (void)testSubtractByReference +{ + var x = -1; + + subtractRef(@ref(x)); + + [self assert:-2 equals:x]; +} + +- (void)testMultiplyByReference +{ + var x = -1; + + multiplyRef(@ref(x)); + + [self assert:-2 equals:x]; +} + +- (void)testDivideByReference +{ + var x = -1; + + divideRef(@ref(x)); + + [self assert:-0.5 equals:x]; +} + +@end From f4096b94a7a1be3d1b5afd79db613fad955847ce Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 13:06:14 +0000 Subject: [PATCH 014/145] New: use @ref and @deref instead of Ref.h throughout Cappuccino. --- AppKit/CPCollectionView.j | 9 ++++----- AppKit/CPControl.j | 6 ++---- AppKit/CPTextField.j | 16 +++++++-------- AppKit/CPTokenField.j | 3 +-- Foundation/CPArray/_CPArray.j | 4 ++-- Foundation/CPDateFormatter.j | 4 +--- Foundation/CPDictionary.j | 5 ++--- Foundation/CPFormatter.j | 24 +++++++++++------------ Foundation/CPIndexSet.j | 6 +++--- Foundation/CPNumberFormatter.j | 10 ++++------ Foundation/Ref.h | 30 ----------------------------- Tests/Foundation/CPArrayTest.j | 2 +- Tests/Foundation/CPDictionaryTest.j | 2 +- Tests/Foundation/CPIndexSetTest.j | 2 +- 14 files changed, 40 insertions(+), 83 deletions(-) delete mode 100644 Foundation/Ref.h diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index caa414c96..a149d7826 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -21,7 +21,6 @@ */ #import "../Foundation/CPRange.h" -#import "../Foundation/Ref.h" @import @import @@ -501,7 +500,7 @@ var HORIZONTAL_MARGIN = 2; [self _updateMinMaxItemSizeIfNeeded]; - [self _computeGridWithSize:frameSize count:AT_REF(count)]; + [self _computeGridWithSize:frameSize count:@ref(count)]; //CPLog.debug("frameSize="+CPStringFromSize(frameSize) + "itemSize="+CPStringFromSize(itemSize) + " ncols=" + colsRowsCount[0] +" nrows="+ colsRowsCount[1]+" displayCount="+ colsRowsCount[2]); @@ -1032,7 +1031,7 @@ var HORIZONTAL_MARGIN = 2; - (CPDragOperation)draggingEntered:(id)draggingInfo { var dropIndex = -1, - dropIndexRef = AT_REF(dropIndex), + dropIndexRef = @ref(dropIndex), dragOp = [self _validateDragWithInfo:draggingInfo dropIndex:dropIndexRef dropOperation:1]; dropIndex = dropIndexRef(); @@ -1050,7 +1049,7 @@ var HORIZONTAL_MARGIN = 2; return _currentDragOperation; var dropIndex, - dropIndexRef = AT_REF(dropIndex); + dropIndexRef = @ref(dropIndex); var dragOperation = [self _validateDragWithInfo:draggingInfo dropIndex:dropIndexRef dropOperation:1]; @@ -1068,7 +1067,7 @@ var HORIZONTAL_MARGIN = 2; if ([_delegate respondsToSelector:@selector(collectionView:validateDrop:proposedIndex:dropOperation:)]) { - var dropIndexRef2 = AT_REF(dropIndex); + var dropIndexRef2 = @ref(dropIndex); result = [_delegate collectionView:self validateDrop:draggingInfo proposedIndex:dropIndexRef2 dropOperation:dropOperation]; diff --git a/AppKit/CPControl.j b/AppKit/CPControl.j index f1cd1a53b..8481c864d 100644 --- a/AppKit/CPControl.j +++ b/AppKit/CPControl.j @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#import "../Foundation/Ref.h" - @import @import @@ -553,10 +551,10 @@ var CPControlBlackColor = [CPColor blackColor]; { value = nil; - if ([_formatter getObjectValue:AT_REF(value) forString:aString errorDescription:nil] === NO) + if ([_formatter getObjectValue:@ref(value) forString:aString errorDescription:nil] === NO) { // If the given string is non-empty and doesn't work, Cocoa tries an empty string. - if (!aString || [_formatter getObjectValue:AT_REF(value) forString:@"" errorDescription:nil] === NO) + if (!aString || [_formatter getObjectValue:@ref(value) forString:@"" errorDescription:nil] === NO) value = undefined; // Means the value is invalid } } diff --git a/AppKit/CPTextField.j b/AppKit/CPTextField.j index 5cdbeeb18..9180710f3 100644 --- a/AppKit/CPTextField.j +++ b/AppKit/CPTextField.j @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#import "../Foundation/Ref.h" - @import "CPControl.j" @import "CPStringDrawing.j" @import "CPCompatibility.j" @@ -72,15 +70,15 @@ function CPTextFieldBlurFunction(anEvent, owner, domElement, inputElement, resig }, 0.0); } - CPTextFieldHandleBlur(anEvent, AT_REF(owner)); - AT_DEREF(didBlurRef, YES); + CPTextFieldHandleBlur(anEvent, @ref(owner)); + @deref(didBlurRef) = YES; return true; } function CPTextFieldHandleBlur(anEvent, ownerRef) { - AT_DEREF(ownerRef, nil); + @deref(ownerRef) = nil; [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; } @@ -236,7 +234,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); CPTextFieldInputOwner._DOMElement, CPTextFieldDOMInputElement, CPTextFieldInputResigning, - AT_REF(CPTextFieldInputDidBlur)); + @ref(CPTextFieldInputDidBlur)); }; if (CPFeatureIsCompatible(CPInputOnInputEventFeature)) @@ -778,7 +776,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); var error = @""; - if ([self _setStringValue:aValue isNewValue:NO errorDescription:AT_REF(error)] === NO) + if ([self _setStringValue:aValue isNewValue:NO errorDescription:@ref(error)] === NO) { var acceptInvalidValue = NO; @@ -1045,7 +1043,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); { var object = nil; - if ([formatter getObjectValue:AT_REF(object) forString:aValue errorDescription:anError]) + if ([formatter getObjectValue:@ref(object) forString:aValue errorDescription:anError]) objectValue = object; else { @@ -1084,7 +1082,7 @@ CPTextFieldStatePlaceholder = CPThemeState("placeholder"); // Formatting failed, get an "empty" object by formatting an empty string. // If that fails, the value is undefined. - if ([formatter getObjectValue:AT_REF(value) forString:@"" errorDescription:nil] === NO) + if ([formatter getObjectValue:@ref(value) forString:@"" errorDescription:nil] === NO) value = undefined; [super setObjectValue:value]; diff --git a/AppKit/CPTokenField.j b/AppKit/CPTokenField.j index 3521610b1..2cbffc30e 100755 --- a/AppKit/CPTokenField.j +++ b/AppKit/CPTokenField.j @@ -21,7 +21,6 @@ */ #import "../Foundation/CPRange.h" -#import "../Foundation/Ref.h" @import @import @@ -667,7 +666,7 @@ CPTokenFieldDeleteButtonType = 1; CPTokenFieldInputOwner ? [CPTokenFieldInputOwner._tokenScrollView documentView]._DOMElement : nil, CPTokenFieldDOMInputElement, CPTokenFieldInputResigning, - AT_REF(CPTokenFieldInputDidBlur)); + @ref(CPTokenFieldInputDidBlur)); }; // FIXME make this not onblur diff --git a/Foundation/CPArray/_CPArray.j b/Foundation/CPArray/_CPArray.j index fc15f5a08..8d8e1fd9a 100755 --- a/Foundation/CPArray/_CPArray.j +++ b/Foundation/CPArray/_CPArray.j @@ -618,7 +618,7 @@ var concat = Array.prototype.concat, var index = 0, count = [self count], shouldStop = NO, - shouldStopRef = AT_REF(shouldStop); + shouldStopRef = @ref(shouldStop); for (; index < count; ++index) { @@ -648,7 +648,7 @@ var concat = Array.prototype.concat, for (; index !== stop; index += increment) { - aFunction([self objectAtIndex:index], index, AT_REF(shouldStop)); + aFunction([self objectAtIndex:index], index, @ref(shouldStop)); if (shouldStop) return; diff --git a/Foundation/CPDateFormatter.j b/Foundation/CPDateFormatter.j index 80015bac0..eb28aeb8a 100644 --- a/Foundation/CPDateFormatter.j +++ b/Foundation/CPDateFormatter.j @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#import "Ref.h" - @import "CPDate.j" @import "CPString.j" @import "CPFormatter.j" @@ -104,7 +102,7 @@ CPDateFormatterFullStyle = 4; { // TODO Error handling. var value = [self dateFromString:aString]; - AT_DEREF(anObject, value); + @deref(anObject) = value; return YES; } diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index 5f930e955..3ee48a7bd 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -25,7 +25,6 @@ @import "CPException.j" @import "CPNull.j" @import "CPObject.j" -#import "Ref.h" //FIXME: After release of 0.9.7 remove below variable var CPDictionaryShowNilDeprecationMessage = YES; @@ -459,7 +458,7 @@ var CPDictionaryShowNilDeprecationMessage = YES; key = nil, value = nil, shouldStop = NO, - stopRef = AT_REF(shouldStop); + stopRef = @ref(shouldStop); for (; index !== stop; index += increment) { @@ -749,7 +748,7 @@ var CPDictionaryShowNilDeprecationMessage = YES; - (void)enumerateKeysAndObjectsUsingBlock:(Function /*(id aKey, id anObject, @ref BOOL stop)*/)aFunction { var shouldStop = NO, - shouldStopRef = AT_REF(shouldStop), + shouldStopRef = @ref(shouldStop), keys = self._keys, count = self._count; diff --git a/Foundation/CPFormatter.j b/Foundation/CPFormatter.j index d7cc4b11e..e0d72d43c 100644 --- a/Foundation/CPFormatter.j +++ b/Foundation/CPFormatter.j @@ -33,8 +33,6 @@ make sure that you cannot configure the public subclasses CPDateFormatter and CPNumberFormatter to satisfy your requirements. */ -#import "Ref.h" - @import "CPException.j" @import "CPObject.j" @@ -124,10 +122,10 @@ */ - (BOOL)isPartialStringValid:(CPString)aPartialString newEditingString:(CPStringRef)aNewString errorDescription:(CPStringRef)anError { - AT_DEREF(aPartialString, nil); + @deref(aPartialString) = nil; if (anError) - AT_DEREF(anError, nil); + @deref(anError) = nil; return YES; } @@ -137,32 +135,32 @@ not necessarily at the end of the string, and preserve the selection (or set a different one, such as selecting the erroneous part of the string the user has typed). - In a subclass implementation, evaluate aPartialString according to the context. Return \c YES if aPartialString is acceptable and \c NO if aPartialString - is unacceptable. Assign a new string by reference to aPartialString and a new range by reference to aProposedSelectedRange and return \c NO if you want to replace the string and + In a subclass implementation, evaluate aPartialStringRef according to the context. Return \c YES if aPartialStringRef is acceptable and \c NO if aPartialStringRef + is unacceptable. Assign a new string by reference to aPartialStringRef and a new range by reference to aProposedSelectedRangeRef and return \c NO if you want to replace the string and change the selection range. If you return \c NO, you can also return by reference a CPString object (in anError) that explains the reason why the validation failed; the delegate (if any) of the CPControl can then respond to the failure in control:didFailToValidatePartialString:errorDescription:. - @param aPartialString The new string to validate. - @param aProposedSelectedRange The selection range that will be used if the string is accepted or replaced. + @param aPartialStringRef The new string to validate. + @param aProposedSelectedRangeRef The selection range that will be used if the string is accepted or replaced. @param originalString The original string, before the proposed change. @param originalSelectedRange The selection range over which the change is to take place. @param anError If non-nil, if validation fails contains an CPString object that describes the problem. - @return \c YES if aPartialString is acceptable, otherwise \c NO. + @return \c YES if aPartialStringRef is acceptable, otherwise \c NO. */ -- (BOOL)isPartialStringValid:(CPStringRef)aPartialString proposedSelectedRange:(CPRangeRef)aProposedSelectedRange originalString:(CPString)originalString originalSelectedRange:(CPRange)originalSelectedRange errorDescription:(CPStringRef)anError +- (BOOL)isPartialStringValid:(CPStringRef)aPartialStringRef proposedSelectedRange:(CPRangeRef)aProposedSelectedRangeRef originalString:(CPString)originalString originalSelectedRange:(CPRange)originalSelectedRange errorDescription:(CPStringRef)anError { var newString = nil, - valid = [self isPartialStringValid:aPartialString newEditingString:AT_REF(newString) errorDescription:anError]; + valid = [self isPartialStringValid:aPartialStringRef newEditingString:@ref(newString) errorDescription:anError]; if (!valid) { - AT_DEREF(aPartialString, newString); + @deref(aPartialStringRef) = newString; // If a new string is passed back, the selection is always put at the end if (newString !== nil) - AT_DEREF(aProposedSelectedRange, CPMakeRange(newString.length, 0)); + @deref(aProposedSelectedRangeRef) = CPMakeRange(newString.length, 0); } return valid; diff --git a/Foundation/CPIndexSet.j b/Foundation/CPIndexSet.j index fcb208847..f00e1922d 100644 --- a/Foundation/CPIndexSet.j +++ b/Foundation/CPIndexSet.j @@ -548,7 +548,7 @@ { if (_CPLocationInRange(rangeIndex, enumerationRange)) { - aFunction(rangeIndex, AT_REF(shouldStop)); + aFunction(rangeIndex, @ref(shouldStop)); if (shouldStop) return; } @@ -629,7 +629,7 @@ { if (_CPLocationInRange(rangeIndex, aRange)) { - if (aPredicate(rangeIndex, AT_REF(shouldStop))) + if (aPredicate(rangeIndex, @ref(shouldStop))) return rangeIndex; if (shouldStop) @@ -690,7 +690,7 @@ { if (_CPLocationInRange(rangeIndex, aRange)) { - if (aPredicate(rangeIndex, AT_REF(shouldStop))) + if (aPredicate(rangeIndex, @ref(shouldStop))) [indexesPassingTest addIndex:rangeIndex]; if (shouldStop) diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index 0eb70c106..105bfbd5f 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -20,8 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#import "Ref.h" - @import "CPString.j" @import "CPFormatter.j" @import "CPDecimalNumber.j" @@ -183,7 +181,7 @@ var NumberRegex = new RegExp('(-)?(\\d*)(\\.(\\d*))?'); return [self stringForObjectValue:anObject]; } -- (BOOL)getObjectValue:(id)anObject forString:(CPString)aString errorDescription:(CPString)anError +- (BOOL)getObjectValue:(id)anObjectRef forString:(CPString)aString errorDescription:(CPString)anErrorRef { // allows an empty string to pass without validation if (aString === @"") @@ -202,13 +200,13 @@ var NumberRegex = new RegExp('(-)?(\\d*)(\\.(\\d*))?'); if (error) { - if (anError) - AT_DEREF(anError, error); + if (anErrorRef) + @deref(anErrorRef) = error; return NO; } - AT_DEREF(anObject, value); + @deref(anObjectRef) = value; return YES; } diff --git a/Foundation/Ref.h b/Foundation/Ref.h deleted file mode 100644 index 4f4038fe6..000000000 --- a/Foundation/Ref.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Ref.h - * Foundation - * - * Created by Alexander Ljungberg. - * Copyright 2011, WireLoad Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/* -Temporary macros to substitute for @ref and @deref functionality in a future version of Objective-J. Since these are C macros rather than a part of Preprocessor.js they can only be used within Cappuccino itself. -*/ - -// @ref -#define AT_REF(x) function(__input) { if (arguments.length) return x = __input; return x; } -// @deref (kind of) -#define AT_DEREF(x, ...) x(##__VA_ARGS__) diff --git a/Tests/Foundation/CPArrayTest.j b/Tests/Foundation/CPArrayTest.j index 027d6ca84..2bdfe3129 100644 --- a/Tests/Foundation/CPArrayTest.j +++ b/Tests/Foundation/CPArrayTest.j @@ -621,7 +621,7 @@ { [output setValue:anObject forKey:"" + idx]; if ([output count] > 1) - stop(YES); // AT_DEREF(stop, YES) - FIXME Replace with proper @ref @deref when in ObjJ. + @deref(stop) = YES; } output = [CPMutableDictionary dictionary]; diff --git a/Tests/Foundation/CPDictionaryTest.j b/Tests/Foundation/CPDictionaryTest.j index f404cd2d3..7795a7414 100644 --- a/Tests/Foundation/CPDictionaryTest.j +++ b/Tests/Foundation/CPDictionaryTest.j @@ -374,7 +374,7 @@ { [output setValue:anObject forKey:aKey]; if ([output count] > 1) - stop(YES); // AT_DEREF(stop, YES) - FIXME Replace with proper @ref @deref when in ObjJ. + @deref(stop) = YES; } [input1 enumerateKeysAndObjectsUsingBlock:stoppingFunction]; diff --git a/Tests/Foundation/CPIndexSetTest.j b/Tests/Foundation/CPIndexSetTest.j index 0f1827a0d..c2b59d90e 100644 --- a/Tests/Foundation/CPIndexSetTest.j +++ b/Tests/Foundation/CPIndexSetTest.j @@ -542,7 +542,7 @@ function descriptionWithoutEntity(aString) { visitedIndexes.push(idx); if (visitedIndexes.length >= 2) - stop(YES); // AT_DEREF(stop, YES) - FIXME Replace with proper @ref @deref when in ObjJ. + @deref(stop) = YES; } [set0 enumerateIndexesUsingBlock:aBlock]; From c550cd7afba54c0996273d82eb4b050edfeb41c9 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 13:09:24 +0000 Subject: [PATCH 015/145] New: optimise CPArray enumerateObjectsWithOptions:usingBlock:. --- Foundation/CPArray/_CPArray.j | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Foundation/CPArray/_CPArray.j b/Foundation/CPArray/_CPArray.j index 8d8e1fd9a..98759ea44 100755 --- a/Foundation/CPArray/_CPArray.j +++ b/Foundation/CPArray/_CPArray.j @@ -631,8 +631,6 @@ var concat = Array.prototype.concat, - (void)enumerateObjectsWithOptions:(CPEnumerationOptions)options usingBlock:(Function /*(id anObject, int idx, @ref BOOL stop)*/)aFunction { - var shouldStop = NO; - if (options & CPEnumerationReverse) { var index = [self count] - 1, @@ -646,9 +644,12 @@ var concat = Array.prototype.concat, increment = 1; } + var shouldStop = NO, + shouldStopRef = @ref(shouldStop); + for (; index !== stop; index += increment) { - aFunction([self objectAtIndex:index], index, @ref(shouldStop)); + aFunction([self objectAtIndex:index], index, shouldStopRef); if (shouldStop) return; From 39b49d47f971ca382525ecadc7729654d4073b23 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 13:30:35 +0000 Subject: [PATCH 016/145] Fixed: CPNumberFormatter formatted @"" as any number. Without this fix, `- CPNumberFormatter getObjectValue:forString:errorDescription:` would return `YES` for string @"", like if it was properly converted to an object value, but then actually leave object value unchanged. With this fix object value is set to nil like in Cocoa. Refs #1829. --- Foundation/CPNumberFormatter.j | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index 105bfbd5f..2299ea10e 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -183,9 +183,12 @@ var NumberRegex = new RegExp('(-)?(\\d*)(\\.(\\d*))?'); - (BOOL)getObjectValue:(id)anObjectRef forString:(CPString)aString errorDescription:(CPString)anErrorRef { - // allows an empty string to pass without validation + // Interpret an empty string as nil, like in Cocoa. if (aString === @"") + { + @deref(anObjectRef) = nil; return YES; + } var value = [self numberFromString:aString], error = @""; From 767a7a7177d8bdae9adb9dd75fe95b6670af3ef4 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 13:31:56 +0000 Subject: [PATCH 017/145] Test: expand CPNumberFormatter test to be more complete. - Cover the formatting of @"" to nil. - Check error messages by reference. - Check output values. - use @ref() instead of hand coded AT_REF. Refs #1829. --- Tests/Foundation/CPNumberFormatterTest.j | 47 +++++++++++++++--------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/Tests/Foundation/CPNumberFormatterTest.j b/Tests/Foundation/CPNumberFormatterTest.j index 4663cd01f..54338120d 100644 --- a/Tests/Foundation/CPNumberFormatterTest.j +++ b/Tests/Foundation/CPNumberFormatterTest.j @@ -51,41 +51,54 @@ - (void)testMinimumMaximumValues { var numberFormatter = [CPNumberFormatter new], - noneFunction = function() {}; + objectValue = nil, + objectValueRef = @ref(objectValue), + testErrorDescription = @"", + testErrorDescriptionRef = @ref(testErrorDescription); [numberFormatter setMinimum:10]; [numberFormatter setMaximum:20]; - [self assertTrue:[numberFormatter getObjectValue:noneFunction forString:@"10" errorDescription:nil] + [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"10" errorDescription:nil] message:@"MinMax T1: Expected True."]; - [self assertTrue:[numberFormatter getObjectValue:noneFunction forString:@"15" errorDescription:nil] + [self assert:10 equals:objectValue]; + + [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"15" errorDescription:nil] message:@"MinMax T2: Expected True."]; - [self assertTrue:[numberFormatter getObjectValue:noneFunction forString:@"20" errorDescription:nil] + [self assert:15 equals:objectValue]; + + [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"20" errorDescription:nil] message:@"MinMax T3: Expected True."]; - [self assertTrue:[numberFormatter getObjectValue:noneFunction forString:@"020" errorDescription:nil] + [self assert:20 equals:objectValue]; + + [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"020" errorDescription:nil] message:@"MinMax T4: Expected True."]; + [self assert:20 equals:objectValue]; // check if this formatter behaves like Cocoa, which allows a blank string to pass - [self assertTrue:[numberFormatter getObjectValue:noneFunction forString:@"" errorDescription:nil] + [self assertTrue:[numberFormatter getObjectValue:objectValueRef forString:@"" errorDescription:nil] message:@"MinMax T5: Expected True."]; + [self assert:nil equals:objectValue message:"MinMax T5: nil for @\"\"."]; - [self assertFalse:[numberFormatter getObjectValue:noneFunction forString:@"-1" errorDescription:nil] + [self assertFalse:[numberFormatter getObjectValue:objectValueRef forString:@"-1" errorDescription:nil] message:@"MinMax T6: Expected False."]; - [self assertFalse:[numberFormatter getObjectValue:noneFunction forString:@"1" errorDescription:nil] + [self assert:nil equals:objectValue]; + + [self assertFalse:[numberFormatter getObjectValue:objectValueRef forString:@"1" errorDescription:testErrorDescriptionRef] message:@"MinMax T7: Expected False."]; - [self assertFalse:[numberFormatter getObjectValue:noneFunction forString:@"100" errorDescription:nil] + [self assert:nil equals:objectValue]; + [self assert:testErrorDescription equals:@"Value is less than the minimum allowed value" message:@"MinMax T7: Error string does not match."]; + + [self assertFalse:[numberFormatter getObjectValue:objectValueRef forString:@"100" errorDescription:testErrorDescriptionRef] message:@"MinMax T8: Expected False."]; + [self assert:nil equals:objectValue]; + [self assert:testErrorDescription equals:@"Value is greater than the maximum allowed value" message:@"MinMax T8: Error string does not match."]; - var testErrorDescription = @"", - testWithString = [numberFormatter getObjectValue:noneFunction + var testWithString = [numberFormatter getObjectValue:objectValueRef forString:@"Cappuccino" - errorDescription:function(value) - { - if (arguments.length) - return testErrorDescription = value; + errorDescription:@ref(testErrorDescription)]; + [self assert:nil equals:objectValue]; - return testErrorDescription; - }]; [self assertFalse:testWithString message:@"MinMax T9: Expected False."]; [self assert:testErrorDescription From f201ab07210e93a86c9ae3077de15424e9f929f3 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 14:02:37 +0000 Subject: [PATCH 018/145] New: update operators on references, such as `@deref(x)++`. This fix implements support for both prefix and postfix update operators on a dereference. --- Objective-J/ObjJAcornCompiler.js | 25 ++++++++++++ Tests/Objective-J/PassByReferenceTest.j | 52 +++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index e5aac0072..3e63c9549 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -444,6 +444,31 @@ AssignmentExpression: function(node, st, c) { if (st.isRootScope() && node.left.type === "Identifier" && !st.getLvar(node.left.name)) st.vars[node.left.name] = {type: "global", node: node.left}; }, +UpdateExpression: function(node, st, c) { + if (node.argument.type === "Dereference") { + // @deref(x)++ and ++@deref(x) require special handling. + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); + + // Output the dereference function, "(...)(z)" + CONCAT(st.compiler.jsBuffer, (node.prefix ? "" : "(") + "("); + + // The thing being dereferenced. + st.compiler.lastPos = node.argument.expr.start; + c(node.argument.expr, st, "Expression"); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.argument.expr.end)); + CONCAT(st.compiler.jsBuffer, ")("); + + st.compiler.lastPos = node.argument.start; + c(node.argument, st, "Expression"); + CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.argument.end)); + CONCAT(st.compiler.jsBuffer, " " + node.operator.substring(0, 1) + " 1)" + (node.prefix ? "" : node.operator == '++' ? " - 1)" : " + 1)")); + + st.compiler.lastPos = node.end; + return; + } + + c(node.argument, st, "Expression"); +}, MemberExpression: function(node, st, c) { c(node.object, st, "Expression"); st.secondMemberExpression = !node.computed; diff --git a/Tests/Objective-J/PassByReferenceTest.j b/Tests/Objective-J/PassByReferenceTest.j index d55dd0344..d9c562c5a 100644 --- a/Tests/Objective-J/PassByReferenceTest.j +++ b/Tests/Objective-J/PassByReferenceTest.j @@ -23,6 +23,22 @@ var addRef = function(aRef) getRef = function(aRef) { return @deref(aRef) + }, + incrementRefPrefix = function(aRef) + { + return ++@deref(aRef); + }, + incrementRefPostfix = function(aRef) + { + return @deref(aRef)++; + }, + decrementRefPrefix = function(aRef) + { + return --@deref(aRef); + }, + decrementRefPostfix = function(aRef) + { + return @deref(aRef)--; }; @implementation PassByReferenceTest : OJTestCase @@ -62,6 +78,42 @@ var addRef = function(aRef) [self assert:-2 equals:x]; } +- (void)testIncrementPrefixByReference +{ + var x = -1, + r = incrementRefPrefix(@ref(x)); + + [self assert:0 equals:r]; + [self assert:0 equals:x]; +} + +- (void)testIncrementPostfixByReference +{ + var x = -1, + r = incrementRefPostfix(@ref(x)); + + [self assert:-1 equals:r]; + [self assert:0 equals:x]; +} + +- (void)testDecrementPrefixByReference +{ + var x = -1, + r = decrementRefPrefix(@ref(x)); + + [self assert:-2 equals:r]; + [self assert:-2 equals:x]; +} + +- (void)testDecrementPostfixByReference +{ + var x = -1, + r = decrementRefPostfix(@ref(x)); + + [self assert:-1 equals:r]; + [self assert:-2 equals:x]; +} + - (void)testMultiplyByReference { var x = -1; From 2bf244209637608b00adf36780d3f1fbd2f9901c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Sun, 10 Mar 2013 17:38:08 +0100 Subject: [PATCH 019/145] Fixed: Using keyboard navigation in empty CPCollectionView threw exception. --- AppKit/CPCollectionView.j | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index caa414c96..98a2ea69b 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -1217,7 +1217,10 @@ Not supported. Use -collectionView:dataForItemsAtIndexes:fortype: - (void)_modifySelectionWithNewIndex:(int)anIndex direction:(int)aDirection expand:(BOOL)shouldExpand { - anIndex = MIN(MAX(anIndex, 0), [[self items] count] - 1); + var count = [[self items] count]; + if (count === 0) + return; + anIndex = MIN(MAX(anIndex, 0), count - 1); if (_allowsMultipleSelection && shouldExpand) { From b53616ead361a962e4ae7981cd7b6c329a362b97 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 17:32:28 +0000 Subject: [PATCH 020/145] New: @deref(). This change makes it possible to @deref any expression, such as a conditional expression, as long as the expression doesn't have side effects. The reason not to allow dereferencing of expressions with side effects is that we might need to evaluate the expression twice in certain uses of deref, which is not obvious when you look at the deref operator in plain code. --- Objective-J/ObjJAcornCompiler.js | 80 ++++++++++++++++++++++++- Objective-J/acorn.js | 4 -- Tests/Objective-J/PassByReferenceTest.j | 21 +++++++ 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index 3e63c9549..f2861194d 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -330,11 +330,80 @@ function createMessage(/* String */ aMessage, /* SpiderMonkey AST node */ node, function compile(node, state, visitor) { function c(node, st, override) { - visitor[override || node.type](node, st, c); + visitor[override || node.type](node, st, c); } c(node, state); }; +function isIdempotentExpression(node) { + switch (node.type) { + case "Literal": + case "Identifier": + return true; + + case "ArrayExpression": + for (var i = 0; i < node.elements.length; ++i) { + if (!isIdempotentExpression(node.elements[i])) + return false; + } + + return true; + + case "DictionaryLiteral": + for (var i = 0; i < node.keys.length; ++i) { + if (!isIdempotentExpression(node.keys[i])) + return false; + if (!isIdempotentExpression(node.values[i])) + return false; + } + + return true; + + case "ObjectExpression": + for (var i = 0; i < node.properties.length; ++i) + if (!isIdempotentExpression(node.properties[i].value)) + return false; + + return true; + + case "FunctionExpression": + for (var i = 0; i < node.params.length; ++i) + if (!isIdempotentExpression(node.params[i])) + return false; + + return true; + + case "SequenceExpression": + for (var i = 0; i < node.expressions.length; ++i) + if (!isIdempotentExpression(node.expressions[i])) + return false; + + return true; + + case "UnaryExpression": + return isIdempotentExpression(node.argument); + + case "BinaryExpression": + return isIdempotentExpression(node.left) && isIdempotentExpression(node.right); + + case "ConditionalExpression": + return isIdempotentExpression(node.test) && isIdempotentExpression(node.consequent) && isIdempotentExpression(node.alternate); + + case "MemberExpression": + return isIdempotentExpression(node.object) && (!node.computed || isIdempotentExpression(node.property)); + + case "Dereference": + return isIdempotentExpression(node.expr); + + case "Reference": + return isIdempotentExpression(node.element); + + case "UpdateExpression": + default: + return false; + } +} + var pass1 = exports.acorn.walk.make({ ImportStatement: function(node, st, c) { var urlString = node.filename.value; @@ -406,6 +475,9 @@ VariableDeclaration: function(node, scope, c) { }, AssignmentExpression: function(node, st, c) { if (node.left.type === "Dereference") { + if (!isIdempotentExpression(node.left)) + throw st.compiler.error_message("Unable to dereference expression with side effects", node.left); + // @deref(x) = z -> x(z) etc CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); @@ -446,6 +518,9 @@ AssignmentExpression: function(node, st, c) { }, UpdateExpression: function(node, st, c) { if (node.argument.type === "Dereference") { + if (!isIdempotentExpression(node.argument)) + throw st.compiler.error_message("Unable to dereference expression with side effects", node.argument); + // @deref(x)++ and ++@deref(x) require special handling. CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); @@ -899,6 +974,9 @@ Reference: function(node, st, c) { st.compiler.lastPos = node.end; }, Dereference: function(node, st, c) { + if (!isIdempotentExpression(node.expr)) + throw st.compiler.error_message("Unable to dereference expression with side effects", node.expr); + // @deref(y) -> y() // @deref(@deref(y)) -> y()() CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); diff --git a/Objective-J/acorn.js b/Objective-J/acorn.js index e4adc242e..8af2eaf55 100644 --- a/Objective-J/acorn.js +++ b/Objective-J/acorn.js @@ -1940,10 +1940,6 @@ if (!exports.acorn) { expect(_parenL, "Expected '(' after '@deref'"); node.expr = parseExpression(true, true); expect(_parenR, "Expected closing ')' after deref"); - - if (node.expr.type !== "Identifier" && node.expr.type !== "MemberExpression" && node.expr.type !== "Reference" && node.expr.type !== "Dereference") - raise(node, "Dereference of " + node.expr.type); - return finishNode(node, "Dereference"); default: diff --git a/Tests/Objective-J/PassByReferenceTest.j b/Tests/Objective-J/PassByReferenceTest.j index d9c562c5a..4a128d868 100644 --- a/Tests/Objective-J/PassByReferenceTest.j +++ b/Tests/Objective-J/PassByReferenceTest.j @@ -132,4 +132,25 @@ var addRef = function(aRef) [self assert:-0.5 equals:x]; } +- (void)testComplexDereference +{ + var x = 1, + xRef = @ref(x), + xRefRef = @ref(xRef), + y = 10, + yRef = @ref(y), + yRefRef = @ref(yRef); + + var r = @deref(@deref(xRefRef))++; + + [self assert:1 equals:r]; + [self assert:2 equals:x]; + + var r = @deref(@deref(x == 1 ? xRefRef : yRefRef))++; + + [self assert:10 equals:r]; + [self assert:2 equals:x]; + [self assert:11 equals:y]; +} + @end From 483bd16a2d0ef95dc612c539bfd4e7be0488cf8c Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 17:37:44 +0000 Subject: [PATCH 021/145] Formatting: simplify code slightly. --- Objective-J/ObjJAcornCompiler.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index f2861194d..6c8fc4a1b 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -398,12 +398,17 @@ function isIdempotentExpression(node) { case "Reference": return isIdempotentExpression(node.element); - case "UpdateExpression": default: return false; } } +// We do not allow dereferencing of expressions with side effects because we might need to evaluate the expression twice in certain uses of deref, which is not obvious when you look at the deref operator in plain code. +function checkCanDereference(st, node) { + if (!isIdempotentExpression(node)) + throw st.compiler.error_message("Dereference of expression with side effects", node); +} + var pass1 = exports.acorn.walk.make({ ImportStatement: function(node, st, c) { var urlString = node.filename.value; @@ -475,8 +480,7 @@ VariableDeclaration: function(node, scope, c) { }, AssignmentExpression: function(node, st, c) { if (node.left.type === "Dereference") { - if (!isIdempotentExpression(node.left)) - throw st.compiler.error_message("Unable to dereference expression with side effects", node.left); + checkCanDereference(st, node.left); // @deref(x) = z -> x(z) etc CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); @@ -518,8 +522,7 @@ AssignmentExpression: function(node, st, c) { }, UpdateExpression: function(node, st, c) { if (node.argument.type === "Dereference") { - if (!isIdempotentExpression(node.argument)) - throw st.compiler.error_message("Unable to dereference expression with side effects", node.argument); + checkCanDereference(st, node.argument); // @deref(x)++ and ++@deref(x) require special handling. CONCAT(st.compiler.jsBuffer, st.compiler.source.substring(st.compiler.lastPos, node.start)); @@ -974,8 +977,7 @@ Reference: function(node, st, c) { st.compiler.lastPos = node.end; }, Dereference: function(node, st, c) { - if (!isIdempotentExpression(node.expr)) - throw st.compiler.error_message("Unable to dereference expression with side effects", node.expr); + checkCanDereference(st, node.expr); // @deref(y) -> y() // @deref(@deref(y)) -> y()() From cd96f7822864b6e91d0b28376bba33265f44bdd6 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Sun, 10 Mar 2013 19:56:07 +0100 Subject: [PATCH 022/145] CPPredicate: use @ref instead of custom function --- Foundation/CPPredicate/_CPPredicate.j | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/Foundation/CPPredicate/_CPPredicate.j b/Foundation/CPPredicate/_CPPredicate.j index 8b66d3126..d2d8544db 100644 --- a/Foundation/CPPredicate/_CPPredicate.j +++ b/Foundation/CPPredicate/_CPPredicate.j @@ -279,15 +279,6 @@ @end -#define REFERENCE(variable) \ -function(newValue)\ -{\ - var oldValue = variable;\ - if (typeof newValue != 'undefined')\ - variable = newValue;\ - return oldValue;\ -} - @implementation CPPredicateScanner : CPScanner { CPEnumerator _args; @@ -573,7 +564,7 @@ function(newValue)\ ident, dbl; - if ([self scanDouble:REFERENCE(dbl)]) + if ([self scanDouble:@ref(dbl)]) return [CPExpression expressionForConstantValue:dbl]; // FIXME: handle integer, hex constants, 0x 0o 0b @@ -706,7 +697,7 @@ function(newValue)\ str = @""; [self setCharactersToBeSkipped:nil]; - [self scanUpToString:@"\"" intoString:REFERENCE(str)]; + [self scanUpToString:@"\"" intoString:@ref(str)]; if ([self scanString:@"\"" intoString:NULL] == NO) CPRaiseParseError(self, @"expression"); @@ -722,7 +713,7 @@ function(newValue)\ str = @""; [self setCharactersToBeSkipped:nil]; - [self scanUpToString:@"'" intoString:REFERENCE(str)]; + [self scanUpToString:@"'" intoString:@ref(str)]; if ([self scanString:@"'" intoString:NULL] == NO) CPRaiseParseError(self, @"expression"); @@ -784,7 +775,7 @@ function(newValue)\ if (!identifier) identifier = [CPCharacterSet characterSetWithCharactersInString:@"_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"]; - if (![self scanCharactersFromSet:identifier intoString:REFERENCE(ident)]) + if (![self scanCharactersFromSet:identifier intoString:@ref(ident)]) CPRaiseParseError(self, @"expression"); return [CPExpression expressionForKeyPath:ident]; @@ -846,7 +837,7 @@ function(newValue)\ if (![self scanString:@"(" intoString:NULL]) { var str; - [self scanCharactersFromSet:[CPCharacterSet lowercaseLetterCharacterSet] intoString:REFERENCE(str)]; + [self scanCharactersFromSet:[CPCharacterSet lowercaseLetterCharacterSet] intoString:@ref(str)]; if (![self scanString:@":(" intoString:NULL]) CPRaiseParseError(self, @"expression"); From abadc6298d6625b13e2dc5db575a2f2dff3a7750 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 22:29:48 +0000 Subject: [PATCH 023/145] Test: refactor token field test to not rely on ivars. This will make it easier to extend the test with token fields in windows or popovers. --- Tests/Manual/CPTokenFieldTest/AppController.j | 141 ++++++++++-------- 1 file changed, 79 insertions(+), 62 deletions(-) diff --git a/Tests/Manual/CPTokenFieldTest/AppController.j b/Tests/Manual/CPTokenFieldTest/AppController.j index 55050d116..fdd830477 100644 --- a/Tests/Manual/CPTokenFieldTest/AppController.j +++ b/Tests/Manual/CPTokenFieldTest/AppController.j @@ -12,18 +12,11 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad @implementation AppController : CPObject { - CPTokenField tokenFieldD; - - CPArray allPersons; - CPButton manipulateTokenInsertionButton; } -- (void)applicationDidFinishLaunching:(CPNotification)aNotification ++ (void)createTokenfieldContents:(CPView)contentView withDelegate:(id)aDelegate { - var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], - contentView = [theWindow contentView], - - tokenFieldA = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 40, 500, 30)], + var tokenFieldA = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 40, 500, 30)], label = [[CPTextField alloc] initWithFrame:CGRectMake(15, 15, 500, 24)]; [label setStringValue:"This token field has no auto suggestions and uses space to separate tokens."]; @@ -47,16 +40,17 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [tokenFieldB setPlaceholderString:"Edit me!"]; [tokenFieldB setObjectValue:["Missouri", "California"]]; - [tokenFieldB setDelegate:self]; + [tokenFieldB setDelegate:aDelegate]; [tokenFieldB setAction:@selector(tokenFieldAction:)]; - [tokenFieldB setTarget:self]; + [tokenFieldB setTarget:aDelegate]; [contentView addSubview:tokenFieldB]; - manipulateTokenInsertionButton = [CPCheckBox checkBoxWithTitle:"Token transformations"]; + var manipulateTokenInsertionButton = [CPCheckBox checkBoxWithTitle:"Token transformations"]; [manipulateTokenInsertionButton setFrame:CGRectMake(525, 110, 200, 50)]; [contentView addSubview:manipulateTokenInsertionButton]; + tokenFieldB.manipulateTokenInsertionButton = manipulateTokenInsertionButton; var tokenFieldC = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 170, 500, 30)], labelC = [[CPTextField alloc] initWithFrame:CGRectMake(15, 150, 500, 24)]; @@ -68,16 +62,19 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [tokenFieldC setPlaceholderString:"Edit me!"]; [tokenFieldC setObjectValue:['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado']]; - [tokenFieldC setDelegate:self]; + [tokenFieldC setDelegate:aDelegate]; [contentView addSubview:tokenFieldC]; [tokenFieldC setSendsActionOnEndEditing:YES]; [tokenFieldC setAction:@selector(tokenFieldAction:)]; - [tokenFieldC setTarget:self]; + [tokenFieldC setTarget:aDelegate]; - tokenFieldD = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 230, 500, 30)], - labelD = [[CPTextField alloc] initWithFrame:CGRectMake(15, 210, 500, 24)]; + var tokenFieldD = [[CPTokenField alloc] initWithFrame:CGRectMake(15, 230, 500, 30)], + labelD = [[CPTextField alloc] initWithFrame:CGRectMake(15, 210, 500, 24)], + tokenFieldDController = [TokenFieldOptionsController new]; + + tokenFieldDController.tokenField = tokenFieldD; [labelD setStringValue:"This token field contains represented objects."]; [contentView addSubview:labelD]; @@ -85,7 +82,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [tokenFieldD setEditable:YES]; // Delegate must be set before objectValue - [tokenFieldD setDelegate:self]; + [tokenFieldD setDelegate:aDelegate]; var tokenFieldDEditable = [CPCheckBox checkBoxWithTitle:"Editable"]; [tokenFieldDEditable sizeToFit]; @@ -96,70 +93,47 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad var tokenFieldDMenus = [CPCheckBox checkBoxWithTitle:"Menus"]; [tokenFieldDMenus sizeToFit]; [tokenFieldDMenus setFrameOrigin:CGPointMake(CGRectGetMaxX([tokenFieldDEditable frame]) + 5, 5 + CGRectGetMinY([tokenFieldD frame]))]; - [tokenFieldDMenus bind:CPValueBinding toObject:self withKeyPath:@"tokenFieldDHasMenus" options:nil]; + [tokenFieldDMenus bind:CPValueBinding toObject:tokenFieldDController withKeyPath:@"tokenFieldHasMenus" options:nil]; [contentView addSubview:tokenFieldDMenus]; var tokenFieldDClose = [CPCheckBox checkBoxWithTitle:"Close Buttons"]; [tokenFieldDClose sizeToFit]; [tokenFieldDClose setFrameOrigin:CGPointMake(CGRectGetMaxX([tokenFieldDMenus frame]) + 5, 5 + CGRectGetMinY([tokenFieldD frame]))]; - [tokenFieldDClose bind:CPValueBinding toObject:self withKeyPath:@"tokenFieldDHasCloseButtons" options:nil]; + [tokenFieldDClose bind:CPValueBinding toObject:tokenFieldDController withKeyPath:@"tokenFieldHasCloseButtons" options:nil]; [contentView addSubview:tokenFieldDClose]; - allPersons = [ + tokenFieldD._testCompletions = [ [Person personWithFirstName:@"Luc" lastName:@"Vauvillier"], [Person personWithFirstName:@"John" lastName:@"Doe"], [Person personWithFirstName:@"Amélie" lastName:@"Poulain"], [Person personWithFirstName:@"Jean" lastName:@"Valjean"] ]; - [tokenFieldD setObjectValue:[allPersons copy]]; + [tokenFieldD setObjectValue:[tokenFieldD._testCompletions copy]]; + + var tokenFieldDEditable = [CPCheckBox checkBoxWithTitle:"Editable"]; + [tokenFieldDEditable sizeToFit]; + [tokenFieldDEditable setFrameOrigin:CGPointMake(525, 5 + CGRectGetMinY([tokenFieldD frame]))]; + [tokenFieldDEditable bind:CPValueBinding toObject:tokenFieldD withKeyPath:@"editable" options:nil]; + [contentView addSubview:tokenFieldDEditable]; [contentView addSubview:tokenFieldD]; var button = [[CPButton alloc] initWithFrame:CGRectMake(15, 270, 0, 0)]; [button setTitle:"Get Object Values"]; [button sizeToFit]; - [button setTarget:self]; + [button setTarget:tokenFieldDController]; [button setAction:@selector(getObjectValues:)]; [contentView addSubview:button]; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask], + contentView = [theWindow contentView]; + + [[self class] createTokenfieldContents:contentView withDelegate:self]; [theWindow orderFront:self]; - -} - -- (void)setTokenFieldDHasMenus:(BOOL)shouldHaveMenus -{ - if (shouldHaveMenus) - { - [[tokenFieldD objectValue] enumerateObjectsUsingBlock:function(aPerson) - { - var menu = [CPMenu new]; - for (var i = 0; i < 3; i++) - [menu addItem:[[CPMenuItem alloc] initWithTitle:[CPString stringWithFormat:@"%@ Item %i", aPerson, i] action:nil keyEquivalent:nil]]; - aPerson.menu = menu; - }]; - } - else - [[tokenFieldD objectValue] makeObjectsPerformSelector:@selector(setMenu:) withObject:nil]; -} - -- (BOOL)tokenFieldDHasMenus -{ - return !![[[tokenFieldD objectValue] firstObject] menu]; -} - -- (void)setTokenFieldDHasCloseButtons:(BOOL)shouldHaveCloseButtons -{ - [tokenFieldD setButtonType:shouldHaveCloseButtons ? CPTokenFieldDeleteButtonType : CPTokenFieldDisclosureButtonType]; -} - -- (BOOL)tokenFieldDHasCloseButtons -{ - return !![tokenFieldD buttonType] === CPTokenFieldDeleteButtonType; -} - -- (void)getObjectValues:(id)sender -{ - alert([tokenFieldD objectValue]); } - (CPArray)tokenField:(CPTokenField)aTokenField completionsForSubstring:(CPString)substring indexOfToken:(int)tokenIndex indexOfSelectedItem:(int)selectedIndex @@ -170,8 +144,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad if (!substring) return r; - - if (aTokenField !== tokenFieldD) + if (!aTokenField['_testCompletions']) { for (var i = 0; i < STATES.length; i++) if (STATES[i].toLowerCase().indexOf(substring.toLowerCase()) == 0) @@ -179,6 +152,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad } else { + var allPersons = aTokenField._testCompletions; for (var i = 0; i < allPersons.length; i++) if ([allPersons[i] fullname].toLowerCase().indexOf(substring.toLowerCase()) == 0) r.push(allPersons[i]); @@ -208,7 +182,7 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad // Texas -> Utah, Michigan -> Michigan & Arkansas, Washington -> nil - if ([manipulateTokenInsertionButton intValue]) + if (tokenField['manipulateTokenInsertionButton'] && [tokenField['manipulateTokenInsertionButton'] intValue]) { if (tokens[0] == "Texas") return ["Utah"]; @@ -233,6 +207,49 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad @end +@implementation TokenFieldOptionsController : CPObject +{ + CPTokenField tokenField; +} + +- (BOOL)tokenFieldHasMenus +{ + return !![[[tokenField objectValue] firstObject] menu]; +} + +- (void)setTokenFieldHasCloseButtons:(BOOL)shouldHaveCloseButtons +{ + [tokenField setButtonType:shouldHaveCloseButtons ? CPTokenFieldDeleteButtonType : CPTokenFieldDisclosureButtonType]; +} + +- (BOOL)tokenFieldHasCloseButtons +{ + return !![tokenField buttonType] === CPTokenFieldDeleteButtonType; +} + +- (void)setTokenFieldHasMenus:(BOOL)shouldHaveMenus +{ + if (shouldHaveMenus) + { + [[tokenField objectValue] enumerateObjectsUsingBlock:function(aPerson) + { + var menu = [CPMenu new]; + for (var i = 0; i < 3; i++) + [menu addItem:[[CPMenuItem alloc] initWithTitle:[CPString stringWithFormat:@"%@ Item %i", aPerson, i] action:nil keyEquivalent:nil]]; + aPerson.menu = menu; + }]; + } + else + [[tokenField objectValue] makeObjectsPerformSelector:@selector(setMenu:) withObject:nil]; +} + +- (void)getObjectValues:(id)sender +{ + alert([tokenField objectValue]); +} + +@end + // A sample of a custom Object @implementation Person : CPObject From ff15f11927d4573d19abd4413ca184680f3df555 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 22:48:26 +0000 Subject: [PATCH 024/145] Fixed: transient popover windows would close on mouse interaction with certain controls. Without this fix, a transient popover would close if the autocomplete menu of a token field contained in it was clicked. This happened because the popover considered the click to be on a different window. Although not tested, it's likely the same thing would happen if the menu of a combo pop or a pop up button was clicked. This fix makes it so that any child window of a popover can be clicked without the popover closing. --- AppKit/CPWindow/CPWindow.j | 16 ++++++++++++++++ AppKit/_CPPopoverWindow.j | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index c1f8a677e..48ee6c6b8 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -2453,6 +2453,22 @@ CPTexturedBackgroundWindowMask return _parentWindow; } +/*! + Return YES if anAncestor is the parent or a higher ancestor of the receiver. + + @ignore +*/ +- (BOOL)_hasAncestorWindow:(CPWindow)anAncestor +{ + if (!_parentWindow || !anAncestor) + return NO; + + if (anAncestor === _parentWindow) + return YES; + + return [_parentWindow _hasAncestorWindow:anAncestor]; +} + - (CPWindow)setParentWindow:(CPWindow)parentWindow { _parentWindow = parentWindow; diff --git a/AppKit/_CPPopoverWindow.j b/AppKit/_CPPopoverWindow.j index d3e2b16e9..914af3b3d 100644 --- a/AppKit/_CPPopoverWindow.j +++ b/AppKit/_CPPopoverWindow.j @@ -569,7 +569,9 @@ var _CPPopoverWindow_shouldClose_ = 1 << 0, var mouseWindow = [anEvent window]; - if (mouseWindow === self) + // Consider clicks in child windows to be "inside". This keeps a transient popover from + // closing if e.g. the window containing the menu of a token field is clicked. + if (mouseWindow === self || [mouseWindow _hasAncestorWindow:self]) [self _trapNextMouseDown]; else { From 09ea8c32415e4947343dd16ad43b898f3bf881d2 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Sun, 10 Mar 2013 22:49:09 +0000 Subject: [PATCH 025/145] Test: manual test for most token field behaviour when in a popover. --- Tests/Manual/CPTokenFieldTest/AppController.j | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Tests/Manual/CPTokenFieldTest/AppController.j b/Tests/Manual/CPTokenFieldTest/AppController.j index fdd830477..0b226e2d6 100644 --- a/Tests/Manual/CPTokenFieldTest/AppController.j +++ b/Tests/Manual/CPTokenFieldTest/AppController.j @@ -133,9 +133,29 @@ var STATES = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorad [[self class] createTokenfieldContents:contentView withDelegate:self]; + var popoverButton = [[CPButton alloc] initWithFrame:CGRectMake(15, 310, 0, 0)]; + [popoverButton setTitle:"Token Field in a Popover"]; + [popoverButton sizeToFit]; + [popoverButton setTarget:self]; + [popoverButton setAction:@selector(openPopover:)]; + [contentView addSubview:popoverButton]; + [theWindow orderFront:self]; } +- (@action)openPopover:(id)sender +{ + var aPopover = [CPPopover new], + controller = [CPViewController new]; + + [aPopover setContentViewController:controller]; + [aPopover setContentSize:CGSizeMake(800, 315)]; + [[self class] createTokenfieldContents:[controller view] withDelegate:self]; + [aPopover setAnimates:YES]; + [aPopover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:CPMaxXEdge]; + [aPopover setBehavior:CPPopoverBehaviorTransient]; +} + - (CPArray)tokenField:(CPTokenField)aTokenField completionsForSubstring:(CPString)substring indexOfToken:(int)tokenIndex indexOfSelectedItem:(int)selectedIndex { var r = []; From 969f56911aa988fe1abc28e646549f28e88dff0b Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Mon, 11 Mar 2013 12:58:36 +0000 Subject: [PATCH 026/145] Test: popovers in attached sheet 2 test. The popover test now added exposes a bug: 1. Click Modal Window to open a modal window. 2. Click Popover to open a popover. 3. Click on the first window. It should not be possible to interact with this window since a modal window is open, but a bug in the modal event handling when transient popovers are open will allow the event to incorrectly pass through to the window. AttachedSheet2 is turning into a complete window/modality/sheets/alerts/popover interaction test. --- .../AttachedSheet2/Resources/Window.cib | 2 +- .../AttachedSheet2/Resources/Window.xib | 68 +++++++++++++++++-- .../AttachedSheet2/SheetWindowController.j | 22 ++++++ 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/Tests/Manual/AttachedSheet2/Resources/Window.cib b/Tests/Manual/AttachedSheet2/Resources/Window.cib index 27a095ed4..66c6ffe0b 100644 --- a/Tests/Manual/AttachedSheet2/Resources/Window.cib +++ b/Tests/Manual/AttachedSheet2/Resources/Window.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;68E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;69E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;60E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;53E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;59E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;58E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;56E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;49E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;83E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;84E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;39E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;39E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;62E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;62E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;88E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;89E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;43E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;44E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;47E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;93E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;94E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;95E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;96E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;97E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;98E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;99E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;100E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;101E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;41E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;103E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;104E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;106E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;101E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;119E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;120E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;121E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;122E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;123E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;124E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;125E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;126E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;130E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;133E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;134E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;130E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;135E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;136E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;137E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;130E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;138E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;139E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;140E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;130E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;141E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;142E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;144E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;145E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;147E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;148E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;118E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;149E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;150E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;116E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;116E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;152E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;102E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;114E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;153E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;154E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;155E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;156E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;157E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;158E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;159E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;160E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;162E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;163E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;164E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;165E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonKeyEquivalentKeyD;K;6;CP$UIDd;3;166E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;42E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;167E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;168E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;161E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;169E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;117E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;102E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;170E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;171E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;172E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;147E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;173E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;118E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;115E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;150E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;118E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;118E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;118E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;174E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;113E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;114E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;175E;E;D;K;10;$classnameS;12;CPTokenFieldK;8;$classesA;S;12;CPTokenFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;63E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;176E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;171E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;178E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;179E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;150E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;118E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;118E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;118E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;174E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;102E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;102E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;180E;K;37;CPTokenFieldTokenizingCharacterSetKeyD;K;6;CP$UIDd;1;0E;K;27;CPTokenFieldCompletionDelayD;K;6;CP$UIDd;1;0E;K;25;CPTokenFieldButtonTypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;65E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;181E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;182E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;172E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;183E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;184E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;185E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;186E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;102E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;187E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;102E;E;D;K;6;$classD;K;6;CP$UIDd;2;40E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;188E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;189E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;190E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;48E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;102E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;128E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;191E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;129E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;130E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;133E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;115E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;S;21;SheetWindowControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;15;_altCloseButtonS;19;_closableMaskButtonS;12;_closeButtonS;25;_miniaturizableMaskButtonS;22;_orderOutAfterCheckboxS;17;_otherCloseButtonS;20;_resizableMaskButtonS;17;_shadeContentViewS;18;_shadeParentWindowS;16;_shadeWindowViewS;17;_titledMaskButtonD;K;10;$classnameS;12;CPRadioGroupK;8;$classesA;S;12;CPRadioGroupS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;82E;K;21;CPRadioGroupRadiosKeyD;K;6;CP$UIDd;3;192E;K;28;CPRadioGroupSelectedRadioKeyD;K;6;CP$UIDd;3;194E;E;S;17;_windowTypeMatrixS;6;windowS;21;initialFirstResponderS;8;delegateS;20;takeDoubleValueFrom:S;14;newModalSheet:S;10;newWindow:S;9;newSheet:S;15;newModalWindow:S;14;newAlertSheet:S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;23;{{71, 196}, {468, 455}}S;22;{{0, 0}, {2560, 1418}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {468, 455}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;64E;E;E;S;6;normalS;21;{{20, 17}, {138, 25}}S;19;{{0, 0}, {138, 25}}d;2;36S;6;buttonS;8;borderedD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;195E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;196E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;118E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;118E;E;d;1;2d;1;4S;0;F;d;2;14T;S;21;{{20, 49}, {138, 25}}S;12;Modal WindowS;21;{{20, 81}, {138, 25}}S;5;SheetS;22;{{20, 113}, {138, 25}}S;11;Modal SheetS;22;{{20, 145}, {138, 25}}S;11;Alert SheetS;23;{{193, 156}, {174, 21}}S;19;{{0, 0}, {174, 21}}S;9;check-boxS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;195E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;196E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;118E;E;d;1;1S;18;CPTitledWindowMaskS;23;{{193, 176}, {174, 21}}S;20;CPClosableWindowMaskS;23;{{192, 196}, {210, 21}}S;19;{{0, 0}, {210, 21}}S;26;CPMiniaturizableWindowMaskS;23;{{192, 216}, {180, 21}}S;19;{{0, 0}, {180, 21}}S;21;CPResizableWindowMaskS;22;{{18, 247}, {329, 21}}S;19;{{0, 0}, {329, 21}}S;25;orderOut: after endSheet:S;22;{{33, 274}, {362, 26}}S;19;{{0, 0}, {362, 26}}S;9;textfieldD;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;195E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;197E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;118E;E;S;140;It is not specified if endSheet: or orderOut: on sheet should be called first. However, cannot call orderOut: after endSheet: when chaining.d;4;3072D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;151E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;198E;E;S;22;{{18, 303}, {329, 21}}S;36;Shade Window View of Non-CIB WindowsS;22;{{18, 323}, {329, 21}}S;36;Shade Content View of Non-CIB WindowS;22;{{18, 343}, {329, 21}}S;44;Shade Parent Window on windowWillBeginSheet:S;22;{{20, 411}, {110, 25}}S;19;{{0, 0}, {110, 25}}d;1;9S;12;Chain SheetsS;22;{{387, 411}, {68, 25}}S;18;{{0, 0}, {68, 25}}S;5;CloseS;4;CgA=S;23;{{240, 411}, {135, 25}}S;19;{{0, 0}, {135, 25}}S;16;Close Parent TooS;23;{{162, 377}, {104, 29}}S;19;{{0, 0}, {104, 29}}d;2;45S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;151E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;199E;E;S;11;CPTextFieldS;23;{{271, 377}, {104, 29}}S;10;tokenfieldS;16;bezeled+editableD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;12;CPTokenFieldS;21;{{61, 381}, {92, 21}}S;18;{{0, 0}, {92, 21}}S;6;sliderD;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;200E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;191E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;116E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;116E;E;d;2;50d;2;68d;3;100S;23;{{193, 20}, {261, 136}}S;20;{{0, 0}, {261, 136}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;E;E;d;2;12D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;206E;E;D;K;10;$classnameS;7;CPRadioK;8;$classesA;S;7;CPRadioS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;67E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;132E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;207E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;67E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;210E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;211E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;113E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;132E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;212E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;213E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;214E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;83E;E;S;28;_CPFontSystemFacePlaceholderd;2;-1d;2;10D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;215E;D;K;6;CP$UIDd;3;132E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;132E;D;K;6;CP$UIDd;3;132E;E;E;S;9;HelveticaD;K;6;$classD;K;6;CP$UIDd;3;193E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;67E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;113E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;216E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;67E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;210E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;113E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;217E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;213E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;214E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;67E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;218E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;219E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;67E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;210E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;113E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;220E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;213E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;214E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;67E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;114E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;221E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;67E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;210E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;113E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;222E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;213E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;214E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;67E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;223E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;224E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;67E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;210E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;113E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;225E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;213E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;214E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;3;193E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;67E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;226E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;207E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;67E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;208E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;209E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;210E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;113E;K;16;$aimage-positionD;K;6;CP$UIDd;3;113E;K;6;$afontD;K;6;CP$UIDd;3;131E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;102E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;102E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;114E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;227E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;116E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;132E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;132E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;118E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;113E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;102E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;213E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;214E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;194E;D;K;6;CP$UIDd;3;201E;D;K;6;CP$UIDd;3;202E;D;K;6;CP$UIDd;3;203E;D;K;6;CP$UIDd;3;204E;D;K;6;CP$UIDd;3;205E;E;E;S;19;{{0, 0}, {261, 21}}d;2;18D;K;6;$classD;K;6;CP$UIDd;3;151E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;228E;E;S;5;radioS;17;selected+borderedS;10;CIB Windowf;3;0.5f;4;0.05f;18;0.6862745098039216S;20;{{0, 23}, {261, 21}}S;25;CPHUDBackgroundWindowMaskd;1;3S;20;{{0, 46}, {261, 21}}S;22;CPBorderlessWindowMaskS;20;{{0, 69}, {261, 21}}S;30;CPTexturedBackgroundWindowMaskd;1;5S;20;{{0, 92}, {261, 21}}S;20;CPDocModalWindowMaskS;21;{{0, 115}, {261, 21}}S;14;CIB HUD WindowD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;102E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;70E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;71E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;72E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;62E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;61E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;54E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;60E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;53E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;58E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;59E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;57E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;83E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;85E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;40E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;40E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;88E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;89E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;67E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;90E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;47E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;91E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;44E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;92E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;93E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;94E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;48E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;69E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;96E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;97E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;98E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;99E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;101E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;102E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;103E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;104E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;106E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;106E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;107E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;109E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;104E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;122E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;123E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;124E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;125E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;126E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;127E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;128E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;129E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;130E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;131E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;136E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;137E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;131E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;138E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;139E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;140E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;141E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;142E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;143E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;144E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;145E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;147E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;148E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;149E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;151E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;121E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;152E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;119E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;119E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;154E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;105E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;155E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;156E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;157E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;158E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;159E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;146E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;160E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;161E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;164E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;165E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;167E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;24;CPButtonKeyEquivalentKeyD;K;6;CP$UIDd;3;168E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;169E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;170E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;171E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;172E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;173E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;174E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;150E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;175E;K;11;$aalignmentD;K;6;CP$UIDd;3;117E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;114E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;121E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;118E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;121E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;121E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;121E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;176E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;114E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;117E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;177E;E;D;K;10;$classnameS;12;CPTokenFieldK;8;$classesA;S;12;CPTokenFieldS;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;64E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;178E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;173E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;179E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;180E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;181E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;121E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;121E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;121E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;176E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;105E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;105E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;3;182E;K;37;CPTokenFieldTokenizingCharacterSetKeyD;K;6;CP$UIDd;1;0E;K;27;CPTokenFieldCompletionDelayD;K;6;CP$UIDd;1;0E;K;25;CPTokenFieldButtonTypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;183E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;184E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;174E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;185E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;186E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;187E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;188E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;3;105E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;189E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;190E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;191E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;192E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;108E;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;42E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;193E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;110E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;42E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;111E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;112E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;116E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;194E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;120E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;105E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;105E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;131E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;131E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;195E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;132E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;133E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;136E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;118E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;S;21;SheetWindowControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;15;_altCloseButtonS;19;_closableMaskButtonS;12;_closeButtonS;25;_miniaturizableMaskButtonS;22;_orderOutAfterCheckboxS;17;_otherCloseButtonS;20;_resizableMaskButtonS;17;_shadeContentViewS;18;_shadeParentWindowS;16;_shadeWindowViewS;17;_titledMaskButtonD;K;10;$classnameS;12;CPRadioGroupK;8;$classesA;S;12;CPRadioGroupS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;84E;K;21;CPRadioGroupRadiosKeyD;K;6;CP$UIDd;3;196E;K;28;CPRadioGroupSelectedRadioKeyD;K;6;CP$UIDd;3;198E;E;S;17;_windowTypeMatrixS;6;windowS;21;initialFirstResponderS;8;delegateS;20;takeDoubleValueFrom:S;14;newModalSheet:S;10;newWindow:S;9;newSheet:S;15;newModalWindow:S;14;newAlertSheet:S;11;newPopover:S;13;CPApplicationS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;23;{{71, 196}, {468, 455}}S;22;{{0, 0}, {2560, 1418}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {468, 455}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;69E;E;E;S;6;normalS;21;{{20, 17}, {138, 25}}S;19;{{0, 0}, {138, 25}}d;2;36S;6;buttonS;8;borderedd;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;115E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;199E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;200E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;121E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;121E;E;d;1;4S;0;F;d;2;14T;S;21;{{20, 49}, {138, 25}}S;12;Modal WindowS;21;{{20, 81}, {138, 25}}S;5;SheetS;22;{{20, 113}, {138, 25}}S;11;Modal SheetS;22;{{20, 145}, {138, 25}}S;11;Alert SheetS;23;{{193, 156}, {174, 21}}S;19;{{0, 0}, {174, 21}}S;9;check-boxS;8;selectedD;K;6;$classD;K;6;CP$UIDd;3;115E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;199E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;200E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;121E;E;d;1;1S;18;CPTitledWindowMaskS;23;{{193, 176}, {174, 21}}S;20;CPClosableWindowMaskS;23;{{192, 196}, {210, 21}}S;19;{{0, 0}, {210, 21}}S;26;CPMiniaturizableWindowMaskS;23;{{192, 216}, {180, 21}}S;19;{{0, 0}, {180, 21}}S;21;CPResizableWindowMaskS;22;{{18, 247}, {329, 21}}S;19;{{0, 0}, {329, 21}}S;25;orderOut: after endSheet:S;22;{{33, 274}, {362, 26}}S;19;{{0, 0}, {362, 26}}S;9;textfieldD;K;6;$classD;K;6;CP$UIDd;3;115E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;199E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;201E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;121E;E;S;140;It is not specified if endSheet: or orderOut: on sheet should be called first. However, cannot call orderOut: after endSheet: when chaining.D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;153E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;202E;E;S;22;{{18, 303}, {329, 21}}S;36;Shade Window View of Non-CIB WindowsS;22;{{18, 323}, {329, 21}}S;36;Shade Content View of Non-CIB WindowS;22;{{18, 343}, {329, 21}}S;44;Shade Parent Window on windowWillBeginSheet:S;22;{{20, 411}, {110, 25}}S;19;{{0, 0}, {110, 25}}d;1;9S;12;Chain SheetsS;22;{{387, 411}, {68, 25}}S;18;{{0, 0}, {68, 25}}S;5;CloseS;4;CgA=S;23;{{240, 411}, {135, 25}}S;19;{{0, 0}, {135, 25}}S;16;Close Parent TooS;23;{{162, 377}, {104, 29}}S;19;{{0, 0}, {104, 29}}d;2;45S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;3;153E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;203E;E;S;11;CPTextFieldS;23;{{271, 377}, {104, 29}}S;10;tokenfieldS;16;bezeled+editableD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;12;CPTokenFieldS;21;{{61, 381}, {92, 21}}S;18;{{0, 0}, {92, 21}}S;6;sliderD;K;6;$classD;K;6;CP$UIDd;3;115E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;204E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;195E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;119E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;119E;E;d;2;50d;2;68d;3;100S;23;{{193, 20}, {261, 136}}S;20;{{0, 0}, {261, 136}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;E;E;S;22;{{20, 178}, {138, 25}}S;7;Popoverd;2;12D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;198E;D;K;6;CP$UIDd;3;205E;D;K;6;CP$UIDd;3;206E;D;K;6;CP$UIDd;3;207E;D;K;6;CP$UIDd;3;208E;D;K;6;CP$UIDd;3;209E;E;E;D;K;10;$classnameS;7;CPRadioK;8;$classesA;S;7;CPRadioS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;197E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;135E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;210E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;211E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;214E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;135E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;215E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;216E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;217E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;85E;E;S;28;_CPFontSystemFacePlaceholderd;2;-1d;2;10D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;218E;D;K;6;CP$UIDd;3;135E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;135E;D;K;6;CP$UIDd;3;135E;E;E;S;9;HelveticaD;K;6;$classD;K;6;CP$UIDd;3;197E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;114E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;219E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;211E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;220E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;216E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;217E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;3;197E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;221E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;222E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;211E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;223E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;216E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;217E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;3;197E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;117E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;224E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;211E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;225E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;216E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;217E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;3;197E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;226E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;227E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;211E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;228E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;216E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;217E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;85E;E;D;K;6;$classD;K;6;CP$UIDd;3;197E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;68E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;229E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;210E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;68E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;211E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;212E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;213E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;113E;K;11;$aalignmentD;K;6;CP$UIDd;3;105E;K;20;$avertical-alignmentD;K;6;CP$UIDd;3;114E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;105E;K;6;$afontD;K;6;CP$UIDd;3;134E;K;16;$aimage-positionD;K;6;CP$UIDd;3;114E;K;15;$aimage-scalingD;K;6;CP$UIDd;3;114E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;117E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;230E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;119E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;135E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;135E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;121E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;114E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;105E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;3;216E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;3;217E;K;20;CPRadioRadioGroupKeyD;K;6;CP$UIDd;2;85E;E;S;19;{{0, 0}, {261, 21}}d;2;18D;K;6;$classD;K;6;CP$UIDd;3;153E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;231E;E;S;5;radioS;17;selected+borderedS;10;CIB Windowf;3;0.5f;4;0.05f;18;0.6862745098039216S;20;{{0, 23}, {261, 21}}S;25;CPHUDBackgroundWindowMaskd;1;3S;20;{{0, 46}, {261, 21}}S;22;CPBorderlessWindowMaskS;20;{{0, 69}, {261, 21}}S;30;CPTexturedBackgroundWindowMaskd;1;5S;20;{{0, 92}, {261, 21}}S;20;CPDocModalWindowMaskS;21;{{0, 115}, {261, 21}}S;14;CIB HUD WindowD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;E;E;E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/AttachedSheet2/Resources/Window.xib b/Tests/Manual/AttachedSheet2/Resources/Window.xib index 25ee97717..9bf735547 100644 --- a/Tests/Manual/AttachedSheet2/Resources/Window.xib +++ b/Tests/Manual/AttachedSheet2/Resources/Window.xib @@ -443,7 +443,7 @@ {{193, 278}, {174, 18}} - + _NS:9 YES @@ -810,6 +810,31 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NO 2 + + + 268 + {{14, 246}, {150, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Popover + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + {468, 455} @@ -991,6 +1016,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 223 + + + newPopover: + + + + 232 + initialFirstResponder @@ -1075,6 +1108,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + @@ -1400,6 +1434,19 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + 229 + + + + + + + + 230 + + + @@ -1451,7 +1498,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -1467,13 +1516,24 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - 228 + 232 SheetWindowController NSWindowController + + newPopover: + id + + + newPopover: + + newPopover: + id + + NSButton NSButton @@ -1487,7 +1547,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSButton NSButton NSButton - CPRadioGroup + NSMatrix @@ -1540,7 +1600,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA _windowTypeMatrix - CPRadioGroup + NSMatrix diff --git a/Tests/Manual/AttachedSheet2/SheetWindowController.j b/Tests/Manual/AttachedSheet2/SheetWindowController.j index 18d3f039c..298eefada 100644 --- a/Tests/Manual/AttachedSheet2/SheetWindowController.j +++ b/Tests/Manual/AttachedSheet2/SheetWindowController.j @@ -449,6 +449,28 @@ contextInfo:parentWindow]; } +// +// Test popover +// +- (@action)newPopover:(id)sender +{ + [[self allocController] runPopoverForWindow:[self window] withSender:sender]; +} + +- (void)runPopoverForWindow:(CPWindow)parentWindow withSender:(id)sender +{ + var aPopover = [CPPopover new], + viewController = [CPViewController new]; + + [aPopover setContentViewController:viewController]; + [[self window] close]; + [viewController setView:[[self window] contentView]]; + [aPopover setContentSize:[[[self window] contentView] boundsSize]]; + [aPopover setAnimates:YES]; + [aPopover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:CPMaxXEdge]; + [aPopover setBehavior:CPPopoverBehaviorTransient]; +} + // // Test notifications/delegate methods // From 6327d8c92e9f67956fe5b520f046f3472950b702 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Mon, 11 Mar 2013 13:14:18 +0000 Subject: [PATCH 027/145] Fixed: transient popovers broke modal windows. Without this fix, opening a transient popover would allow windows other than the modal window (or its children) to be interacted with. In general, setCallback:forNextEventMatchingMask: did not work right if more than 1 callback was installed. In the popover case the modal window would install its "any event" callback to control the event loop, but then the popover would add a second callback for mouse down to detect clicks outside of it. This would disrupt the modal event handling and allow mouse clicks (and presumably other events) to escape the modal event catcher. This fix makes multiple nextEvent callbacks work as one would expect, with later ones taking priority over older ones and reinserted callbacks remaining at a stable priority. This allows the modal window callback to be at the "bottom" of the handler stack and the popover event handler to be "on top" of that, and to remain that way. In theory more layers of event handling could be layered on top such as 2 simultaneous popovers. This fix also fixes the dequeue argument in forNextEvent callbacks. --- AppKit/CPApplication.j | 50 ++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index 01132ecd4..4ea496474 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -87,6 +87,7 @@ CPRunContinuesResponse = -1002; @implementation CPApplication : CPResponder { CPArray _eventListeners; + int _eventListenerInsertionIndex; CPEvent _currentEvent; CPWindow _lastMouseMoveWindow; @@ -144,6 +145,7 @@ CPRunContinuesResponse = -1002; if (self) { _eventListeners = []; + _eventListenerInsertionIndex = 0; _windows = [[CPNull null]]; } @@ -509,6 +511,8 @@ CPRunContinuesResponse = -1002; if (_eventListeners[count]._callback === _CPRunModalLoop) { _eventListeners.splice(count, 1); + if (count <= _eventListenerInsertionIndex) + _eventListenerInsertionIndex--; return; } @@ -625,25 +629,32 @@ CPRunContinuesResponse = -1002; _lastMouseMoveWindow = theWindow; } - if (_eventListeners.length) + /* + Event listeners are processed from back to front so that newer event listeners normally take + precedence. If during the execution of a callback a new event listener is added, it should + be inserted after the current callback but before any higher priority callbacks. This makes + repeating event listeners (those that reinsert themselves) stable relative to each other. + */ + for (var i = _eventListeners.length - 1; i >= 0; i--) { - var listener = _eventListeners[_eventListeners.length - 1]; + var listener = _eventListeners[i]; if (listener._mask & (1 << [anEvent type])) { - _eventListeners.pop(); + _eventListeners.splice(i, 1); + // In case the callback wants to add more listeners. + _eventListenerInsertionIndex = i; listener._callback(anEvent); - } - /* - FIXME: This does not match Cocoa documented behavior for the dequeue - flag. Cocoa says the event is dequeued only if it matches the mask. - Unfortunately event handling code in Cappuccino is depending - on an event being dequeued even if it does not match. - */ - if (listener._dequeue) - return; + if (listener._dequeue) + { + // Don't process the event normally and don't send it to any other listener. + _eventListenerInsertionIndex = _eventListeners.length; + return; + } + } } + _eventListenerInsertionIndex = _eventListeners.length; if (theWindow) [theWindow sendEvent:anEvent]; @@ -923,6 +934,12 @@ CPRunContinuesResponse = -1002; /*! Fires a callback function when an event matching a given mask occurs. + + If multiple callbacks are set which match the same event, later callbacks + take priority over earlier callbacks, unless a new callback is set while + an existing callback is being processed in which case it's given the same + priority as the currently processing callback. + @param aCallback A js function to be fired. @prarm aMask An event mask for the next event. @param anExpiration The date for which this callback expires (not implemented). @@ -932,13 +949,18 @@ CPRunContinuesResponse = -1002; */ - (void)setCallback:(Function)aCallback forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue { - _eventListeners.push(_CPEventListenerMake(aMask, aCallback, shouldDequeue)); + _eventListeners.splice(_eventListenerInsertionIndex++, 0, _CPEventListenerMake(aMask, aCallback, shouldDequeue)); } /*! Assigns a target and action for the next event matching a given event mask. The callback method called will be passed the CPEvent when it fires. + If multiple callbacks are set which match the same event, later callbacks + take priority over earlier callbacks, unless a new callback is set while + an existing callback is being processed in which case it's given the same + priority as the currently processing callback. + @param aTarget The target object for the callback. @param aSelector The selector which should be called on the target object. @param aMask The mask for a given event which should trigger the callback. @@ -949,7 +971,7 @@ CPRunContinuesResponse = -1002; */ - (void)setTarget:(id)aTarget selector:(SEL)aSelector forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue { - _eventListeners.push(_CPEventListenerMake(aMask, function (anEvent) { objj_msgSend(aTarget, aSelector, anEvent); }, shouldDequeue)); + _eventListeners.splice(_eventListenerInsertionIndex++, 0, _CPEventListenerMake(aMask, function (anEvent) { objj_msgSend(aTarget, aSelector, anEvent); }, shouldDequeue)); } /*! From b274c63395412a49a02baa9d9a38ed4ab0f121f0 Mon Sep 17 00:00:00 2001 From: Andrew Hankinson Date: Mon, 11 Mar 2013 10:01:46 -0400 Subject: [PATCH 028/145] CPTableView formatting Formatting, whitespace and typo correction. --- AppKit/CPTableView.j | 60 ++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index aac21e367..7e6c9645a 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -2319,10 +2319,8 @@ NOT YET IMPLEMENTED var heightObject = _cachedRowHeights[_cachedRowHeights.length - 1], height = heightObject.heightAboveRow + heightObject.height + _intercellSpacing.height; - } - if ([superview isKindOfClass:[CPClipView class]]) { var superviewSize = [superview bounds].size; @@ -2456,7 +2454,6 @@ NOT YET IMPLEMENTED @"width": [column width] }; - [columnsSetup addObject:metaData]; } @@ -2498,7 +2495,7 @@ NOT YET IMPLEMENTED Sets the delegate of the receiver. @param aDelegate the delegate object for the tableview. - The delegate can provide easy notification for user interaction, display behaviour, contextual menus, and more. + The delegate can provide notification for user interaction, display behaviour, contextual menus, and more. @section Providing Views for Rows and Columns: @@ -2520,7 +2517,7 @@ The view's properties should be properly set up before returning the result. The When using bindings, this method is optional if at least one identifier has been associated with the table view at design time. If this method is not implemented, the table will automatically call the CPTableView method makeViewWithIdentifier:owner: with the tableColumn parameter’s identifier and the table view’s delegate respectively as parameters, to attempt to reuse a previous view, or automatically unarchive a prototype associated with the table view. -The autoresizingMask of the returned view will automatically be set to CPViewNotSizable if the data view was created in Interface builder in a table column. Otherwise, for example if the view is created manually in code, this methods expects the data view to have a CPViewNotSizable mask. +The autoresizingMask of the returned view will automatically be set to CPViewNotSizable if the data view was created in Interface builder in a table column. Otherwise, for example if the view is created manually in code, this method expects the data view to have a CPViewNotSizable mask. @section displayingcells Displaying Cells: @@ -2536,8 +2533,6 @@ Group rows are a way to separate a groups of data in a tableview. Return YES if @endcode - - @section editingcells Editing Cells: Return YES if the dataview at a given index and column should be edited, otherwise NO. @@ -2546,9 +2541,6 @@ Return YES if the dataview at a given index and column should be edited, otherwi @endcode - - - @section sizes Setting Row and Column Size: Return the height of the row at a given index. Only implement this if you want variable row heights. Otherwise use setRowHeight: on the tableview. @@ -2557,8 +2549,6 @@ Return the height of the row at a given index. Only implement this if you want v @endcode - - @section selection Selecting in the TableView: @note These methods are only called when the user does something.@endnote @@ -2577,7 +2567,7 @@ Return YES if the table column given should be selected, otherwise NO to deny th - (BOOL)tableView:(CPTableView)aTableView shouldSelectTableColumn:(CPTableColumn)aTableColumn; @endcode -Inform the delegate that the tableview is in the process of chaining the selection. +Informs the delegate that the tableview is in the process of chaining the selection. This usually happens when the user is dragging their mouse across rows. @code - (void)tableViewSelectionIsChanging:(CPNotification)aNotification @@ -2589,10 +2579,7 @@ Informs the delegate that the tableview selection has changed. @endcode - - - -@section movingandresizingcolumsn Moving and Resizing Columns: +@section movingandresizingcolumns Moving and Resizing Columns: Return YES if the column at a given index should move to a new column index, otherwise NO. @code @@ -2600,13 +2587,13 @@ Return YES if the column at a given index should move to a new column index, oth @endcode -Notifies the delegate that the tableview drag occurred. This is send on mouse up. +Notifies the delegate that the tableview drag occurred. This is sent on mouse up. @code - (void)tableView:(CPTableView)tableView didDragTableColumn:(CPTableColumn)tableColumn; @endcode -Notifies the delegate that a tablecolumn was moved by the user. +Notifies the delegate that a table column was moved by the user. @code - (void)tableViewColumnDidMove:(CPNotification)aNotification; @endcode @@ -2617,8 +2604,6 @@ Notifies the delegate that the user resized the table column @endcode - - @section mousevents Responding to Mouse Events: Sent when the user clicks a table column but doesn't drag. @@ -2627,7 +2612,7 @@ Sent when the user clicks a table column but doesn't drag. @endcode -Notify the delegate that the user click the table header of a column. +Notify the delegate that the user has clicked the table header of a column. @code - (void)tableView:(CPTableView)tableView mouseDownInHeaderOfTableColumn:(CPTableColumn)tableColumn; @endcode @@ -2635,15 +2620,15 @@ Notify the delegate that the user click the table header of a column. @section contextualmenus Contextual Menus: -Called when the user right clicks on the tableview. -1 is passed for the row or column if the user doesn't right click on a real row or column -Return a CPMenu that should be displayed if the user right clicks. If you do not implement this the tableview will just call super on menuForEvent +Called when the user right-clicks on the tableview. -1 is passed for the row or column if the user doesn't right click on a real row or column +Return a CPMenu that should be displayed if the user right-clicks. If you do not implement this the tableview will call super on menuForEvent @code - (CPMenu)tableView:(CPTableView)aTableView menuForTableColumn:(CPTableColumn)aColumn row:(int)aRow; @endcode @section deletekey Delete Key -Called when the user presses the delete key. Many times you will want to delete data (or prompt for deletion) when the user hids the delete key. +Called when the user presses the delete key. Many times you will want to delete data (or prompt for deletion) when the user presses the delete key. Your delegate can implement this method to avoid subclassing the tableview to add this behaviour. @code @@ -3120,7 +3105,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad [[CPException exceptionWithName:@"Error" reason:reason userInfo:nil] raise]; } - _retargetedDropRow = row; _retargetedDropOperation = operation; } @@ -3307,7 +3291,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad // there are multiple views in the clip view? if ([superview isKindOfClass:[CPClipView class]]) _exposedRect = [superview bounds]; - else _exposedRect = [self bounds]; } @@ -3555,7 +3538,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (_contentBindingExpicitelySet) [self _prepareContentBindedDataView:aDataView forRow:aRow]; else - // For both cell-based and view-based + // For both cell-based and view-based [aTableColumn _prepareDataView:aDataView forRow:aRow]; } @@ -4374,7 +4357,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad else _selectionAnchorRow = row; - //set ivars for startTrackingPoint and time... _startTrackingPoint = aPoint; _startTrackingTimestamp = new Date(); @@ -4440,7 +4422,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad else _draggedRowIndexes = [CPIndexSet indexSetWithIndex:row]; - //ask the datasource for the data var pboard = [CPPasteboard pasteboardWithName:CPDragPboard]; @@ -4647,7 +4628,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad var row = [self _proposedRowAtPoint:theDragPoint], rowRect = [self rectOfRow:row]; - // If there is no (the default) or to little inter cell spacing we create some room for the CPTableViewDropAbove indicator + // If there is no (the default) or too little inter-cell spacing we create some room for the CPTableViewDropAbove indicator // This probably doesn't work if the row height is smaller than or around 5.0 if ([self intercellSpacing].height < 5.0) rowRect = CGRectInset(rowRect, 0.0, 5.0 - [self intercellSpacing].height); @@ -4667,7 +4648,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (CPInteger)_proposedRowAtPoint:(CGPoint)dragPoint { var row = [self rowAtPoint:dragPoint], - // Determine if the mouse is currently closer to this row or the row below it + // Determine if the mouse is currently closer to this row or the row below it lowerRow = row + 1, rect = [self rectOfRow:row], bottomPoint = _CGRectGetMaxY(rect), @@ -4766,7 +4747,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (BOOL)prepareForDragOperation:(id)sender { // FIX ME: is there anything else that needs to happen here? - // actual validation is called in dragginUpdated: + // actual validation is called in draggingUpdated: [_dropOperationFeedbackView removeFromSuperview]; return (_implementedDataSourceMethods & CPTableViewDataSource_tableView_validateDrop_proposedRow_proposedDropOperation_); @@ -5003,7 +4984,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (void)_textFieldEditingDidEnd:(CPNotification)aNote { -// FIXME: When you edit a text field and hit enter without any text mofification, the CPControlTextDidEndEditingNotification is NOT sent. This is a bug in CPTextField or CPControl according to cocoa. + // FIXME: When you edit a text field and hit enter without any text modification, the CPControlTextDidEndEditingNotification + // is NOT sent. This is a bug in CPTextField or CPControl according to cocoa. var textField = [aNote object]; [self _unregisterForEndEditingNote:textField]; @@ -5016,7 +4998,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad - (SEL)_disableActionIfExists:(CPView)aView { -// TODO: We disable action to prevent it from beeing sent twice when we resign the FR inside a textEndEditing notification. Check if this is due to a bug in CPTextField. + // TODO: We disable action to prevent it from beeing sent twice when we resign the FR inside a textEndEditing notification. + // Check if this is due to a bug in CPTextField. var action = nil; if ([aView respondsToSelector:@selector(action)] && (action = [aView action])) [aView setAction:nil]; @@ -5111,7 +5094,6 @@ Your delegate can implement this method to avoid subclassing the tableview to ad if (i >= [self numberOfRows] || i < 0) return; - if (_implementedDelegateMethods & CPTableViewDelegate_tableView_shouldSelectRow_) { @@ -5165,6 +5147,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad @end + @implementation CPTableView (Bindings) + (id)_binderClassForBinding:(CPString)aBinding @@ -5218,6 +5201,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad @end + @implementation CPTableContentBinder : CPBinder { id _content @accessors(property=content); @@ -5235,6 +5219,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad @end + var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", CPTableViewDelegateKey = @"CPTableViewDelegateKey", CPTableViewHeaderViewKey = @"CPTableViewHeaderViewKey", @@ -5351,6 +5336,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", @end + @implementation CPIndexSet (tableview) - (void)removeMatches:(CPIndexSet)otherSet @@ -5481,6 +5467,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", @end + @implementation _CPColumnDragView : CPView { CPColor _lineColor; @@ -5519,6 +5506,7 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", @end + @implementation CPTableCellView : CPView { id _objectValue @accessors(property=objectValue); From a98def4326f5bc74d0d73bad25753029f5fac03e Mon Sep 17 00:00:00 2001 From: cacaodev Date: Fri, 8 Mar 2013 14:47:08 +0100 Subject: [PATCH 029/145] Added doc for -setItemPrototype: explaining how to setup the item prototype when you want to use bindings for the view. --- AppKit/CPCollectionView.j | 73 +++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index caa414c96..f29571de2 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#import "../Foundation/CPRange.h" -#import "../Foundation/Ref.h" +//#import "../Foundation/CPRange.h" +//#import "../Foundation/Ref.h" @import @import @@ -35,7 +35,7 @@ @import "CPPasteboard.j" @import "CPView.j" -@class CPClipView +//@class CPClipView /*! @@ -176,50 +176,47 @@ var HORIZONTAL_MARGIN = 2; /*! Sets the item prototype to \c anItem + @param anItem the new item prototype. - The item prototype should implement the CPCoding protocol - because the item is copied by archiving and unarchiving the - prototypal view. + @note + - If anItem is located in an external cib file, representedObject, outlets, and bindings will be automatically restored when an item is created. + - If anItem and its view belong to the same cib as the collection view, the item prototype should implement the CPCoding protocol because the item is copied by archiving and unarchiving the prototypal view. + @note + Bindings won't be restored through archiving, instead you need to subclass the -representedObject: method and update the view there. - Example: + @par Example: -
-      @implement MyCustomView : CPCollectionViewItem
-      {
-          CPArray   items   @accessors;
-      }
+@code
+@implementation MyCustomPrototypeItem: CPCollectionViewItem
+{
+    @outlet CPTextField textField;
+}
 
-      - (id)initWithFrame:(CGRect)aFrame
-      {
-        self = [super initWithFrame:aFrame];
-        if (self)
-        {
-          items = [];
-        }
-        return self;
-      }
+- (id)initWithCoder:(CPCoder)aCoder
+{
+    self = [super initWithCoder:aCoder];
 
-      - (id)initWithCoder:(CPCoder)aCoder
-      {
-        self = [super initWithCoder:aCoder];
-        items = [aCoder decodeObjectForKey:@"KEY"];
-        return self;
-      }
+    textField = [aCoder decodeObjectForKey:@"TextField"];
 
-      - (void)encodeWithCoder:(CPCoder)aCoder
-      {
-        [aCoder encodeObject:items forKey:@"KEY"];
-        [super encodeWithCoder:aCoder];
-      }
+    return self;
+}
 
-      @end
-    
+- (void)encodeWithCoder:(CPCoder)aCoder +{ + [super encodeWithCoder:aCoder]; + [aCoder encodeConditionalObject:textField forKey:@"TextField"]; +} - This will allow the collection view to create multiple 'clean' copies - of the item prototype which will maintain the original values for item - and all of the properties archived by the super class. +- (void)setRepresentedObject:(id)anObject +{ + [super setRepresentedObject:anObject]; + [textField setStringValue:[anObject objectForKey:@"value"]]; + [[self view] setColor:[anObject objectForKey:@"color"]]; +} + +@end +@endcode - @param anItem the new item prototype */ - (void)setItemPrototype:(CPCollectionViewItem)anItem { From 0e4f5e9203317366d1a6c6370be7458ef783bce5 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Mon, 11 Mar 2013 17:14:00 +0100 Subject: [PATCH 030/145] Uncomment import --- AppKit/CPCollectionView.j | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index f29571de2..1f382515b 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -//#import "../Foundation/CPRange.h" -//#import "../Foundation/Ref.h" +#import "../Foundation/CPRange.h" @import @import From 59b766eb9351f21107cc2a1a698f2a64a90e43c8 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Mon, 11 Mar 2013 16:41:06 +0000 Subject: [PATCH 031/145] Fixed: token field autocomplete menu not receiving mouse events in presence of modal window. Without this fix, the presence of a modal ancestor window to a token field would lock down the autocomplete menu from mouse interaction. This fix ensures the token field autocomplete menu accepts mouse events even during the presence of modal widows, just like other auxiliary windows such as pop up menus. --- AppKit/_CPAutocompleteMenu.j | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/AppKit/_CPAutocompleteMenu.j b/AppKit/_CPAutocompleteMenu.j index ebd174944..ed9b4a8bc 100644 --- a/AppKit/_CPAutocompleteMenu.j +++ b/AppKit/_CPAutocompleteMenu.j @@ -275,6 +275,12 @@ var _CPAutocompleteMenuMaximumHeight = 307; return YES; } +- (BOOL)worksWhenModal +{ + // Windows which serve as auxiliary controls should work when modal. + return YES; +} + @end @implementation _CPNonFirstResponderTableView : CPTableView From 0d168a45189b9feb8b02bacf9c23c659f0adc665 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Mon, 11 Mar 2013 17:52:21 +0100 Subject: [PATCH 032/145] Remove //@class CPClipView --- AppKit/CPCollectionView.j | 3 --- 1 file changed, 3 deletions(-) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index 1f382515b..ba9e61d17 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -34,9 +34,6 @@ @import "CPPasteboard.j" @import "CPView.j" -//@class CPClipView - - /*! @ingroup appkit @class CPCollectionView From 5f086b11b837793ab3466ef71b7672771bd7a0c3 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Mon, 11 Mar 2013 17:40:11 +0000 Subject: [PATCH 033/145] Fixed: platform windows resizable. Without this fix, a platform window could be resized by clicking just under the menu bar and dragging downwards, even that platform windows are supposed to be the size of the browser window by definition. --- AppKit/CPWindow/_CPWindowView.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppKit/CPWindow/_CPWindowView.j b/AppKit/CPWindow/_CPWindowView.j index 9b49f8624..805d8c885 100644 --- a/AppKit/CPWindow/_CPWindowView.j +++ b/AppKit/CPWindow/_CPWindowView.j @@ -178,7 +178,7 @@ _CPWindowViewResizeSlop = 3; - (void)mouseDown:(CPEvent)anEvent { var theWindow = [self window], - couldResize = _styleMask & CPResizableWindowMask; + couldResize = _styleMask & CPResizableWindowMask && ![theWindow isFullPlatformWindow]; couldResize = couldResize && ( (CPWindowResizeStyle === CPWindowResizeStyleModern) || From 26213491a39f5f5837ed0d54d671e6afebed8425 Mon Sep 17 00:00:00 2001 From: Antoine Mercadal Date: Mon, 11 Mar 2013 13:01:22 -0700 Subject: [PATCH 034/145] Revert "don't allow views from another window to be next/previouskeyViews" This reverts commit 7fab8d9782d4604c4441e48701f9207e4a2b4229. This breaks the repsonder chain if it is defined in a view that has no window yet. Details and reduction here: https://github.com/cappuccino/cappuccino/commit/7fab8d9782d4604c4441e48701f9207e4a2b4229#commitcomment-2781849 --- AppKit/CPView.j | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 2827158ab..49e0e4aea 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -2557,7 +2557,7 @@ setBoundsOrigin: - (void)_setPreviousKeyView:(CPView)previous { - if ([previous isEqual:self] || ![[previous window] isEqual:[self window]]) + if ([previous isEqual:self]) _previousKeyView = nil; else _previousKeyView = previous; @@ -2565,7 +2565,7 @@ setBoundsOrigin: - (void)setNextKeyView:(CPView)next { - if ([next isEqual:self] || ![[next window] isEqual:[self window]]) + if ([next isEqual:self]) _nextKeyView = nil; else { From a549c191da02e732afc560d9b4f45c8c82b29423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Wallstro=CC=88m?= Date: Mon, 11 Mar 2013 21:09:22 +0100 Subject: [PATCH 035/145] lint --- AppKit/CPCollectionView.j | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AppKit/CPCollectionView.j b/AppKit/CPCollectionView.j index 98a2ea69b..58f39bd1f 100644 --- a/AppKit/CPCollectionView.j +++ b/AppKit/CPCollectionView.j @@ -1218,8 +1218,10 @@ Not supported. Use -collectionView:dataForItemsAtIndexes:fortype: - (void)_modifySelectionWithNewIndex:(int)anIndex direction:(int)aDirection expand:(BOOL)shouldExpand { var count = [[self items] count]; + if (count === 0) return; + anIndex = MIN(MAX(anIndex, 0), count - 1); if (_allowsMultipleSelection && shouldExpand) From 2dca00c4a039f5d844d6d0487fa7c7fd8754369b Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Mon, 11 Mar 2013 00:29:05 -0400 Subject: [PATCH 036/145] Fixed: sheets should not be resizable from the top Previously, sheets could be resized from the top, which would destroy the illusion of being attached to the top of the parent window. With this commit, sheets are prevented from being resized by the user from the top edge. --- AppKit/CPWindow/_CPWindowView.j | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/AppKit/CPWindow/_CPWindowView.j b/AppKit/CPWindow/_CPWindowView.j index 9b49f8624..5d837516e 100644 --- a/AppKit/CPWindow/_CPWindowView.j +++ b/AppKit/CPWindow/_CPWindowView.j @@ -245,6 +245,8 @@ _CPWindowViewResizeSlop = 3; rects are the same size. So to save calculations, we can just create 3 rects and move them around to do hit testing. Start with the corners and then do left/right and top/bottom. + + NOTE: If the window is a sheet, the top is never eligible for resizing. */ var wind = [self window], frame = [wind frame], @@ -252,7 +254,8 @@ _CPWindowViewResizeSlop = 3; minSize = [wind minSize], maxSize = [wind maxSize], isFixedWidth = minSize.width === maxSize.width, - isFixedHeight = minSize.height === maxSize.height; + isFixedHeight = minSize.height === maxSize.height, + isSheet = wind._isSheet; if (isFixedWidth) { @@ -262,7 +265,7 @@ _CPWindowViewResizeSlop = 3; _CPWindowViewResizeSlop * 2); if (_CGRectContainsPoint(rect, aPoint)) - return _CPWindowViewResizeRegionTop; + return isSheet ? _CPWindowViewResizeRegionNone : _CPWindowViewResizeRegionTop; rect.origin.y = _CGRectGetMaxY(frame) - _CPWindowViewResizeSlop; @@ -292,12 +295,12 @@ _CPWindowViewResizeSlop = 3; _CPWindowViewCornerResizeRectWidth + _CPWindowViewResizeSlop); if (_CGRectContainsPoint(rect, aPoint)) - return _CPWindowViewResizeRegionTopLeft; + return isSheet ? _CPWindowViewResizeRegionNone : _CPWindowViewResizeRegionTopLeft; rect.origin.x = _CGRectGetMaxX(frame) - _CPWindowViewCornerResizeRectWidth; if (_CGRectContainsPoint(rect, aPoint)) - return _CPWindowViewResizeRegionTopRight; + return isSheet ? _CPWindowViewResizeRegionNone : _CPWindowViewResizeRegionTopRight; rect.origin.y = _CGRectGetMaxY(frame) - _CPWindowViewCornerResizeRectWidth; @@ -328,7 +331,7 @@ _CPWindowViewResizeSlop = 3; _CPWindowViewResizeSlop * 2); if (_CGRectContainsPoint(rect, aPoint)) - return _CPWindowViewResizeRegionTop; + return isSheet ? _CPWindowViewResizeRegionNone : _CPWindowViewResizeRegionTop; rect.origin.y = _CGRectGetMaxY(frame) - _CPWindowViewResizeSlop; From f208ff52fde6645574d863cf32c6d38bd21f5467 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Mon, 11 Mar 2013 00:48:03 -0400 Subject: [PATCH 037/145] Fixed: attached sheet shadow had extra width, was too dark Previously the attached sheet shadow (that appears below the title bar of the window a sheet is attached to) was 9x8, and it was quite dark. With this commit the width has been reduced to 1 (to reduce the image size) and it has been lightened up. Also changed "height-shadow" theme attribute to "shadow-height". --- AppKit/CPWindow/_CPDocModalWindowView.j | 6 +++--- .../Resources/window-attached-sheet-shadow.png | Bin 106 -> 616 bytes AppKit/Themes/Aristo/ThemeDescriptors.j | 10 +++++----- .../Artwork/window-attached-sheet-shadow.psd | Bin 0 -> 20078 bytes .../Resources/window-attached-sheet-shadow.png | Bin 106 -> 616 bytes AppKit/Themes/Aristo2/ThemeDescriptors.j | 11 +++-------- 6 files changed, 11 insertions(+), 16 deletions(-) create mode 100644 AppKit/Themes/Aristo2/Artwork/window-attached-sheet-shadow.psd diff --git a/AppKit/CPWindow/_CPDocModalWindowView.j b/AppKit/CPWindow/_CPDocModalWindowView.j index 5a420b986..186af01fa 100644 --- a/AppKit/CPWindow/_CPDocModalWindowView.j +++ b/AppKit/CPWindow/_CPDocModalWindowView.j @@ -38,7 +38,7 @@ { return @{ @"body-color": [CPColor whiteColor], - @"height-shadow": 8, + @"shadow-height": 8, }; } @@ -68,7 +68,7 @@ [self addSubview:_bodyView]; - _shadowView = [[CPView alloc] initWithFrame:CGRectMake(0, 0, _CGRectGetWidth(bounds), [self valueForThemeAttribute:@"height-shadow"])]; + _shadowView = [[CPView alloc] initWithFrame:CGRectMake(0, 0, _CGRectGetWidth(bounds), [self valueForThemeAttribute:@"shadow-height"])]; [_shadowView setAutoresizingMask:CPViewWidthSizable]; [self addSubview:_shadowView]; } @@ -99,7 +99,7 @@ [_bodyView setBackgroundColor:[self valueForThemeAttribute:@"body-color"]]; - [_shadowView setFrame:CGRectMake(0,0, _CGRectGetWidth(bounds), [self valueForThemeAttribute:@"height-shadow"])]; + [_shadowView setFrame:CGRectMake(0, 0, _CGRectGetWidth(bounds), [self valueForThemeAttribute:@"shadow-height"])]; [_shadowView setBackgroundColor:[self valueForThemeAttribute:@"attached-sheet-shadow-color"]]; } diff --git a/AppKit/Themes/Aristo/Resources/window-attached-sheet-shadow.png b/AppKit/Themes/Aristo/Resources/window-attached-sheet-shadow.png index b39cae110a6c09f758fd59b5c678add45437af14..eeab7d517030c9ef1937992a0d6e1bbd443eac15 100644 GIT binary patch literal 616 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 Uhv)w``_{3>O@Wges>{ef0RY>PYybcN literal 0 HcmV?d00001 diff --git a/AppKit/Themes/Aristo2/Resources/window-attached-sheet-shadow.png b/AppKit/Themes/Aristo2/Resources/window-attached-sheet-shadow.png index b39cae110a6c09f758fd59b5c678add45437af14..eeab7d517030c9ef1937992a0d6e1bbd443eac15 100644 GIT binary patch literal 616 zcmV-u0+;=XP){nC#h2S^W_HwvQFXGu*7AXiM9NEFyi5Gx8#Qn zPilDc5nT7IZ`wxK3iQoZb*xWeRqK^tP9Dq%f+NIkQaBqPz_;=qWZDQ2deaHVgaArC z5`>hJ55UL7N7!9DApr|1^CNIN&_y%#BU|LfDVEbxxVE-s2<`WKZ$I_4c|s&flEH`X zPaI;>Ju6%F6V+Xf9&*ufBU>xA0)t+y^vOvIQ}q` zZ)EWA%71a||M@lKl0kos%V=^lIEd%rcglHvgmOD$+;Y4E;K2p$?v$L60000ZNkloLeXW0000 Date: Mon, 11 Mar 2013 00:58:58 -0400 Subject: [PATCH 038/145] Fixed: sheet animation was resizing the sheet to zero, causing problems Previously sheet animation was performed by sizing the sheet from zero to full height when animating in, and then back to zero height when animating out. This caused problems with the resize algorithms, which are not designed to deal with sizing from zero. Analyzing Cocoa behavior revealed that sheets slide in and out with no resizing. With this commit, a general purpose mechanism for clipping a window to a rect was added to CPDOMWindowLayer. Clipping was put in CPDOMWindowLayer because that is the class that deals with windows at the global level. CPWindow uses the clipping mechanism to slide the sheet in and out, thus avoiding all resizing problems. Fixes #1840 --- AppKit/CPWindow/CPWindow.j | 114 ++++++++++--------------- AppKit/Platform/DOM/CPDOMWindowLayer.j | 63 ++++++++++++++ 2 files changed, 108 insertions(+), 69 deletions(-) diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index c1f8a677e..fae5232eb 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -1169,7 +1169,7 @@ CPTexturedBackgroundWindowMask if (_hasShadow && !_shadowView) { - _shadowView = [[_CPShadowWindowView alloc] initWithFrame:CGRectMakeZero()]; + _shadowView = [[_CPShadowWindowView alloc] initWithFrame:CGRectMakeZero()]; [_shadowView setWindowView:_windowView]; [_shadowView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; @@ -2473,7 +2473,6 @@ CPTexturedBackgroundWindowMask return CPWindowResizeTime; } -/* @ignore */ - (void)_setAttachedSheetFrameOrigin { // Position the sheet above the contentRect. @@ -2487,7 +2486,7 @@ CPTexturedBackgroundWindowMask [attachedSheet setFrame:sheetFrame display:YES animate:NO]; } -/* @ignore +/* Starting point for sheet session, called from CPApplication beginSheet: */ - (void)_attachSheet:(CPWindow)aSheet modalDelegate:(id)aModalDelegate @@ -2503,13 +2502,13 @@ CPTexturedBackgroundWindowMask var sheetFrame = [aSheet frame]; _sheetContext = {"sheet": aSheet, "modalDelegate": aModalDelegate, "endSelector": aDidEndSelector, - "contextInfo": aContextInfo, "frame": _CGRectMakeCopy(sheetFrame), "returnCode": -1, + "contextInfo": aContextInfo, "returnCode": -1, "opened": NO}; [self _attachSheetWindow]; } -/* @ignore +/* Called to animate the sheet in. The timer seems to solve a bug where sheets would be partially animated under certain conditions. */ @@ -2525,7 +2524,7 @@ CPTexturedBackgroundWindowMask repeats:NO]; } -/* @ignore +/* Called to end the sheet. Note that orderOut: is needed to animate the sheet out, as in Cocoa. The sheet isn't completely gone until _cleanupSheetWindow gets called. */ @@ -2546,7 +2545,7 @@ CPTexturedBackgroundWindowMask } } -/* @ignore +/* Called to animate the sheet out. If called while animating in, schedules an animate out at completion */ @@ -2562,26 +2561,24 @@ CPTexturedBackgroundWindowMask repeats:NO]; } -/* @ignore +/* Called to cleanup sheet, when we are definitely done with it */ - (void)_cleanupSheetWindow { var sheet = _sheetContext["sheet"], - lastFrame = _sheetContext["frame"], deferDidEnd = _sheetContext["deferDidEndSelector"]; - [sheet setFrame:lastFrame]; - [self _restoreMasksForView:[sheet contentView]]; - - // if the parent window is modal, the sheet started its own modal session + // If the parent window is modal, the sheet started its own modal session if (sheet._isModal) [CPApp stopModal]; - // restore the state of window before it was sheetified + [self _removeClipForSheet:sheet]; + + // Restore the state of window before it was sheetified [sheet._windowView _enableSheet:NO]; - // close it + // Close it sheet._isSheet = NO; [sheet orderOut:self]; @@ -2594,7 +2591,7 @@ CPTexturedBackgroundWindowMask returnCode = _sheetContext["returnCode"], contextInfo = _sheetContext["contextInfo"]; - // context must be destroyed, since didEnd might want to attach another sheet + // Context must be destroyed, since didEnd might want to attach another sheet _sheetContext = nil; sheet._parentView = nil; @@ -2622,31 +2619,20 @@ CPTexturedBackgroundWindowMask repeats:NO]; } -/* @ignore */ - (void)_sheetShouldAnimateIn:(CPTimer)timer { - // can't open sheet while opening or closing animation is going on + // Can't open sheet while opening or closing animation is going on if (_sheetContext["isOpening"] || _sheetContext["isClosing"]) return; - var sheet = _sheetContext["sheet"], - sheetFrame = [sheet frame], - frame = [self frame]; - - [self _setUpMasksForView:[sheet contentView]]; - + var sheet = _sheetContext["sheet"]; sheet._isSheet = YES; sheet._parentView = self; - var originx = frame.origin.x + FLOOR((frame.size.width - sheetFrame.size.width) / 2), - originy = frame.origin.y + [_contentView frame].origin.y, - startFrame = _CGRectMake(originx, originy, sheetFrame.size.width, 0), - endFrame = _CGRectMake(originx, originy, sheetFrame.size.width, sheetFrame.size.height); - [[CPNotificationCenter defaultCenter] postNotificationName:CPWindowWillBeginSheetNotification object:self]; - // if sheet is attached to a modal window, the sheet runs + // If sheet is attached to a modal window, the sheet runs // as if itself and the parent window are modal sheet._isModal = NO; @@ -2656,7 +2642,17 @@ CPTexturedBackgroundWindowMask sheet._isModal = YES; } + // The sheet starts hidden just above the top of a clip rect + var sheetFrame = [sheet frame], + sheetShadowFrame = sheet._hasShadow ? [sheet._shadowView frame] : sheetFrame, + frame = [self frame], + originX = frame.origin.x + FLOOR((frame.size.width - sheetFrame.size.width) / 2), + startFrame = _CGRectMake(originX, -sheetShadowFrame.size.height, sheetFrame.size.width, sheetFrame.size.height), + endFrame = _CGRectMake(originX, 0, sheetFrame.size.width, sheetFrame.size.height); + [sheet orderFront:self]; + + [self _clipSheet:sheet]; [sheet setFrame:startFrame display:YES animate:NO]; _sheetContext["opened"] = YES; @@ -2671,16 +2667,11 @@ CPTexturedBackgroundWindowMask [sheet makeKeyWindow]; } -/* @ignore */ - (void)_sheetShouldAnimateOut:(CPTimer)timer { - var sheet = _sheetContext["sheet"], - startFrame = [sheet frame], - endFrame = _CGRectMakeCopy(startFrame); - if (_sheetContext["isOpening"]) { - // allow sheet to be closed while opening, it will close when animate in completes + // Allow sheet to be closed while opening, it will close when animate in completes _sheetContext["shouldClose"] = YES; return; } @@ -2689,14 +2680,20 @@ CPTexturedBackgroundWindowMask return; _sheetContext["opened"] = NO; - _sheetContext["frame"] = startFrame; _sheetContext["isClosing"] = YES; - // the parent window can be orderedOut to disable the sheet animate out, as in Cocoa + // The parent window can be orderedOut to disable the sheet animate out, as in Cocoa if ([self isVisible]) { - endFrame.size.height = 0; - [self _setUpMasksForView:[sheet contentView]]; + var sheet = _sheetContext["sheet"], + sheetFrame = [sheet frame], + fullHeight = sheet._hasShadow ? [sheet._shadowView frame].size.height : sheetFrame.size.height, + endFrame = _CGRectMakeCopy(sheetFrame); + + [sheet setFrameOrigin:_CGPointMake(sheetFrame.origin.x, 0)]; + [self _clipSheet:sheet]; + + endFrame.origin.y = -fullHeight; [sheet _setFrame:endFrame delegate:self duration:[self animationResizeTime:endFrame] curve:CPAnimationEaseIn]; } else @@ -2705,7 +2702,6 @@ CPTexturedBackgroundWindowMask } } -/* @ignore */ - (void)_sheetAnimationDidEnd:(CPTimer)timer { var sheet = _sheetContext["sheet"]; @@ -2715,12 +2711,11 @@ CPTexturedBackgroundWindowMask if (_sheetContext["opened"] === YES) { - // sheet is open and completely visible - [self _restoreMasksForView:[sheet contentView]]; - // we wanted to close the sheet while it animated in, do that now if (_sheetContext["shouldClose"] === YES) [self _detachSheetWindow]; + else + [self _removeClipForSheet:sheet]; } else { @@ -2729,36 +2724,17 @@ CPTexturedBackgroundWindowMask } } -- (void)_setUpMasksForView:(CPView)aView +- (void)_clipSheet:(CPWindow)aSheet { - var views = [aView subviews]; + var clipRect = [_platformWindow contentBounds]; + clipRect.origin.y = [self frame].origin.y + [[self contentView] frame].origin.y; - [views addObject:aView]; - - for (var i = 0, count = [views count]; i < count; i++) - { - var view = [views objectAtIndex:i], - mask = [view autoresizingMask], - maskToAdd = (mask & CPViewMinYMargin) ? 128 : CPViewMinYMargin; - - [view setAutoresizingMask:(mask | maskToAdd)]; - } + [[_platformWindow layerAtLevel:_level create:NO] clipWindow:aSheet toRect:clipRect]; } -- (void)_restoreMasksForView:(CPView)aView +- (void)_removeClipForSheet:(CPWindow)aSheet { - var views = [aView subviews]; - - [views addObject:aView]; - - for (var i = 0, count = [views count]; i < count; i++) - { - var view = [views objectAtIndex:i], - mask = [view autoresizingMask], - maskToRemove = (mask & 128) ? 128 : CPViewMinYMargin; - - [view setAutoresizingMask:(mask & (~ maskToRemove))]; - } + [[_platformWindow layerAtLevel:_level create:NO] removeClipForWindow:aSheet]; } /*! diff --git a/AppKit/Platform/DOM/CPDOMWindowLayer.j b/AppKit/Platform/DOM/CPDOMWindowLayer.j index 926074a3d..4336d60c8 100644 --- a/AppKit/Platform/DOM/CPDOMWindowLayer.j +++ b/AppKit/Platform/DOM/CPDOMWindowLayer.j @@ -130,4 +130,67 @@ return _windows; } +/*! + Places \c aWindow within an element that clips it to the global rect \c clipRect. + + NOTE: This is only meant for temporary usage during animation and should be balanced + with a call to removeClipForWindow:. No attempt is made to make the clipping element follow + changes to the window. +*/ +- (void)clipWindow:(CPWindow)aWindow toRect:(CGRect)clipRect +{ + // First check to see if the window is already clipped. + // If so, just update its rect. + var windowElement = aWindow._DOMElement, + clip = windowElement.parentNode, + style = clip.style, + isClipped = style.className === "cpwindowclip"; + + if (!isClipped) + { + clip = document.createElement("div"); + + style = clip.style; + style.className = "cpwindowclip"; + style.position = "absolute"; + style.overflow = "hidden"; + } + + style.left = clipRect.origin.x + "px"; + style.top = clipRect.origin.y + "px"; + style.width = clipRect.size.width + "px"; + style.height = clipRect.size.height + "px"; + + if (!isClipped) + { + // Replace the window with the clip element, then put it inside the clip + var parent = windowElement.parentNode; + CPDOMDisplayServerInsertBefore(parent, clip, windowElement); + CPDOMDisplayServerRemoveChild(parent, windowElement); + CPDOMDisplayServerAppendChild(clip, windowElement); + } +} + +/*! + Unclips a window that was previously clipped with clipWindow:toWindow:. + If the window was not clipped, a warning is logged. +*/ +- (void)removeClipForWindow:(CPWindow)aWindow +{ + var windowElement = aWindow._DOMElement, + clip = windowElement.parentNode; + + if (clip.style.className === "cpwindowclip") + { + var parent = clip.parentNode; + + CPDOMDisplayServerRemoveChild(clip, windowElement); + [aWindow setFrameOrigin:_CGPointMake([aWindow frame].origin.x, clip.offsetTop)]; + CPDOMDisplayServerInsertBefore(parent, windowElement, clip); + CPDOMDisplayServerRemoveChild(parent, clip); + } + else + CPLog.warn("%s %s was not previously clipped via clipWindow:toWindow:", _cmd, [aWindow description]); +} + @end From 3af2314a70d63d3643fe2843717b50e1a22ef4f9 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Tue, 12 Mar 2013 00:36:19 -0400 Subject: [PATCH 039/145] Fixed: sheet resizing displayed incorrectly Previously, when a sheet was resized, there were a number of problems: - Sheets in Cocoa resize their width symmetrically, such that they always remain centered. This was not happening in Cappuccino. - When a sheet is resized wider than its parent window, the shadow at the top of the sheet was growing wider than the bounds of the parent window's title bar, which makes no sense since the shadow is supposed to be cast by the title bar. - Sheets had no top border, so when they were resized wider than the parent window, the top edge looked like it was cut off. In Cocoa, sheets have a top border that sits under the title bar of the parent window, and which is visible when the sheet is resized wider than the parent window. This commit addresses these problems as follows: - Sheet width is now resized symmetrically. - Sheet resizing is pinned to the screen bounds. - The top sheet shadow is pinned to the width of the parent window's content view. - Sheets now have a top border. In addition to these changes, a redundant sheet top shadow was eliminated from one of the _CPWindowView subclasses. Fixes #1846 --- AppKit/CPApplication.j | 2 +- AppKit/CPWindow/CPWindow.j | 22 ++- AppKit/CPWindow/_CPDocModalWindowView.j | 20 +-- AppKit/CPWindow/_CPHUDWindowView.j | 6 +- AppKit/CPWindow/_CPStandardWindowView.j | 45 +++--- AppKit/CPWindow/_CPTitleableWindowView.j | 5 + AppKit/CPWindow/_CPWindowView.j | 130 ++++++++++++++---- AppKit/Platform/DOM/CPDOMWindowLayer.j | 49 +++---- AppKit/Themes/Aristo/ThemeDescriptors.j | 9 +- .../Aristo2/Artwork/Aristo 11-06-07.psd | Bin 5295141 -> 5174036 bytes .../window-standard-bottom-center.png | Bin 75 -> 616 bytes .../Resources/window-standard-bottom-left.png | Bin 114 -> 649 bytes .../window-standard-bottom-right.png | Bin 114 -> 650 bytes .../window-standard-center-center.png | Bin 82 -> 607 bytes .../Resources/window-standard-center-left.png | Bin 76 -> 611 bytes .../window-standard-center-right.png | Bin 76 -> 611 bytes .../Resources/window-standard-top-left.png | Bin 79 -> 617 bytes .../Resources/window-standard-top-right.png | Bin 79 -> 621 bytes AppKit/Themes/Aristo2/ThemeDescriptors.j | 4 +- Tests/Manual/AttachedSheet/AppController.j | 3 +- 20 files changed, 187 insertions(+), 108 deletions(-) diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index 01132ecd4..8f2c32b00 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -978,7 +978,7 @@ CPRunContinuesResponse = -1002; return; } - [aSheet._windowView _enableSheet:YES]; + [aSheet._windowView _enableSheet:YES inWindow:aWindow]; // -dw- if a sheet is already visible, we skip this since it serves no purpose and causes // orderOut: to be called on the sheet, which is not what we want. diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index fae5232eb..bd127364b 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -2576,10 +2576,10 @@ CPTexturedBackgroundWindowMask [self _removeClipForSheet:sheet]; // Restore the state of window before it was sheetified - [sheet._windowView _enableSheet:NO]; + sheet._isSheet = NO; + [sheet._windowView _enableSheet:NO inWindow:self]; // Close it - sheet._isSheet = NO; [sheet orderOut:self]; [[CPNotificationCenter defaultCenter] postNotificationName:CPWindowDidEndSheetNotification object:self]; @@ -2648,7 +2648,8 @@ CPTexturedBackgroundWindowMask frame = [self frame], originX = frame.origin.x + FLOOR((frame.size.width - sheetFrame.size.width) / 2), startFrame = _CGRectMake(originX, -sheetShadowFrame.size.height, sheetFrame.size.width, sheetFrame.size.height), - endFrame = _CGRectMake(originX, 0, sheetFrame.size.width, sheetFrame.size.height); + endY = [_windowView bodyOffset] - [[self contentView] frame].origin.y, + endFrame = _CGRectMake(originX, endY, sheetFrame.size.width, sheetFrame.size.height); [sheet orderFront:self]; @@ -2688,9 +2689,10 @@ CPTexturedBackgroundWindowMask var sheet = _sheetContext["sheet"], sheetFrame = [sheet frame], fullHeight = sheet._hasShadow ? [sheet._shadowView frame].size.height : sheetFrame.size.height, - endFrame = _CGRectMakeCopy(sheetFrame); + endFrame = _CGRectMakeCopy(sheetFrame), + contentOrigin = [self convertBaseToGlobal:[[self contentView] frame].origin]; - [sheet setFrameOrigin:_CGPointMake(sheetFrame.origin.x, 0)]; + [sheet setFrameOrigin:_CGPointMake(sheetFrame.origin.x, sheetFrame.origin.y - contentOrigin.y)]; [self _clipSheet:sheet]; endFrame.origin.y = -fullHeight; @@ -2715,7 +2717,13 @@ CPTexturedBackgroundWindowMask if (_sheetContext["shouldClose"] === YES) [self _detachSheetWindow]; else + { + var sheetFrame = [sheet frame], + sheetOrigin = _CGPointMakeCopy(sheetFrame.origin); + [self _removeClipForSheet:sheet]; + [sheet setFrameOrigin:_CGPointMake(sheetOrigin.x, [sheet frame].origin.y + sheetOrigin.y)]; + } } else { @@ -3151,7 +3159,7 @@ var keyViewComparator = function(lhs, rhs, context) if ([self isFullPlatformWindow]) return [self setFrame:[_platformWindow visibleFrame]]; - if (_autoresizingMask == CPWindowNotSizable) + if (_autoresizingMask === CPWindowNotSizable) return; var frame = [_platformWindow contentBounds], @@ -3163,11 +3171,13 @@ var keyViewComparator = function(lhs, rhs, context) if (_autoresizingMask & CPWindowMinXMargin) newFrame.origin.x += dX; + if (_autoresizingMask & CPWindowWidthSizable) newFrame.size.width += dX; if (_autoresizingMask & CPWindowMinYMargin) newFrame.origin.y += dY; + if (_autoresizingMask & CPWindowHeightSizable) newFrame.size.height += dY; diff --git a/AppKit/CPWindow/_CPDocModalWindowView.j b/AppKit/CPWindow/_CPDocModalWindowView.j index 186af01fa..4b187fd05 100644 --- a/AppKit/CPWindow/_CPDocModalWindowView.j +++ b/AppKit/CPWindow/_CPDocModalWindowView.j @@ -26,7 +26,6 @@ @implementation _CPDocModalWindowView : _CPWindowView { CPView _bodyView; - CPView _shadowView; } + (CPString)defaultThemeClass @@ -61,17 +60,13 @@ { var bounds = [self bounds]; - _bodyView = [[CPView alloc] initWithFrame:_CGRectMake(0.0, 0.0, _CGRectGetWidth(bounds), _CGRectGetHeight(bounds))]; + _bodyView = [[CPView alloc] initWithFrame:_CGRectMake(0.0, 0.0, _CGRectGetWidth(bounds), _CGRectGetHeight(bounds))]; [_bodyView setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable]; [_bodyView setHitTests:NO]; [self addSubview:_bodyView]; - - _shadowView = [[CPView alloc] initWithFrame:CGRectMake(0, 0, _CGRectGetWidth(bounds), [self valueForThemeAttribute:@"shadow-height"])]; - [_shadowView setAutoresizingMask:CPViewWidthSizable]; - [self addSubview:_shadowView]; - } + } return self; } @@ -86,11 +81,6 @@ return [[self class] frameRectForContentRect:aContentRect]; } -- (void)_enableSheet:(BOOL)enable -{ - // do nothing, already a sheet -} - - (void)layoutSubviews { [super layoutSubviews]; @@ -98,9 +88,11 @@ var bounds = [self bounds]; [_bodyView setBackgroundColor:[self valueForThemeAttribute:@"body-color"]]; +} - [_shadowView setFrame:CGRectMake(0, 0, _CGRectGetWidth(bounds), [self valueForThemeAttribute:@"shadow-height"])]; - [_shadowView setBackgroundColor:[self valueForThemeAttribute:@"attached-sheet-shadow-color"]]; +- (int)bodyOffset +{ + return [_bodyView frame].origin.y; } @end diff --git a/AppKit/CPWindow/_CPHUDWindowView.j b/AppKit/CPWindow/_CPHUDWindowView.j index 865b6c4d0..d5aeb55a7 100644 --- a/AppKit/CPWindow/_CPHUDWindowView.j +++ b/AppKit/CPWindow/_CPHUDWindowView.j @@ -149,9 +149,9 @@ [[theWindow contentView] setFrame:contentRect]; } -- (void)_enableSheet:(BOOL)enable +- (void)_enableSheet:(BOOL)enable inWindow:(CPWindow)parentWindow { - [super _enableSheet:enable]; + // No need to call super, it just deals with the shadow view, which we don't want [_closeButton setHidden:enable]; [_titleField setHidden:enable]; @@ -173,6 +173,8 @@ [self tile]; [theWindow setFrame:frame display:NO animate:NO]; [theWindow setMovableByWindowBackground:!enable]; + + [self setNeedsLayout]; } - (void)layoutSubviews diff --git a/AppKit/CPWindow/_CPStandardWindowView.j b/AppKit/CPWindow/_CPStandardWindowView.j index be25f9f0b..f92fcd129 100644 --- a/AppKit/CPWindow/_CPStandardWindowView.j +++ b/AppKit/CPWindow/_CPStandardWindowView.j @@ -130,7 +130,6 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; The top coordinate has already been adjusted by _CPTitleableWindowView. */ var contentRect = [super contentRectForFrameRect:aFrameRect]; - contentRect.origin.x += 1; contentRect.size.width -= 2; contentRect.size.height -= 1; @@ -165,7 +164,7 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; [self addSubview:_dividerView]; - var y = _CGRectGetMaxY([_dividerView frame]); + var y = _CGRectGetMinY([_dividerView frame]); _bodyView = [[CPView alloc] initWithFrame:_CGRectMake(0.0, y, _CGRectGetWidth(bounds), _CGRectGetHeight(bounds) - y)]; @@ -226,18 +225,15 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; headHeight = [self toolbarMaxY]; [_headView setFrameSize:_CGSizeMake(width, headHeight)]; - [_dividerView setFrame:_CGRectMake(0.0, headHeight, width, 1.0)]; + [_dividerView setFrame:_CGRectMake(0.0, headHeight, width, _CPStandardWindowViewDividerViewHeight)]; - var dividerMaxY = 0, - dividerMinY = 0; + var dividerMinY = 0, + dividerFrame = [_dividerView frame]; if (![_dividerView isHidden]) - { - dividerMinY = _CGRectGetMinY([_dividerView frame]); - dividerMaxY = _CGRectGetMaxY([_dividerView frame]); - } + dividerMinY = _CGRectGetMinY(dividerFrame); - [_bodyView setFrame:_CGRectMake(0.0, dividerMaxY, width, _CGRectGetHeight(bounds) - dividerMaxY)]; + [_bodyView setFrame:_CGRectMake(0.0, dividerMinY, width, _CGRectGetHeight(bounds) - dividerMinY)]; var leftOffset = 8; @@ -248,9 +244,8 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; [_titleField setFrame:_CGRectMake(leftOffset, 0, width - leftOffset * 2.0, [self valueForThemeAttribute:@"title-bar-height"])]; - var contentRect = _CGRectMake(0.0, dividerMaxY, width, _CGRectGetHeight([_bodyView frame])); - - [[theWindow contentView] setFrame:contentRect]; + var contentFrame = [_bodyView frame]; + [[theWindow contentView] setFrame:_CGRectInset(contentFrame, 1.0, 1.0)]; } /* @@ -313,9 +308,9 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; return [super couldBeMoveEvent:anEvent]; } -- (void)_enableSheet:(BOOL)enable +- (void)_enableSheet:(BOOL)enable inWindow:(CPWindow)parentWindow { - [super _enableSheet:enable]; + [super _enableSheet:enable inWindow:parentWindow]; [_headView setHidden:enable]; [_dividerView setHidden:enable]; @@ -324,22 +319,29 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; [_titleField setHidden:enable]; if (enable) + { [_bodyView setBackgroundColor:[[CPTheme defaultTheme] valueForAttributeWithName:@"body-color" forClass:_CPDocModalWindowView]]; + + // Move the shadow view down so it is inside the content border + var shadowFrame = [_sheetShadowView frame]; + [_sheetShadowView setFrameOrigin:_CGPointMake(shadowFrame.origin.x, shadowFrame.origin.y + 1)]; + } else [_bodyView setBackgroundColor:[self valueForThemeAttribute:@"body-color"]]; // resize the window var theWindow = [self window], frame = [theWindow frame], + dividerHeight = [_dividerView frame].size.height, dy; if (enable) - dy = -(_CGRectGetHeight([_headView frame]) + _CGRectGetHeight([_dividerView frame])); + dy = -[_headView frame].size.height; else - dy = [self toolbarMaxY] + 1.0; + dy = [self toolbarMaxY] + dividerHeight; - var newHeight = _CGRectGetMaxY(frame) + dy, - newWidth = _CGRectGetMaxX(frame); + var newHeight = _CGRectGetHeight(frame) + dy, + newWidth = _CGRectGetWidth(frame); frame.size.height += dy; @@ -380,4 +382,9 @@ var _CPStandardWindowViewDividerViewHeight = 1.0; return size; } +- (int)bodyOffset +{ + return [_bodyView frame].origin.y; +} + @end diff --git a/AppKit/CPWindow/_CPTitleableWindowView.j b/AppKit/CPWindow/_CPTitleableWindowView.j index 34e597eab..dd83d10eb 100644 --- a/AppKit/CPWindow/_CPTitleableWindowView.j +++ b/AppKit/CPWindow/_CPTitleableWindowView.j @@ -121,4 +121,9 @@ return size; } +- (int)bodyOffset +{ + return [self contentRectForFrameRect:[self frame]].origin.y; +} + @end diff --git a/AppKit/CPWindow/_CPWindowView.j b/AppKit/CPWindow/_CPWindowView.j index 5d837516e..7fd358b64 100644 --- a/AppKit/CPWindow/_CPWindowView.j +++ b/AppKit/CPWindow/_CPWindowView.j @@ -91,6 +91,7 @@ _CPWindowViewResizeSlop = 3; @"size-indicator": CGSizeMakeZero(), @"resize-indicator": [CPNull null], @"attached-sheet-shadow-color": [CPColor blackColor], + @"shadow-height": 8, @"close-image-origin": [CPNull null], @"close-image-size": [CPNull null], @"close-image": [CPNull null], @@ -453,7 +454,10 @@ _CPWindowViewResizeSlop = 3; var type = [anEvent type]; if (type === CPLeftMouseUp) + { + _cachedScreenFrame = nil; return; + } var location = [anEvent locationInWindow], theWindow = [self window], @@ -462,10 +466,10 @@ _CPWindowViewResizeSlop = 3; if (type === CPLeftMouseDown) { - _mouseDraggedPoint = _CGPointMakeCopy(globalLocation); + _mouseDraggedPoint = _CGPointMake(globalLocation.x, globalLocation.y); _resizeFrame = _CGRectMakeCopy(frame); + _cachedScreenFrame = [[CPPlatformWindow primaryPlatformWindow] visibleFrame]; } - else if (type === CPLeftMouseDragged) { var deltaX = globalLocation.x - _mouseDraggedPoint.x, @@ -478,13 +482,16 @@ _CPWindowViewResizeSlop = 3; newY, newWidth, newHeight, - platformFrame = [[theWindow platformWindow] usableContentFrame], resizeMinSize = [self _minimumResizeSize], minSize = [theWindow minSize], maxSize = [theWindow maxSize]; minSize = _CGSizeMake(MAX(minSize.width, resizeMinSize.width), MAX(minSize.height, resizeMinSize.height)); + // If it's a sheet, horizontal resizing is symmetrical, so the movement is effectively doubled + if (theWindow._isSheet) + deltaX *= 2; + // Calculate x and width first switch (_resizeRegion) { @@ -501,8 +508,24 @@ _CPWindowViewResizeSlop = 3; else if (deltaX < 0) deltaX = -MIN(maxSize.width - startWidth, ABS(deltaX)); - // When resizing from the left, we change the origin and the width + if (theWindow._isSheet) + deltaX = FLOOR(deltaX / 2); + newX = startX + deltaX; + + // Pin the left edge to the usable screen left edge + var pinnedX = MAX(newX, _CGRectGetMinX(_cachedScreenFrame)); + + if (pinnedX !== newX) + { + deltaX += pinnedX - newX; + newX = pinnedX; + } + + // When resizing from the left, we change the origin and the width + if (theWindow._isSheet) + deltaX *= 2; + newWidth = startWidth - deltaX; break; @@ -519,9 +542,26 @@ _CPWindowViewResizeSlop = 3; else if (deltaX < 0) deltaX = -MIN(startWidth - minSize.width, ABS(deltaX)); - // When resizing from the right, change only the width - newX = startX; - newWidth = startWidth + deltaX; + if (theWindow._isSheet) + deltaX = FLOOR(deltaX / 2); + + // Pin the right edge to the usable screen right edge + var newMaxX = startX + startWidth + deltaX, + pinnedX = MIN(newMaxX, _CGRectGetMaxX(_cachedScreenFrame)); + + if (pinnedX !== newMaxX) + deltaX += pinnedX - newMaxX; + + if (theWindow._isSheet) + { + newWidth = startWidth + (deltaX * 2); + newX = startX - FLOOR((newWidth - startWidth) / 2); + } + else + { + newWidth = startWidth + deltaX; + newX = startX; + } break; default: @@ -545,8 +585,18 @@ _CPWindowViewResizeSlop = 3; else if (deltaY < 0) deltaY = -MIN(maxSize.height - startHeight, ABS(deltaY)); - // When resizing from the top, change the origin and the height newY = startY + deltaY; + + // Pin the top edge to the usable screen top edge + var pinnedY = MAX(newY, _CGRectGetMinY(_cachedScreenFrame)); + + if (pinnedY !== newY) + { + deltaY += pinnedY - newY; + newY = pinnedY; + } + + // When resizing from the top, change the origin and the height newHeight = startHeight - deltaY; break; @@ -563,8 +613,16 @@ _CPWindowViewResizeSlop = 3; else if (deltaY < 0) deltaY = -MIN(startHeight - minSize.height, ABS(deltaY)); - // When resizing from the bottom, change only the height newY = startY; + + // Pin the bottom edge to the usable screen bottom edge + var newMaxY = startY + startHeight + deltaY, + pinnedY = MIN(newMaxY, _CGRectGetMaxY(_cachedScreenFrame)); + + if (pinnedY !== newMaxY) + deltaY += pinnedY - newMaxY; + + // When resizing from the bottom, change only the height newHeight = startHeight + deltaY; break; @@ -573,13 +631,7 @@ _CPWindowViewResizeSlop = 3; newHeight = startHeight; } - if (theWindow._isSheet && theWindow._parentView && (frame.size.width !== newWidth)) - [theWindow._parentView _setAttachedSheetFrameOrigin]; - - // Constrain resize to fit within the platform window. - var newFrame = CGRectIntersection(_CGRectMake(newX, newY, newWidth, newHeight), platformFrame); - - [theWindow setFrame:newFrame]; + [theWindow setFrame:_CGRectMake(newX, newY, newWidth, newHeight)]; [self setCursorForLocation:location resizing:YES]; } @@ -597,15 +649,10 @@ _CPWindowViewResizeSlop = 3; if (!visibleFrame) visibleFrame = [[CPPlatformWindow primaryPlatformWindow] visibleFrame]; - var minPointY = 0; - - if ([CPMenu menuBarVisible]) - minPointY = [[CPApp mainMenu] menuBarHeight]; - var restrictedPoint = _CGPointMake(0, 0); restrictedPoint.x = MIN(MAX(aPoint.x, -_frame.size.width + 4.0), _CGRectGetMaxX(visibleFrame) - 4.0); - restrictedPoint.y = MIN(MAX(aPoint.y, minPointY), _CGRectGetMaxY(visibleFrame) - 8.0); + restrictedPoint.y = MIN(MAX(aPoint.y, _CGRectGetMinY(visibleFrame)), _CGRectGetMaxY(visibleFrame) - 8.0); return restrictedPoint; } @@ -653,6 +700,8 @@ _CPWindowViewResizeSlop = 3; if ([theWindow attachedSheet]) [theWindow _setAttachedSheetFrameOrigin]; + else if (theWindow._isSheet) + [self _adjustShadowViewSize]; } - (void)setShowsResizeIndicator:(BOOL)shouldShowResizeIndicator @@ -832,22 +881,36 @@ _CPWindowViewResizeSlop = 3; [self addSubview:_resizeIndicator]; } -- (void)_enableSheet:(BOOL)enable +- (void)_enableSheet:(BOOL)enable inWindow:(CPWindow)parentWindow { if (enable) { - _sheetShadowView = [[CPView alloc] initWithFrame:_CGRectMake(0, 0, _CGRectGetWidth([self bounds]), 8)]; + // Clip the shadow view width to the parent's content view + var myWidth = [self bounds].size.width, + shadowWidth = [self _shadowViewWidthForParentWindow:parentWindow], + shadowHeight = [self currentValueForThemeAttribute:@"shadow-height"]; + + _sheetShadowView = [[CPView alloc] initWithFrame:_CGRectMake(FLOOR((myWidth - shadowWidth) / 2), 0, shadowWidth, shadowHeight)]; [_sheetShadowView setAutoresizingMask:CPViewWidthSizable]; [self addSubview:_sheetShadowView]; } else { [_sheetShadowView removeFromSuperview]; + _sheetShadowView = nil; } [self setNeedsLayout]; } +- (CGRect)_shadowViewWidthForParentWindow:(CPWindow)parentWindow +{ + var myWidth = [self bounds].size.width, + parentWidth = [[parentWindow contentView] bounds].size.width; + + return MIN(myWidth, parentWidth); +} + - (void)layoutSubviews { [super layoutSubviews]; @@ -864,9 +927,28 @@ _CPWindowViewResizeSlop = 3; } } +- (void)_adjustShadowViewSize +{ + if (!_sheetShadowView) + return; + + var myWidth = [self frame].size.width, + shadowFrame = [_sheetShadowView frame], + shadowWidth = [self _shadowViewWidthForParentWindow:_window._parentView]; + + shadowFrame.origin.x = FLOOR((myWidth - shadowWidth) / 2); + shadowFrame.size.width = shadowWidth; + [_sheetShadowView setFrame:shadowFrame]; +} + - (CGSize)_minimumResizeSize { return _CGSizeMake(0, _CPWindowViewMinContentHeight); } +- (int)bodyOffset +{ + return [self frame].origin.y; +} + @end diff --git a/AppKit/Platform/DOM/CPDOMWindowLayer.j b/AppKit/Platform/DOM/CPDOMWindowLayer.j index 4336d60c8..cb693f20c 100644 --- a/AppKit/Platform/DOM/CPDOMWindowLayer.j +++ b/AppKit/Platform/DOM/CPDOMWindowLayer.j @@ -142,33 +142,24 @@ // First check to see if the window is already clipped. // If so, just update its rect. var windowElement = aWindow._DOMElement, - clip = windowElement.parentNode, - style = clip.style, - isClipped = style.className === "cpwindowclip"; - - if (!isClipped) - { - clip = document.createElement("div"); - + clip = document.createElement("div"), style = clip.style; - style.className = "cpwindowclip"; - style.position = "absolute"; - style.overflow = "hidden"; - } + + style = clip.style; + style.className = "cpwindowclip"; + style.position = "absolute"; + style.overflow = "hidden"; style.left = clipRect.origin.x + "px"; style.top = clipRect.origin.y + "px"; style.width = clipRect.size.width + "px"; style.height = clipRect.size.height + "px"; - if (!isClipped) - { - // Replace the window with the clip element, then put it inside the clip - var parent = windowElement.parentNode; - CPDOMDisplayServerInsertBefore(parent, clip, windowElement); - CPDOMDisplayServerRemoveChild(parent, windowElement); - CPDOMDisplayServerAppendChild(clip, windowElement); - } + // Replace the window with the clip element, then put it inside the clip + var parent = windowElement.parentNode; + CPDOMDisplayServerInsertBefore(parent, clip, windowElement); + CPDOMDisplayServerRemoveChild(parent, windowElement); + CPDOMDisplayServerAppendChild(clip, windowElement); } /*! @@ -178,19 +169,13 @@ - (void)removeClipForWindow:(CPWindow)aWindow { var windowElement = aWindow._DOMElement, - clip = windowElement.parentNode; + clip = windowElement.parentNode, + parent = clip.parentNode; - if (clip.style.className === "cpwindowclip") - { - var parent = clip.parentNode; - - CPDOMDisplayServerRemoveChild(clip, windowElement); - [aWindow setFrameOrigin:_CGPointMake([aWindow frame].origin.x, clip.offsetTop)]; - CPDOMDisplayServerInsertBefore(parent, windowElement, clip); - CPDOMDisplayServerRemoveChild(parent, clip); - } - else - CPLog.warn("%s %s was not previously clipped via clipWindow:toWindow:", _cmd, [aWindow description]); + CPDOMDisplayServerRemoveChild(clip, windowElement); + [aWindow setFrameOrigin:_CGPointMake([aWindow frame].origin.x, clip.offsetTop)]; + CPDOMDisplayServerInsertBefore(parent, windowElement, clip); + CPDOMDisplayServerRemoveChild(parent, clip); } @end diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index 5a33ec887..8c957aea9 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -2350,6 +2350,7 @@ var themedButtonValues = nil, [@"window-shadow-color", shadowColor], [@"resize-indicator", resizeIndicator], [@"attached-sheet-shadow-color", sheetShadow], + [@"shadow-height", 8], [@"size-indicator", CGSizeMake(12, 12)] ]; @@ -2457,7 +2458,6 @@ var themedButtonValues = nil, minimizeButtonImage = PatternImage(@"window-standard-minimize-button.png",16, 16), minimizeButtonImageHighlighted = PatternImage(@"window-standard-minimize-button-highlighted.png",16, 16), - sheetShadow = PatternColor(@"window-attached-sheet-shadow.png", 1, 8), resizeIndicator = PatternImage(@"window-resize-indicator.png", 12, 12), themeValues = @@ -2492,7 +2492,6 @@ var themedButtonValues = nil, [@"close-image-origin", CGPointMake(8.0, 10.0)], [@"resize-indicator", resizeIndicator], - [@"attached-sheet-shadow-color", sheetShadow], [@"size-indicator", CGSizeMake(12, 12)] ]; @@ -2518,13 +2517,9 @@ var themedButtonValues = nil, [@"window-standard-bottom-right.png", 2.0, 2.0] ]), - sheetShadow = PatternColor(@"window-attached-sheet-shadow.png", 1, 8), - themeValues = [ - [@"body-color", bezelColor], - [@"shadow-height", 8], - [@"attached-sheet-shadow-color", sheetShadow] + [@"body-color", bezelColor] ]; [self registerThemeValues:themeValues forView:docModalWindowView inherit:themedWindowViewValues]; diff --git a/AppKit/Themes/Aristo2/Artwork/Aristo 11-06-07.psd b/AppKit/Themes/Aristo2/Artwork/Aristo 11-06-07.psd index 3ff6d3e5f9d31f9e227786b83ae28e9d9ca1e0d5..ef95c237fc1b6b75aed15cde9cdf4da937a07c8a 100755 GIT binary patch delta 153346 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 B=PdvL delta 259774 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

-ZBl1QU zT{wN##q%${;>yw`Wo6CFDwlnz#)CKeB&Aqr}=JY9(ipCV=B8o{;SW!$|*n(E)ilt)7%^y8( z!lcPlr_Y!*dvFOx6;SG*h<6Bq|i_su2?VW zSvh$HqsJCam{fe>oE8@|l zqz@mFlb2sOdd#>BE+}dqUpfAx@u@`@Trh6T=)(NGoDstzxNn>q7dCci1IRv95i(~; z^018Imh9Y-dHDqeO@)<(9~O!QL-X@S=4M-lXADcG$cVPkhqQ zlwm@8#_%l5h-_!hSp*dNIM>I;!6JeMqxTIk=B9J?2X{|a z#wc?W`Sch$>{x%i59qPbp9}(>2T{C`EaUoB*yUmk|>{ z%75@<6a7%cI3gAt-N*M?wI)V%qNlAg*ohS+8)i=U6ydIfL~5 zJJNeL|3SRjcYFy_ulEADo(0C00ciZ)$Gqb2KE~qjdfsadx!1qbA|iLvr%6<|ymP%2 z?N_FvfrSPC$inh#|2W3-8|Al0efR1q9sl|W(I*7=_#Yu5JmWttzQGs5oqtd54XO~z z@!uoD;FW|c|AU%mWi>17KN3Rt)&C$1q0GOh{s&J8mjA(H=hw+S`HzecKJ`E7LU{5Y ziP~qk91MD%-4h;USVpthISLufIFm09P~mbTyumQpIQmmSkXmP6}8p1o{Nz-675dhs)Ng$ zPRq#J65QZJsv9XXu81->RuEF#KrDDlbNW2t#PW8Ed!ZY+0{2XD4W(X}P!-Wjs1i$Y zQO!iKWE;*6*zr%?`@Qe!9Y% zei2gQ)}N9FQe8_d$YllDsjI@JRTZS7{yruVz0QcMXzU>7>IRFsey2s;3GvI#4OJG= zWdGA0?t7!u=7#!e3vQG`Ud$ux=YDU^*3g@Rp0|&>-I{(yTs4HPuAq!+>&-=tGc2+4FHGmN9_d|Ms3FR_ zL1L}7C$6xL*3jatvM>09b(AYpf4SY7cL7&Rw2h^W6=FGVMyK^hOUrd-Q;Arl$cPKg zWdGR;+*u`64p&j%MKlfNRBB?k{lS{y!mhvFIx<09RV$hs8+OXT8%c`&{uS0#&SbAy z;VyL(tq*!FltnB;sXy}vcd2*XZXHokt@&*SHtLf!u z^2ei6x_K=ppx>TE^3(sDhUxI`W0EEJ&r9GOhJNa$rX}e90hYz|dD!sKmpn; zO%bp#d-2p=|1Utzf5hhW{}oBm4nRQ@MNeJ)W7)bga=5w9QOECHm3AM7Gy1f>tg?(N zJKV?~HV~fs%|86z_Z#jL;t%vVQN>)jx8+B1od_h+A*wo$>`q^U@k=!b6ba8-C72WR(U*j?pTVy)_8<_8TO2LC>! z?t5aPw}SVbHRCMwqRje&B=--OuZubsa@Qu+jsp2h5J&gLg6}&?9PxBE}nbzt>cKWI|B-L zQ7DCraUjNL97t#50G=wxfppI}a6`axz%$ZSx5;6)9SVl&a=A{8C(MLZt;aI_esjuql!V`5sOozYr&yXg>R^v^B}-@hWZ zAhFtLPRYzZmiut77G8{_3-a??a=UW1*_kP3qnf)vXxgnr x5M^2nMcfs+64=>bS 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 diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-bottom-center.png b/AppKit/Themes/Aristo2/Resources/window-standard-bottom-center.png index 39396fe31d61b1c1ff909269fcd4f803f51bf836..7312a639dc308de2c9246f1c900994f27bedd3b3 100644 GIT binary patch delta 590 zcmV-U0wGfA+3#%W5kfSj%Un6ZrG{ z4+vD9z%TOx7i}gt>f_PM$K$6}b=+2Q4e#EA+n)DL+elY}zS-%H_X#X(vzFYy2Q`A= z1aaF0rh@@|EgnE-tOWC5I;k)rfU$tg=8TbdfMP-s_Loh_jL#XTAvhoCquKh2FGYTi z<)s8}oNGBke}}^%I7|a$pAm`Uc<@2##3Lr%i*{u{(cR7HLCCJMs&&d}Fv#WF>|Fxk zSVGel#l^Aif>S|3Wg66%Eg}I%O@l^s=a%y6I=WlEv=S|4XZE&|9)9yjsO!`L=(FLU zt@58z?u4oKjnwX5B+y%eTGbqr$agWE;gDh$5fT#|e+!YbJWcZ{6Lj?P8aHKP9xrAj zqOl-kLDO&{vY60Cnk^WM!jXHgJ6GyTj$HMdi?4EdW@YJ&T^X|*C*WaYoar{E1=%A5 zZ;G-~dQiL_KIojQwCbCzb88xK>M&QYWPs`4l}9+5=6U=fqdA?5FokDs{XbnpJ{k1S zxQr@4NQ1-kGW=e+tdG=wXRKe2U$Q+0aC`>FI{*Lx7)eAyR0vyR`1k}si3N}(e;IT|SaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM00HJ{ zR9JLaO-wptZ*4ANWN%_+E_iKl0096104R~2Q_YT>Fc5wf%X?|1f`3R1SW8zF2Xzm$ zt8Aq9O2E6Z5->7O!{*g`=p*$NYNC+-Xq7`PA3QVPH-DbFf4v*Jvf4@u*78}k3H!rT@r z1hLx$rlSFTEgnFojRbQ)@G49QV9Y18Ib-AVBg;kUcW+ zrYI}bj*7SA2c2`3MtzfYZgc}q9p>tl3^4t>@(4#kp2r_Dn$tjpDLixQ|LGcX$)JD6 zWm35rA{?KW;djDiePru)#<=D91>k`OmUds^j{pDwIY~r8R0!9RD>o1z^G`tl0000< KMNUMnLSTX+attE? delta 34 ocmeBVEt;UhZt3ab7{U=f*@?+qU^Sn+E&~vFy85}Sb4q9e0GCk+w*UYD diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-bottom-right.png b/AppKit/Themes/Aristo2/Resources/window-standard-bottom-right.png index 00a92564ae6573157d64be643a24ef6e7626485a..756701d20d1a432bb1456a9726202fc1cdfd256a 100644 GIT binary patch delta 573 zcmV-D0>b@riUp7)e;IT|SaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM00HM| zR9JLaO-wptZ*4ANWN%_+E_iKl0096104R~2Q_YT>Fc5wf%X?|12LBKYSW8zF2Xzm$ zt8Aq9O2E6Z5->7O!{*g`=p*$NYNC+-Xq7`PA3QVPH-DbFf4v*Jvf4@u*78}k3H`pDhlqz!)1V36+ogQEj_y}4okUC7>%FO@gWvoS>N<4mt!j=*A3O zXe&@^0#EGBf3W(&rmaN^##y)D~HPF(eyJHN{1nUST{W~KFRnt+Fmwz}Ww4rGrE zyeY~`wWH$g_(A7frBUBxog3YNQ-`^FB?CIkW%!+NSs&TDoiT1XegV7n26&La6J`Ja069rSK~xCWkt;V4G@ImW00000 LNkvXXu0mjfv;Pi= delta 34 ocmeBTEt;UhZt3ab7{U=f*_p{)V1L>hb_O8uboFyt=akR{0Hp^BqyPW_ diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-center-center.png b/AppKit/Themes/Aristo2/Resources/window-standard-center-center.png index 1830f6d53d1352c83a53a873ae688f2d121cd253..46b33352dbb5d004e5a9d7c1d213f2b5df974a08 100644 GIT binary patch delta 593 zcmV-X0eSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00HS~R9JLaO-wptZ*4ANWN%_+E_iKl0096104R~2Q_YT>Fc5wf%X?|1 z2LF&4u$HbU26Yd#t8Aq9O2E582{tlL!{*g`=p*$NYSIw3f7L37T0VGYzHk0Kb9*;* zWwn(StmSi~V)*m>4+xq%hF=y1F1l21nvX{#ACI3_)p1)zHN1NdZU;WJT`O$~hIXfV zKE$xB^;&ZG9@Pkf6U1&~n2ZMSwRixjHWDm6e^y~a0An7RFBl{50L6qN>@J&;IbSeN z18_djMKkpie_x9H9Lq^D+*sRjgbs&;ckn%Jo)L+nX!Jqp%pqp|i?Zb~Q~k~4LCC%` zO=laez$lk%y|*!hQweQX6c@*;_f7?Qm2S~cc8GWwwJn;^y*#*<(n++Gz22Kj zI{3{Wp{`R$pv#7THjVp~awl}PZ>6&LB8JZ5)lJPYe+gX|gEG-E6bChooJZK*0bahu;<8fIZ~mCI8jORLRF z>)kW~4;yWDztJ5?9~pR4lvSff#oO_N&bdm{e3Nx^8uA{0000CNklUS1;PU00-nx~00000NkvXXu0mjfT=)i@ delta 64 zcmcc55;Q@=ijkRtfkE|l*eM{z9N-h;`t|GA4Vm-1fLtz57sn6|+2jNun~8z({0Y;i PKo*0itDnm{r-UW|RM8So diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-center-left.png b/AppKit/Themes/Aristo2/Resources/window-standard-center-left.png index cbffd9b5a41e5e400cc75d3035a341f202a867d2..ad7cf8c281678df95b61ccd71e413ed3499bc4b7 100644 GIT binary patch delta 585 zcmV-P0=E53;{=c-e;IT|SaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM00HJ{ zR9JLaO-wptZ*4ANWN%_+E_iKl0096104R~2Q^{`IFcAF}g1NLnEiSStiHI7gTF@NS z29AODDoadE*dhgrt`+}U5B;S6LMg*?7X&_(;DIyq-fWz?f4v*Js@@6<*5X;J82xt zLF_h$$!Gvy%LkBZBf!G*XEi1SFy@i@f-&+AP)sPo?y?z~^9AEH0Otc;G}AosWmcSH zIVpx4Yden6f8lWO4!)<&Ga^wGjXo%yImE1gQMMXps=t{$WTLN)?5xxZjB>TsdmBSI zmC$x&d2y_I?^KXi>lO`Fhlqz!+oB2G+ogEAj_y}4oj^;`>%FOkgWvoS>N<4l`| zDXUtlQSo;CpmVOm$Zw)4jBdfH!(6_S0j7Uf9^%k1is(a13+iV<0?*v$f4YWTGU%Ui znN)5DL&xW3_?>WBAEDgN7`Gh10KmHjd@VhibN~PV6G=otR0vyRU|?WS`}+0ke`E{* Xh1(CG<>fpJ00000NkvXXu0mjfLH!i< delta 46 zcmaFN;xj=-L)g>BF@!@lIUyk-;P93@NM{y%vdkk7@+L z31YV?%tizFT0VeW8v*8i;MJHAz?e^FbH>O!Krx{RyURQ>OXe)0AvhoCqM7C?S@Pl> z%SkERSlcBCe;p17{}A}vJR=gv@#uq6&mp}2McHcbRDUyh;G(aM?5xxZjB>Tsdz(Ty zmC$x&d2y_I|5T7)>lO`Fhlr0++oB2G+ogEAj_y}4oj^;`>%FOkgWvoS>N<4o6jQl2=!sr&9I-JN?GQjlj$|D>FMG=3GM zmr3PjLvVavhTjR7^%2VLjB(5H3)aa7j;R)a?EnA(6G=otR0vyR`1I X!CMcXf502+00000NkvXXu0mjfGFcW9 delta 46 zcmaFN;xj=-L)g>BF@!@l`NyxXuj^CJ95}Fmjp1N4|NPU2*ZCQMz|+;wWt~$(69Bnn B5)uFa diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-top-left.png b/AppKit/Themes/Aristo2/Resources/window-standard-top-left.png index bc1d5b3a8ba5ded3257012475c23d475760d1823..2a3df104f5f89adec26ca6644efc656a46ab3edf 100644 GIT binary patch delta 591 zcmV-V0(7@e;IT|SaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM00HJ{ zR9JLaO-wptZ*4ANWN%_+E_iKl0096104R~2Q%i2!Fc7^8!E9Qf7C*KriHI7gqJ?Im zHgF8ITUlaa!WJn|bglSmUGzx3LMg*?KM1@i!3AgLz4>wGfA+3#%W5kfSj%Un6ZrG{ z4+vD9z%TOx7i}gt>f_PM$K$6}b=+2Q4e#EA+n)DL+elY}zS-%H_X#X(vzFYy2Q`A= z1aaF0rh@@|EgnE-tOWC5I;k)rfU$tg=8TbdfMP-s_Loh_jL#XTAvhoCquKh2FGYTi z<)s8}oNGBke}}^%I7|a$pAm`Uc<@2##3Lr%i*{u{(cR7HLCCJMs&&d}Fv#WF>|Fxk zSVGel#l^Aif>S|3Wg66%Eg}I%O@l^s=a%y6I=WlEv=S|4XZE&|9)9yjsO!`L=(FLU zt@58z?u4oKjnwX5B+y%eTGbqr$agWE;gDh$5fT#|e+!YbJWcZ{6Lj?P8aHJEXR~M# z(O3|&plP@eSxo36%@&MB;mEz$ohx-EN3QzK6<4`Dv$Ax?u8i4@6Y#Jx&U72og6xrj zH$_<~Jt*D|A9T)DTJ=rVxit+qb(pJHGQjlj$|D?2^F02L(VR|2n8Gu+{-3TPpA7nE zTt=0jNx|WH8GbKZ)<KR00kwWV?Ru6{1-oD!M< D&@K`X diff --git a/AppKit/Themes/Aristo2/Resources/window-standard-top-right.png b/AppKit/Themes/Aristo2/Resources/window-standard-top-right.png index 096e807e8db43a3805956f4775018025352d0690..03bed6695ac1c8f66f0afd1adb7e88cee153d6bc 100644 GIT binary patch delta 595 zcmV-Z0<8T{?F5h{e;IT|SaefwW^{L9a%BKPWN%_+AW3auXJt}lVPtu6$z?nM00HJ{ zR9JLaO-wptZ*4ANWN%_+E_iKl0096104R~2Q^{`IFcAF}g1NLnEiSStiHI7gTF@NS z29AODDoadE*dhgrt`+}U5B;S6LMg*?7X&_(;DIyq-fWz?f4v*Js@@6<*5X;J82xt zLF_h$$!Gvy%LkBZBf!G*XEi1SFy@i@f-&+AP)sPo?y?z~^9AEH0Otc;G}AosWmcSH zIVpx4Yden6f8lWO4!)<&Ga^wGjXo%yImE1gQMMXps=t{$WTLN)?5xxZjB>TsdmBSI zmC$x&d2y_I?^KXi>lO`Fhlqz!+oB2G+ogEAj_y}4oj^;`>%FOkgWvoS>N<4l`| zDXUtlQSo;CpmVOm$Zw)4jBdfH!(6_S0j7Uf9^%k1is(a13+iV<0?*v$f4YWTGU%Ui znN)5DO~>bD_?>WBAEDgN7`Gh10Jj4MbRfRm82|tP9Z5t%R0vyRWME)WV?YCpU%!6+ hk1W8=&8<$MAOJg?5X2J~uBHG0002ovPDHLkV1mKK7 Date: Tue, 12 Mar 2013 11:33:12 -0400 Subject: [PATCH 040/145] Fixed: resizeWithOldSuperviewSize did not maintain size ratio Previously, Cappuccino would resize in such a way that a view's size ratio to its superview would not be maintained. This commit ensures that size ratios are maintained during resizing. Patch contributed by @davidkhess Fixes #357 --- AppKit/CPView.j | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 49e0e4aea..55a139c81 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1188,20 +1188,28 @@ var CPViewFlags = { }, var frame = _superview._frame, newFrame = _CGRectMakeCopy(_frame), - dX = (_CGRectGetWidth(frame) - aSize.width) / - (((mask & CPViewMinXMargin) ? 1 : 0) + (mask & CPViewWidthSizable ? 1 : 0) + (mask & CPViewMaxXMargin ? 1 : 0)), - dY = (_CGRectGetHeight(frame) - aSize.height) / - ((mask & CPViewMinYMargin ? 1 : 0) + (mask & CPViewHeightSizable ? 1 : 0) + (mask & CPViewMaxYMargin ? 1 : 0)); + dX = frame.size.width - aSize.width, + dY = frame.size.height - aSize.height, + evenFractionX = 1.0 / ((mask & CPViewMinXMargin ? 1 : 0) + (mask & CPViewWidthSizable ? 1 : 0) + (mask & CPViewMaxXMargin ? 1 : 0)), + evenFractionY = 1.0 / ((mask & CPViewMinYMargin ? 1 : 0) + (mask & CPViewHeightSizable ? 1 : 0) + (mask & CPViewMaxYMargin ? 1 : 0)), + baseX = (mask & CPViewMinXMargin ? _frame.origin.x : 0) + + (mask & CPViewWidthSizable ? _frame.size.width : 0) + + (mask & CPViewMaxXMargin ? aSize.width - _frame.size.width - _frame.origin.x : 0), + baseY = (mask & CPViewMinYMargin ? _frame.origin.y : 0) + + (mask & CPViewHeightSizable ? _frame.size.height : 0) + + (mask & CPViewMaxYMargin ? aSize.height - _frame.size.height - _frame.origin.y : 0); if (mask & CPViewMinXMargin) - newFrame.origin.x += dX; + newFrame.origin.x += dX * (baseX > 0 ? _frame.origin.x / baseX : evenFractionX); + if (mask & CPViewWidthSizable) - newFrame.size.width += dX; + newFrame.size.width += dX * (baseX > 0 ? _frame.size.width / baseX : evenFractionX); if (mask & CPViewMinYMargin) - newFrame.origin.y += dY; + newFrame.origin.y += dY * (baseY > 0 ? _frame.origin.y / baseY : evenFractionY); + if (mask & CPViewHeightSizable) - newFrame.size.height += dY; + newFrame.size.height += dY * (baseY > 0 ? _frame.size.height / baseY : evenFractionY); [self setFrame:newFrame]; } From 445045565bb81ad5d302a72eb77dd0b1f4fe4676 Mon Sep 17 00:00:00 2001 From: Aparajita Fishman Date: Tue, 12 Mar 2013 12:20:58 -0400 Subject: [PATCH 041/145] Fixed: frame/bounds change notification was sent unconditionally. Previously, calling setPostsFrameChangedNotifications:YES or setPostsBoundsChangedNotifications:YES would immediately result in the notification being sent. Cocoa will only send in this context if: - setPosts[Frame/Bounds]ChangedNotifications:NO was called. - The frame/bounds changed between that call and the call to setPosts[Frame/Bounds]ChangedNotifications:YES. We are currently not tracking pending changes, so this commit removes the sending of the notification completely in those methods. Fixes #1076 --- AppKit/CPView.j | 6 ------ 1 file changed, 6 deletions(-) diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 55a139c81..5d2c042c1 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1994,9 +1994,6 @@ setFrameOrigin: return; _postsFrameChangedNotifications = shouldPostFrameChangedNotifications; - - if (_postsFrameChangedNotifications) - [CachedNotificationCenter postNotificationName:CPViewFrameDidChangeNotification object:self]; } /*! @@ -2027,9 +2024,6 @@ setBoundsOrigin: return; _postsBoundsChangedNotifications = shouldPostBoundsChangedNotifications; - - if (_postsBoundsChangedNotifications) - [CachedNotificationCenter postNotificationName:CPViewBoundsDidChangeNotification object:self]; } /*! From fd49bd2f2d6b525774dcc558fe88466f85f707c9 Mon Sep 17 00:00:00 2001 From: aparajita Date: Tue, 12 Mar 2013 13:40:18 -0300 Subject: [PATCH 042/145] Update CONTRIBUTING.md Updated commit message section. --- CONTRIBUTING.md | 142 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 113 insertions(+), 29 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5a04118e8..1bde4969b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -33,43 +33,127 @@ Some things are difficult to unit test in a way that's worthwhile. For instance The style and format of your commit messages are very important to the health of the project. A good commit message helps not only users reading the release notes, but also your fellow Cappuccino developers as they review `git log` or `git blame` to figure out what you were doing. -This is the preferred format of commit messages for complex changes: +Commit messages should be in the following format: - [New:] + :

- [OPTIONAL DESCRIPTION ABOUT WHAT THIS THING DOES.] + -Or for fixes: +