- Fixed a bug where the right control was incorrectly recreated with a default value when switching operators.

- As per cocoa, the predicate is recomputed when you send the right control action, not when you change text.  Update-as-you-type can be turned ON by subclassing -_sendsActionOnIncompleteTextChange method. Default is NO.
- Rewrote _reconfigureSubviews method, should be faster.
This commit is contained in:
cacaodev
2011-05-23 10:59:44 +02:00
committed by Klaas Pieter Annema
parent ea660e3dd4
commit 2b52f7d8da
8 changed files with 778 additions and 417 deletions
+46 -32
View File
@@ -315,7 +315,9 @@
if (menuItemIndex == -1 || [[treeChild title] isEqual:[currentView titleOfSelectedItem]])
{
var node = [_CPPredicateEditorRowNode _rowNodeFromTree:treeChild withTemplate:aTemplate];
var node = [_CPPredicateEditorRowNode rowNodeFromTree:treeChild];
[node applyTemplate:aTemplate withViews:templateViews forOriginalTemplate:originalTemplate];
[criteria addObject:node];
[values addObject:[node displayValue]];
break;
@@ -334,9 +336,9 @@
- (void)_updatePredicate
{
//[self willChangeValueForKey:@"objectValue"];
[self willChangeValueForKey:@"objectValue"];
[self _updatePredicateFromRows];
//[self didChangeValueForKey:@"objectValue"];
[self didChangeValueForKey:@"objectValue"];
}
- (void)_updatePredicateFromRows
@@ -366,34 +368,41 @@
- (id)_predicateFromRowItem:(id)rowItem
{
var subpredicates = [CPArray array],
subrows = [rowItem valueForKey:[super subrowsKeyPath]],
rowType = [rowItem valueForKey:_typeKeyPath];
if (rowType == CPRuleEditorRowTypeCompound)
{
var subrows = [rowItem valueForKey:_subrowsArrayKeyPath],
count = [subrows count];
for (var i = 0; i < count; i++)
{
var predicate = [self _predicateFromRowItem:subrows[i]];
[subpredicates addObject:predicate];
for (var i = 0; i < count; i++)
{
var subrow = [subrows objectAtIndex:i];
var predicate = [self _predicateFromRowItem:subrow];
[subpredicates addObject:predicate];
}
}
var criteria = [rowItem valueForKey:[super criteriaKeyPath]],
displayValues = [rowItem valueForKey:[super displayValuesKeyPath]],
leftNode = [criteria objectAtIndex:0],
templateViews = [leftNode templateViews],
count = [criteria count];
var criteria = [rowItem valueForKey:_itemsKeyPath],
displayValues = [rowItem valueForKey:_valuesKeyPath],
count = [criteria count],
lastItem = [criteria lastObject],
template = [lastItem templateForRow],
templateViews = [template templateViews];
for (var j = 0; j < count; j++)
{
var view = [templateViews objectAtIndex:j],
value = [displayValues objectAtIndex:j];
[[criteria objectAtIndex:j] setTemplateViews:templateViews];
if ([view respondsToSelector:@selector(selectItemWithTitle:)])
if ([view isKindOfClass:[CPPopUpButton class]])
[view selectItemWithTitle:value];
else
else if ([view respondsToSelector:@selector(setObjectValue:)])
[view setObjectValue:[value objectValue]];
}
return [[leftNode templateForRow] predicateWithSubpredicates:subpredicates];
return [template predicateWithSubpredicates:subpredicates];
}
- (CPCompoundPredicateType)_compoundPredicateTypeForRootRows
@@ -403,32 +412,39 @@
#pragma mark Control delegate
- (void)_sendRuleAction
{
[self _updatePredicate];
[super _sendRuleAction];
}
- (BOOL)_sendsActionOnIncompleteTextChange
{
return NO;
}
/*
- (void)_setDefaultTargetAndActionOnView:(CPView)view
{
if ([view isKindOfClass:[CPControl class]])
{
[view setAction:@selector(_templateControlValueDidChange:)];
[view setTarget:self];
[view setAction:@selector(_templateControlValueDidChange:)];
}
}
- (void)controlTextDidEndEditing:(CPNotification)notification
{
[self _updatePredicate];
}
- (void)_templateControlValueDidChange:(id)sender
{
//[self _updatePredicate];
}
- (void)controlTextDidBeginEditing:(CPNotification)notification
{
}
- (void)controlTextDidEndEditing:(CPNotification)notification
{
}
- (void)controlTextDidChange:(CPNotification)notification
{
}
*/
#pragma mark RuleEditor delegate methods
@@ -439,24 +455,22 @@
var trees = (type == CPRuleEditorRowTypeSimple) ? _rootTrees : _rootHeaderTrees;
return [trees count];
}
return [[rowItem children] count];
}
- (id)_queryChild:(int)index ofItem:(id)rowItem withRowType:(int)type
- (id)_queryChild:(int)childIndex ofItem:(id)rowItem withRowType:(int)type
{
if (rowItem == nil)
{
var trees = (type == CPRuleEditorRowTypeSimple) ? _rootTrees : _rootHeaderTrees;
return [_CPPredicateEditorRowNode rowNodeFromTree:trees[index]];
return [_CPPredicateEditorRowNode rowNodeFromTree:trees[childIndex]];
}
return [[rowItem children] objectAtIndex:index];
return [[rowItem children] objectAtIndex:childIndex];
}
- (id)_queryValueForItem:(id)rowItem inRow:(int)rowIndex
{
[rowItem copyTemplateIfNecessary];
return [rowItem displayValue];
}
@@ -657,18 +657,18 @@ CPTransformableAttributeType = 1800;
if (attributeType >= CPInteger16AttributeType && attributeType <= CPFloatAttributeType)
{
view = [self _textFieldWithFrame:CGRectMake(0,0,50,26)];
view = [self _textFieldWithFrame:CGRectMake(0, 0, 50, 26)];
}
else if (attributeType == CPStringAttributeType)
{
view = [self _textFieldWithFrame:CGRectMake(0,0,150,26)];
view = [self _textFieldWithFrame:CGRectMake(0, 0, 150, 26)];
}
else if (attributeType == CPBooleanAttributeType)
{
view = [[CPCheckBox alloc] initWithFrame:CGRectMake(0,0,50,26)];
view = [[CPCheckBox alloc] initWithFrame:CGRectMake(0, 0, 50, 26)];
}
else if (attributeType == CPDateAttributeType)
view = [[CPDatePicker alloc] initWithFrame:CGRectMake(0,0,150,26)];
view = [[CPDatePicker alloc] initWithFrame:CGRectMake(0, 0, 150, 26)];
else
return nil;
+123 -58
View File
@@ -60,7 +60,7 @@ var itemsContext = "items",
/*!
@ingroup appkit
@class CPRuleEditor
@brief A view for creating and configuring criteria.
A CPRuleEditor object is a view that allows the user to visually create and configure a list of options which are expressed by the rule editor as a predicate (see Predicate documentation). The view has a delegate which offers a tree of choices to the view. The choices are presented by the view to the user as a row of popup buttons, static text fields, and custom views. Each row in the list represents a particular path down the tree of choices.
@@ -157,7 +157,6 @@ var itemsContext = "items",
[self setBoundArrayKeyPath:@"boundArray"];
_slicesHolder = [[_CPRuleEditorViewSliceHolder alloc] initWithFrame:[self bounds]];
[_slicesHolder setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
[self addSubview:_slicesHolder];
_boundArrayOwner = [[_CPRuleEditorViewUnboundRowHolder alloc] init];
@@ -182,6 +181,8 @@ var itemsContext = "items",
var animation = [[CPViewAnimation alloc] initWithDuration:0.5 animationCurve:CPAnimationEaseInOut];
[self setAnimation:animation];
[_slicesHolder setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable];
_dropLineView = [self _createSliceDropSeparator];
[_slicesHolder addSubview:_dropLineView];
@@ -617,7 +618,7 @@ TODO: implement
if (lastSelected >= [self numberOfRows])
[CPException raise:CPRangeException reason:@"row indexes " + indexes + " are out of range"];
if (!extend)
[self _deselectAll];
@@ -627,7 +628,7 @@ TODO: implement
rowIndex = [slice rowIndex],
contains = [indexes containsIndex:rowIndex];
shouldSelect = (contains && !(extend && [slice _isSelected]));
if (contains)
[slice _setSelected:shouldSelect];
[slice _setLastSelected:(rowIndex == lastSelected)];
@@ -1053,7 +1054,7 @@ TODO: implement
@param rowType The type of the row.
@return An object representing the requested child (or root) criterion. This object is used by the delegate to represent that position in the tree, and is passed as a parameter in subsequent calls to the delegate.
@discussion This method is required.
- (id)ruleEditor:(CPRuleEditor)editor child:(CPInteger)index forCriterion:(id)criterion withRowType:(CPRuleEditorRowType)rowType
*/
@@ -1358,9 +1359,9 @@ TODO: implement
- (CPMutableArray)_getItemsAndValuesToAddForRow:(int)rowIndex ofType:(CPRuleEditorRowType)type
{
var cachedItemsAndValues = _itemsAndValuesToAddForRowType[type];
if (cachedItemsAndValues)
return cachedItemsAndValues;
//var cachedItemsAndValues = _itemsAndValuesToAddForRowType[type];
//if (cachedItemsAndValues)
// return cachedItemsAndValues;
var itemsAndValues = [CPMutableArray array],
items = [CPMutableArray array],
@@ -1513,41 +1514,38 @@ TODO: implement
}
}
- (void)_changedItem:(id)oldItem toItem:(id)newItem inRow:(int)rowIndex atCriteriaIndex:(int)indexInCriteria
- (void)_changedItem:(id)fromItem toItem:(id)toItem inRow:(int)aRow atCriteriaIndex:(int)fromItemIndex
{
var criteria = [self criteriaForRow:rowIndex],
values = [self displayValuesForRow:rowIndex],
type = [self rowTypeForRow:rowIndex],
var criteria = [self criteriaForRow:aRow],
displayValues = [self displayValuesForRow:aRow],
rowType = [self rowTypeForRow:aRow],
anItem = toItem;
//fromItemIndex = [criteria indexOfObjectIdenticalTo:fromItem];
itemToAdd = newItem,
relativeIndexInCriteria = 0,
num_childs = 1000,
var items = [criteria subarrayWithRange:CPMakeRange(0, fromItemIndex)],
values = [displayValues subarrayWithRange:CPMakeRange(0, fromItemIndex)];
remainingRange = CPMakeRange(0, indexInCriteria),
finalCriteria = [[CPMutableArray alloc] initWithArray:[criteria subarrayWithRange:remainingRange]],
finalValues = [[CPMutableArray alloc] initWithArray:[values subarrayWithRange:remainingRange]];
_lastRow = aRow;
while (num_childs > 0)
while (YES)
{
var displayvalue = [self _queryValueForItem:itemToAdd inRow:rowIndex];
[items addObject:anItem];
var value = [self _queryValueForItem:anItem inRow:aRow];
[values addObject:value];
[finalCriteria addObject:itemToAdd];
[finalValues addObject:displayvalue];
if (![self _queryNumberOfChildrenOfItem:anItem withRowType:rowType])
break;
num_childs = [self _queryNumberOfChildrenOfItem:itemToAdd withRowType:type];
if (num_childs > 0)
itemToAdd = [self _queryChild:0 ofItem:itemToAdd withRowType:type];
relativeIndexInCriteria++;
anItem = [self _queryChild:0 ofItem:anItem withRowType:rowType];
}
var object = [[self _rowCacheForIndex:rowIndex] rowObject];
[object setValue:finalCriteria forKey:_itemsKeyPath];
[object setValue:finalValues forKey:_valuesKeyPath];
[[_slices objectAtIndex:rowIndex] _reconfigureSubviews];
var object = [[self _rowCacheForIndex:aRow] rowObject];
[object setValue:items forKey:_itemsKeyPath];
[object setValue:values forKey:_valuesKeyPath];
var slice = [_slices objectAtIndex:aRow];
[slice _reconfigureSubviews];
[self _sendRuleAction];
[self _postRuleOptionChangedNotification];
}
@@ -1667,11 +1665,17 @@ TODO: implement
return;
}
if ([observableController respondsToSelector:@selector(objectClass)])
_rowClass = [observableController objectClass];
if ([binding isEqualToString:@"rows"])
[self _setBoundDataSource:observableController withKeyPath:keyPath options:options];
{
if ([observableController respondsToSelector:@selector(objectClass)])
_rowClass = [observableController objectClass];
[self _setBoundDataSource:observableController withKeyPath:keyPath options:options];
}
else if ([binding isEqualToString:CPValueBinding])
[super bind:binding toObject:observableController withKeyPath:keyPath options:options];
else
[CPException raise:CPInvalidArgumentException reason:"Keypath or bound object cannot be nil"];
}
- (void)unbind:(id)object
@@ -1801,19 +1805,18 @@ TODO: implement
- (void)animationDidEnd:(CPViewAnimation)animation
{
var nextSimple = [self _getItemsAndValuesToAddForRow:0 ofType:CPRuleEditorRowTypeSimple],
nextCompound = [self _getItemsAndValuesToAddForRow:0 ofType:CPRuleEditorRowTypeCompound];
// var nextSimple = [self _getItemsAndValuesToAddForRow:0 ofType:CPRuleEditorRowTypeSimple],
// nextCompound = [self _getItemsAndValuesToAddForRow:0 ofType:CPRuleEditorRowTypeCompound];
_itemsAndValuesToAddForRowType = {CPRuleEditorRowTypeSimple:nextSimple, CPRuleEditorRowTypeCompound:nextCompound};
// _itemsAndValuesToAddForRowType = {CPRuleEditorRowTypeSimple:nextSimple, CPRuleEditorRowTypeCompound:nextCompound};
}
- (void)_updateSliceRows
{
var width = [self frame].size.width,
count = [_slices count],
i;
count = [_slices count];
for (i = 0; i < count; i++)
for (var i = 0; i < count; i++)
{
var slice = [_slices objectAtIndex:i],
targetRect = CGRectMake(0, i * _sliceHeight, width, _sliceHeight);
@@ -1937,7 +1940,7 @@ TODO: implement
var modifierFlags = [event modifierFlags],
extend = (modifierFlags & CPCommandKeyMask) || (modifierFlags & CPShiftKeyMask),
rowIndexes = [CPIndexSet indexSetWithIndex:[slice rowIndex]];
[self selectRowIndexes:rowIndexes byExtendingSelection:extend];
}
@@ -2091,7 +2094,7 @@ TODO: implement
if ([selected_indices containsIndex:mainRowIndex])
[draggingRows addIndexes:selected_indices];
_draggingRows = [self _includeSubslicesForSlicesAtIndexes:draggingRows];
var firstIndex = [_draggingRows firstIndex],
firstSlice = [_slices objectAtIndex:firstIndex],
dragview = [[CPView alloc] initWithFrame:[firstSlice frame]];
@@ -2307,6 +2310,61 @@ TODO: implement
[self sendAction:[self action] to:[self target]];
}
- (BOOL)_sendsActionOnIncompleteTextChange
{
return YES;
}
- (void)_getAllAvailableItems:(id)items values:(id)values asChildrenOfItem:(id)parentItem inRow:(int)aRow
{
var type,
indexofCriterion,
numOfChildren;
var availItems = [CPMutableArray array],
availValues = [CPMutableArray array];
var criterion = nil,
value = nil;
_lastRow = aRow;
type = [self rowTypeForRow:aRow];
numOfChildren = [self _queryNumberOfChildrenOfItem:parentItem withRowType:type];
var criteria = [self criteriaForRow:aRow];
indexofCriterion = [criteria indexOfObject:criterion];
if (parentItem != nil
&& indexofCriterion != CPNotFound
&& indexofCriterion < [criteria count] - 1)
{
var next = indexofCriterion + 1;
criterion = [criteria objectAtIndex:next];
var values = [self displayValuesForRow:aRow];
value = [values objectAtIndex:next];
}
for (var i = 0; i < numOfChildren; ++i)
{
var aChild = [self _queryChild:i ofItem:parentItem withRowType:type];
var availChild = aChild,
availValue = value;
if ( criterion != aChild )
availValue = [self _queryValueForItem:aChild inRow:aRow];
if ( !availValue )
availValue = [self _queryValueForItem:availChild inRow:aRow];
[availItems addObject:availChild];
[availValues addObject:availValue];
}
[items addObjectsFromArray:availItems];
[values addObjectsFromArray:availValues];
}
@end
var CPRuleEditorAlignmentGridWidthKey = @"CPRuleEditorAlignmentGridWidth",
@@ -2508,24 +2566,31 @@ var dropSeparatorColor = [CPColor colorWithHexString:@"4886ca"];
@end
@implementation CPControl (ToolTip)
@implementation CPObject (CPRuleEditorSliceRow)
- (void)setToolTip:(CPString)aToolTip
- (int)valueType
{
if (_toolTip == aToolTip)
return;
var result = 0;
_toolTip = aToolTip;
#if PLATFORM(DOM)
_DOMElement.title = aToolTip;
#endif
}
var isString = [self isKindOfClass:[CPString class]];
if ( !isString )
{
var isView = [self isKindOfClass:[CPView class]];
result = 1;
if ( !isView )
{
var ismenuItem = [self isKindOfClass:[CPMenuItem class]];
result = 2;
if ( !ismenuItem )
{
[CPException raise:CPGenericException reason:@"Unknown Type For " + self];
result = -1;
}
}
}
- (CPString)toolTip
{
return _toolTip;
return result;
}
@end
/*! @endcond */
+63 -22
View File
@@ -12,60 +12,101 @@
CPArray children @accessors(copy);
}
- (BOOL)applyTemplate:(id)template withViews:(id)views forOriginalTemplate:(id)arg3
{
return YES; // not in use
}
+ (id)rowNodeFromTree:(id)aTree
{
return [_CPPredicateEditorRowNode _rowNodeFromTree:aTree withTemplate:[aTree template]];
var mapTable = {};
return [_CPPredicateEditorRowNode _rowNodeFromTree:aTree withTemplateTable:mapTable];
}
+ (id)_rowNodeFromTree:(id)aTree withTemplate:(id)template
+ (id)_rowNodeFromTree:(id)aTree withTemplateTable:(id)templateTable
{
var nodeChildren = [CPArray array],
var node,
views,
copiedContainer;
node = [[_CPPredicateEditorRowNode alloc] init];
node.tree = aTree;
var template = [aTree template],
uuid = [template UID];
var cachedNode = templateTable[uuid];
if (cachedNode == nil)
{
views = [CPMutableArray array];
copiedContainer = [CPMutableArray array];
templateTable[uuid] = node;
}
else
{
views = [cachedNode templateViews];
copiedContainer = [cachedNode copiedTemplateContainer];
}
node.templateViews = views;
node.copiedTemplateContainer = copiedContainer;
var nodeChildren = [CPMutableArray array],
treeChildren = [aTree children],
count = [treeChildren count];
for (var i = 0; i < count; i++)
{
var childnode = [self _rowNodeFromTree:treeChildren[i] withTemplate:template];
[nodeChildren addObject:childnode];
var treeChild = treeChildren[i],
child = [_CPPredicateEditorRowNode _rowNodeFromTree:treeChild withTemplateTable:templateTable];
[nodeChildren addObject:child];
}
var node = [_CPPredicateEditorRowNode new];
[node setTree:aTree];
[node setCopiedTemplateContainer:[CPMutableArray arrayWithObject:template]];
[node setTemplateViews:[template templateViews]];
[node setChildren:nodeChildren];
return node;
}
- (BOOL)applyTemplate:(id)template withViews:(id)views forOriginalTemplate:(id)originalTemplate
{
var t = [tree template];
if (t !== template)
{
[templateViews setArray:views];
[copiedTemplateContainer removeAllObjects];
[copiedTemplateContainer addObject:template];
}
var count = [children count];
for (var i; i < count; i++)
[children[i] applyTemplate:template withViews:views forOriginalTemplate:originalTemplate];
}
- (BOOL)isEqual:(id)node
{
return (self === node || tree === [node tree]);
if (![node isKindOfClass:[_CPPredicateEditorRowNode class]])
return NO;
return (tree === [node tree]);
}
- (void)copyTemplateIfNecessary
{
if ([[self templateForRow] rightIsWildcard])
if ([copiedTemplateContainer count] == 0)
{
CPLogConsole("COPYING TEMPLATE");
var copy = [[tree template] copy];
[self setCopiedTemplateContainer:[CPMutableArray arrayWithObject:copy]];
[self setTemplateViews:[copy templateViews]];
[copiedTemplateContainer addObject:copy];
[templateViews addObjectsFromArray:[copy templateViews]];
}
}
- (CPView)templateView
{
[self copyTemplateIfNecessary];
return [templateViews objectAtIndex:[tree indexIntoTemplate]];
}
- (id)templateForRow
{
[self copyTemplateIfNecessary];
return [copiedTemplateContainer lastObject];
}
@@ -77,15 +118,15 @@
- (id)displayValue
{
var title = [self title];
if (title == nil)
return [self templateView];
if (title != nil)
return title;
return title;
return [self templateView];
}
- (CPString)description
{
return [CPString stringWithFormat:@"<%@ %@ %@ %p>", [self className], [self title], [self displayValue], self];
return [CPString stringWithFormat:@"<%@ %@ %@ tree:%@ tviews:%@", [self className],[self UID], [self title], [tree UID], [templateViews description]];
}
@end
+152 -133
View File
@@ -41,8 +41,8 @@ var CONTROL_HEIGHT = 16.,
_addButton = [self _createAddRowButton];
_subtractButton = [self _createDeleteRowButton];
[_addButton setToolTip:[_ruleEditor _toolTipForAddSimpleRowButton]];
[_subtractButton setToolTip:[_ruleEditor _toolTipForDeleteRowButton]];
//[_addButton setToolTip:[_ruleEditor _toolTipForAddSimpleRowButton]];
//[_subtractButton setToolTip:[_ruleEditor _toolTipForDeleteRowButton]];
[_addButton setHidden:!editable];
[_subtractButton setHidden:!editable];
[self addSubview:_addButton];
@@ -81,15 +81,16 @@ var CONTROL_HEIGHT = 16.,
- (CPMenuItem)_createMenuItemWithTitle:(CPString )title
{
title = [[_ruleEditor standardLocalizer] localizedStringForString:title];
return [[CPMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""];
var mItem = [[CPMenuItem alloc] initWithTitle:title action:nil keyEquivalent:@""];
return mItem;
}
- (CPPopUpButton)_createPopUpButtonWithItems:(CPArray)itemsArray selectedItemIndex:(int)index
{
var title = [[itemsArray objectAtIndex:index] title],
font = [_ruleEditor font],
var title = [[itemsArray objectAtIndex:index] title];
var font = [_ruleEditor font],
width = [title sizeWithFont:font].width + 20,
rect = CGRectMake(0, ([_ruleEditor rowHeight] - CONTROL_HEIGHT)/2, (width - width % 40) + 80, CONTROL_HEIGHT);
rect = CGRectMake(0, 0, (width - width % 40) + 80, CONTROL_HEIGHT);
var popup = [[_CPRuleEditorPopUpButton alloc] initWithFrame:rect];
[popup setValue:font forThemeAttribute:@"font"];
@@ -143,10 +144,10 @@ var CONTROL_HEIGHT = 16.,
{
var layoutdict = [sender representedObject],
newItem = [layoutdict objectForKey:@"item"],
indexInCriteria = [[layoutdict objectForKey:@"indexInCriteria"] intValue],
indexInCriteria = [layoutdict objectForKey:@"indexInCriteria"],
oldItem = [_correspondingRuleItems objectAtIndex:indexInCriteria];
if (newItem != oldItem)
if (![newItem isEqual:oldItem])
{
[_correspondingRuleItems replaceObjectAtIndex:indexInCriteria withObject:newItem];
[_ruleEditor _changedItem:oldItem toItem:newItem inRow:_rowIndex atCriteriaIndex:indexInCriteria];
@@ -172,150 +173,189 @@ var CONTROL_HEIGHT = 16.,
- (void)_reconfigureSubviews
{
var numItems;
currentItem = nil,
optionView = nil,
indexInCriteria = 0,
var ruleItems,
criteria,
repObject,
menuItem,
ruleView,
criterion,
parent,
numberOfCriteria,
numberOfChildren,
firstResponderIndex;
rowtype = [_ruleEditor rowTypeForRow:_rowIndex],
displayValues = [_ruleEditor displayValuesForRow:_rowIndex];
var ruleItems = [CPMutableArray array];
[self _emptyRulePartSubviews];
[_correspondingRuleItems removeAllObjects];
while ((numItems = [_ruleEditor _queryNumberOfChildrenOfItem:currentItem withRowType:rowtype]) > 0)
criteria = [_ruleEditor criteriaForRow:_rowIndex];
numberOfCriteria = [criteria count];
firstResponderIndex = numberOfCriteria - 1;
var responder = [[self window] firstResponder];
if (responder)
firstResponderIndex = [_ruleOptionViews indexOfObjectIdenticalTo:responder];
for (var i = 0; i < numberOfCriteria; i++)
{
var isCustomRightControl = NO;
isStaticTextField = NO,
isPopupMenu = NO,
isMultiValue = numItems > 1,
selectedMenuItemIndex = 0,
selectedItem = nil,
current_display_value = nil,
ruleView = nil;
parent = nil;
criterion = [criteria objectAtIndex:i];
itemsArray = [CPMutableArray array],
display_value_cached = [displayValues objectAtIndex:indexInCriteria];
if (i > 0)
parent = [criteria objectAtIndex:i - 1];
for (var childIndex = 0; childIndex < numItems; childIndex++)
var childItems = [],
childValues = [];
[_ruleEditor _getAllAvailableItems:childItems values:childValues asChildrenOfItem:parent inRow:_rowIndex];
numberOfChildren = [childItems count];
if (numberOfChildren > 1)
{
var childItem = [_ruleEditor _queryChild:childIndex ofItem:currentItem withRowType:rowtype];
current_display_value = [_ruleEditor _queryValueForItem:childItem inRow:_rowIndex];
var menuItems = [CPMutableArray arrayWithCapacity:numberOfChildren];
if (isMultiValue)
var selectedIndex = [childItems indexOfObject:criterion];
if (selectedIndex == CPNotFound)
break;
for (var j = 0; j < numberOfChildren; ++j)
{
var menuItem;
var childItem = [childItems objectAtIndex:j];
var childValue = [childValues objectAtIndex:j];
if ([current_display_value isKindOfClass:[CPString class]])
menuItem = [self _createMenuItemWithTitle:current_display_value];
else if ([current_display_value isKindOfClass:[CPMenuItem class]])
menuItem = current_display_value;
else
[CPException raise:CPInternalInconsistencyException reason:@"Display value must be a string or a menu item"];
var layoutDictionary = [CPDictionary dictionaryWithObjectsAndKeys:childItem, @"item", indexInCriteria, @"indexInCriteria"];
[menuItem setAction:@selector(_ruleOptionPopupChangedAction:)];
[menuItem setTarget:self];
[menuItem setRepresentedObject:layoutDictionary];
[menuItem setTag:indexInCriteria];
[itemsArray addObject:menuItem];
isPopupMenu = YES;
if ((childIndex == numItems - 1 && selectedItem == nil)
|| ([current_display_value isEqual:display_value_cached])
|| ([current_display_value isKindOfClass:[CPView class]]
&& [[current_display_value objectValue] isEqualTo:[display_value_cached objectValue]]))
if ([childValue isKindOfClass:[CPMenuItem class]])
{
selectedItem = childItem;
selectedMenuItemIndex = childIndex;
[[childValue menu] removeItem:childValue];
menuItem = childValue;
}
else
{
if ([childValue isEqualToString:@""])
menuItem = [self _createMenuSeparatorItem];
else
{
menuItem = [self _createMenuItemWithTitle:childValue];
[menuItem setTarget:self];
[menuItem setAction:@selector(_ruleOptionPopupChangedAction:)];
}
}
repObject = [CPDictionary dictionaryWithObjectsAndKeys:childItem, @"item", childValue, @"value", i, @"indexInCriteria"];
[menuItem setRepresentedObject:repObject];
[menuItems addObject:menuItem];
}
else if ([current_display_value isKindOfClass:[CPString class]])
ruleView = [self _createPopUpButtonWithItems:menuItems selectedItemIndex:selectedIndex];
}
else
{
var value = [childValues objectAtIndex:0];
var type = [value valueType];
if (type === 0)
ruleView = [self _createStaticTextFieldWithStringValue:value];
else
{
isStaticTextField = YES;
selectedItem = childItem;
selectedMenuItemIndex =0;
if (type !== 1)
{
[CPException raise:CPInternalInconsistencyException reason:@"Display value must be a string or a menu item"];
continue;
}
ruleView = value;
[ruleView setTarget:self];
[ruleView setAction:@selector(_sendRuleAction:)];
if ([ruleView respondsToSelector:@selector(setDelegate:)])
[ruleView setDelegate:self];
}
else if ([current_display_value isKindOfClass:[CPView class]])
{
isCustomRightControl = YES;
selectedItem = childItem;
selectedMenuItemIndex = 0;
} else
[CPException raise:CPInternalInconsistencyException reason:@"Display value must be a string or a custom control"];
}
if (isPopupMenu)
if (ruleView != nil)
{
optionView = [self _createPopUpButtonWithItems:itemsArray selectedItemIndex:selectedMenuItemIndex];
}
else if (isStaticTextField)
{
optionView = [self _createStaticTextFieldWithStringValue:[current_display_value description]];
}
else if (isCustomRightControl)
{
optionView = display_value_cached; //display_value_cached
[optionView setTarget:self];
[optionView setAction:@selector(_sendRuleAction:)];
if ([optionView respondsToSelector:@selector(setEditable:)])
[optionView setEditable:editable];
}
[_ruleOptionViews addObject:ruleView];
var frame = [ruleView frame];
[_ruleOptionInitialViewFrames addObject:frame];
[_ruleOptionFrames addObject:frame];
if (optionView)
{
[_ruleOptionViews addObject:optionView];
[_ruleOptionInitialViewFrames addObject:[optionView frame]];
[_ruleOptionFrames addObject:[optionView frame]];
}
if (!criterion)
criterion = [CPNull null];
[_correspondingRuleItems addObject:selectedItem];
currentItem = selectedItem;
indexInCriteria++;
[ruleItems addObject:criterion];
}
}
[self _relayoutSubviewsWidthChanged:(CGRectGetWidth([self frame]) != [_ruleEditor rowHeight])];
[_correspondingRuleItems setArray:ruleItems];
if (!editable)
[self _updateEnabledStateForSubviews];
[self _relayoutSubviewsWidthChanged:YES];
if (firstResponderIndex != CPNotFound)
{
var aView = [_ruleOptionViews objectAtIndex:firstResponderIndex];
[[self window] makeFirstResponder:aView]; // This is not working. bug in CPPopUpButton firstResponder ?
}
//[self setNeedsDisplay:YES];
}
- (void)_updateEnabledStateForSubviews
{
[_ruleOptionViews makeObjectsPerformSelector:@selector(setEnabled:) withObject:NO];
}
- (void)layoutSubviews
{
// CPLogConsole(_cmd);
[self _relayoutSubviewsWidthChanged:YES];
}
- (void)_relayoutSubviewsWidthChanged:(BOOL)widthChanged
{
var optionViewOriginX,
leftHorizontalPadding,
leftButtonMinX,
rowHeight = [_ruleEditor rowHeight],
count = [_ruleOptionViews count],
sliceFrame = [self frame];
if (widthChanged)
optionViewOriginX = [self _leftmostViewFixedHorizontalPadding] + [self _indentationHorizontalPadding]*[self indentation];
for (var i = 0; i < count; i++)
{
var ruleOptionView = _ruleOptionViews[i],
optionFrame = _ruleOptionFrames[i],
initialFrame = _ruleOptionInitialViewFrames[i];
optionFrame.origin.y = (rowHeight - CGRectGetHeight(optionFrame))/2 - 2;
if (widthChanged)
{
optionFrame.origin.x = optionViewOriginX;
optionFrame.size.width = MIN(CGRectGetMinX(optionFrame) + CGRectGetWidth(initialFrame), CGRectGetMinX([_subtractButton frame]) - [self _rowButtonsLeftHorizontalPadding]) - CGRectGetMinX(optionFrame);
}
[ruleOptionView setFrame:optionFrame];
[self addSubview:ruleOptionView];
if (widthChanged)
optionViewOriginX += CGRectGetWidth(optionFrame) + [self _interviewHorizontalPadding];
}
var buttonFrame = CGRectMake(CGRectGetWidth(sliceFrame) - BUTTON_HEIGHT - [self _rowButtonsRightHorizontalPadding], ([_ruleEditor rowHeight] - BUTTON_HEIGHT)/2 - 2, BUTTON_HEIGHT, BUTTON_HEIGHT);
[_addButton setFrame:buttonFrame];
buttonFrame.origin.x -= BUTTON_HEIGHT + [self _rowButtonsInterviewHorizontalPadding];
[_subtractButton setFrame:buttonFrame];
if (widthChanged)
{
optionViewOriginX = [self _leftmostViewFixedHorizontalPadding] + [self _indentationHorizontalPadding] * _indentation;
leftHorizontalPadding = [self _rowButtonsLeftHorizontalPadding];
leftButtonMinX = CGRectGetMinX(buttonFrame);
}
for (var i = 0; i < count; i++)
{
var ruleOptionView = _ruleOptionViews[i],
optionFrame = _ruleOptionFrames[i];
optionFrame.origin.y = (rowHeight - CGRectGetHeight(optionFrame))/2 - 2;
if (widthChanged)
{
optionFrame.origin.x = optionViewOriginX;
if (i == count - 1 && ![self _isRulePopup:ruleOptionView])
{
var initialFrame = _ruleOptionInitialViewFrames[i];
optionFrame.size.width = MIN(CGRectGetWidth(initialFrame), leftButtonMinX - leftHorizontalPadding - optionViewOriginX);
}
}
[ruleOptionView setFrame:optionFrame];
[self addSubview:ruleOptionView];
if (widthChanged)
optionViewOriginX += CGRectGetWidth(optionFrame) + [self _interviewHorizontalPadding];
}
}
- (void)_updateButtonVisibilities
@@ -438,31 +478,10 @@ var CONTROL_HEIGHT = 16.,
- (void)_textDidChange:(CPNotification)aNotif
{
if ([[aNotif object] superview] == self)
if ([[aNotif object] superview] == self && [_ruleEditor _sendsActionOnIncompleteTextChange])
[_ruleEditor _sendRuleAction];
}
/*
- (BOOL)_dropsIndentWhenImmediatelyBelow
{
}
- (double)_minWidthForPass:(int)pass forView:(id)view withProposedMinWidth:(double)minWidth
{
}
- (id)_sortOptionDictionariesByLayoutOrder:(id)fp8
{
}
- (void)_setHideNonPartDrawing:(BOOL)value
{
}
- (void)_tightenResizables:(id)fp8 intoGivenWidth:(double)fp12
{
}
- (void)_updateEnabledStateForSubviews
{
}
*/
@end
@implementation _CPRuleEditorTextField : CPTextField
@@ -490,4 +509,4 @@ var CONTROL_HEIGHT = 16.,
return [self superview];
}
@end
@end
@@ -11,7 +11,7 @@
@implementation AppController : CPObject
{
CPWindow window;
CPRuleEditor predicateEditor;
CPPredicateEditor predicateEditor;
CPTextField predicateField;
CPTableView leftTable;
@@ -33,6 +33,9 @@
[templateBox setCornerRadius:10];
[self updateAddTemplateButton];
[predicateEditor setAction:@selector(predicateEditorAction:)];
[predicateEditor setTarget:self];
[window setBackgroundColor:[CPColor colorWithHexString:@"f3f4f5"]];
[window setFullBridge:YES];
@@ -47,13 +50,13 @@
- (IBAction)predicateEditorAction:(id)sender
{
[predicateEditor reloadPredicate];
// CPLogConsole(_cmd + [predicateEditor displayValuesForRow:1]);
[predicateField setStringValue:[[predicateEditor objectValue] predicateFormat]];
}
- (void)ruleEditorRowsDidChange:(CPNotification)notification
{
CPLogConsole(_cmd);
}
// Templates maker
File diff suppressed because one or more lines are too long
@@ -1151,11 +1151,12 @@
<string key="NSFrame">{{20, 476}, {611, 22}}</string>
<reference key="NSSuperview" ref="439893737"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="869316024"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1062851196">
<int key="NSCellFlags">-1804468671</int>
<int key="NSCellFlags2">268436480</int>
<string key="NSContents">string ENDSWITH "foo"</string>
<string key="NSContents">string MATCHES "foo"</string>
<reference key="NSSupport" ref="112893232"/>
<reference key="NSControlView" ref="884566601"/>
<bool key="NSDrawsBackground">YES</bool>
@@ -1195,17 +1196,17 @@
<reference key="NSNextResponder" ref="407607490"/>
<int key="NSvFlags">274</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSRuleEditorViewSliceRow" id="939521342">
<object class="NSRuleEditorViewSliceRow" id="356804940">
<reference key="NSNextResponder" ref="211063809"/>
<int key="NSvFlags">290</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="261593316">
<reference key="NSNextResponder" ref="939521342"/>
<object class="NSButton" id="163892837">
<reference key="NSNextResponder" ref="356804940"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{581, 4}, {18, 18}}</string>
<reference key="NSSuperview" ref="939521342"/>
<reference key="NSSuperview" ref="356804940"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="838952732"/>
<reference key="NSNextKeyView" ref="460920540"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSRuleEditorButtonCell" key="NSCell">
@@ -1223,9 +1224,9 @@
<integer value="1" key="NSAccessibilityEncodedAttributesValueType"/>
</dictionary>
</array>
<reference key="NSControlView" ref="261593316"/>
<reference key="NSControlView" ref="163892837"/>
<string key="NSAction">_addOption:</string>
<reference key="NSTarget" ref="939521342"/>
<reference key="NSTarget" ref="356804940"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<object class="NSFont" key="NSAlternateImage" id="28">
@@ -1238,13 +1239,13 @@
<int key="NSPeriodicInterval">75</int>
</object>
</object>
<object class="NSButton" id="81758585">
<reference key="NSNextResponder" ref="939521342"/>
<int key="NSvFlags">257</int>
<object class="NSButton" id="870073061">
<reference key="NSNextResponder" ref="356804940"/>
<int key="NSvFlags">-2147483391</int>
<string key="NSFrame">{{561, 4}, {18, 18}}</string>
<reference key="NSSuperview" ref="939521342"/>
<reference key="NSSuperview" ref="356804940"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="261593316"/>
<reference key="NSNextKeyView" ref="163892837"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSRuleEditorButtonCell" key="NSCell">
@@ -1258,9 +1259,9 @@
<integer value="1" key="NSAccessibilityEncodedAttributesValueType"/>
</dictionary>
</array>
<reference key="NSControlView" ref="81758585"/>
<reference key="NSControlView" ref="870073061"/>
<string key="NSAction">_deleteOption:</string>
<reference key="NSTarget" ref="939521342"/>
<reference key="NSTarget" ref="356804940"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="28"/>
@@ -1270,10 +1271,10 @@
</object>
</object>
<object class="NSPopUpButton" id="862982389">
<reference key="NSNextResponder" ref="939521342"/>
<reference key="NSNextResponder" ref="356804940"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{7, 4}, {58, 19}}</string>
<reference key="NSSuperview" ref="939521342"/>
<reference key="NSSuperview" ref="356804940"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="735996687"/>
<int key="NSTag">-1</int>
@@ -1338,12 +1339,12 @@
</object>
</object>
<object class="NSPopUpButton" id="735996687">
<reference key="NSNextResponder" ref="939521342"/>
<reference key="NSNextResponder" ref="356804940"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{71, 4}, {167, 19}}</string>
<reference key="NSSuperview" ref="939521342"/>
<reference key="NSSuperview" ref="356804940"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="81758585"/>
<reference key="NSNextKeyView" ref="870073061"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="740771535">
@@ -1400,7 +1401,7 @@
<string key="NSRuleOptionFrames.0">{{7, 4}, {58, 19}}</string>
<string key="NSRuleOptionFrames.1">{{71, 4}, {167, 19}}</string>
<array class="NSMutableArray" key="NSRuleOptionItems">
<dictionary class="NSMutableDictionary" id="677427269">
<dictionary class="NSMutableDictionary" id="244855320">
<integer value="1" key="depth"/>
<object class="NSPredicateEditorRowTemplate" key="pattern" id="171372468">
<int key="NSPredicateTemplateType">2</int>
@@ -1416,7 +1417,7 @@
<bool key="NSPredicateTemplateRightIsWildcard">NO</bool>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" id="489242046">
<dictionary class="NSMutableDictionary" id="430874292">
<integer value="2" key="depth"/>
<reference key="pattern" ref="171372468"/>
</dictionary>
@@ -1424,23 +1425,23 @@
<int key="NSRuleOptionInitialFrames.count">2</int>
<string key="NSRuleOptionInitialFrames.0">{{7, 4}, {58, 19}}</string>
<string key="NSRuleOptionInitialFrames.1">{{71, 4}, {167, 19}}</string>
<reference key="NSRuleOptionAddButton" ref="261593316"/>
<reference key="NSRuleOptionSubtractButton" ref="81758585"/>
<reference key="NSRuleOptionAddButton" ref="163892837"/>
<reference key="NSRuleOptionSubtractButton" ref="870073061"/>
<int key="NSRuleOptionRowType">0</int>
<int key="NSRuleOptionPlusButtonRowType">0</int>
<bool key="NSRuleOptionEditable">YES</bool>
</object>
<object class="NSRuleEditorViewSliceRow" id="838952732">
<object class="NSRuleEditorViewSliceRow" id="460920540">
<reference key="NSNextResponder" ref="211063809"/>
<int key="NSvFlags">290</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="536084415">
<reference key="NSNextResponder" ref="838952732"/>
<object class="NSButton" id="562951042">
<reference key="NSNextResponder" ref="460920540"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{581, 4}, {18, 18}}</string>
<reference key="NSSuperview" ref="838952732"/>
<reference key="NSSuperview" ref="460920540"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="407607490"/>
<reference key="NSNextKeyView" ref="629602464"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSRuleEditorButtonCell" key="NSCell">
@@ -1454,9 +1455,9 @@
<integer value="1" key="NSAccessibilityEncodedAttributesValueType"/>
</dictionary>
</array>
<reference key="NSControlView" ref="536084415"/>
<reference key="NSControlView" ref="562951042"/>
<string key="NSAction">_addOption:</string>
<reference key="NSTarget" ref="838952732"/>
<reference key="NSTarget" ref="460920540"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="28"/>
@@ -1465,13 +1466,13 @@
<int key="NSPeriodicInterval">75</int>
</object>
</object>
<object class="NSButton" id="106975478">
<reference key="NSNextResponder" ref="838952732"/>
<object class="NSButton" id="446117794">
<reference key="NSNextResponder" ref="460920540"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{561, 4}, {18, 18}}</string>
<reference key="NSSuperview" ref="838952732"/>
<reference key="NSSuperview" ref="460920540"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="536084415"/>
<reference key="NSNextKeyView" ref="562951042"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSRuleEditorButtonCell" key="NSCell">
@@ -1485,9 +1486,9 @@
<integer value="1" key="NSAccessibilityEncodedAttributesValueType"/>
</dictionary>
</array>
<reference key="NSControlView" ref="106975478"/>
<reference key="NSControlView" ref="446117794"/>
<string key="NSAction">_deleteOption:</string>
<reference key="NSTarget" ref="838952732"/>
<reference key="NSTarget" ref="460920540"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="28"/>
@@ -1497,10 +1498,10 @@
</object>
</object>
<object class="NSPopUpButton" id="78209235">
<reference key="NSNextResponder" ref="838952732"/>
<reference key="NSNextResponder" ref="460920540"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{37, 4}, {79, 19}}</string>
<reference key="NSSuperview" ref="838952732"/>
<reference key="NSSuperview" ref="460920540"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="729950799"/>
<int key="NSTag">-1</int>
@@ -1509,19 +1510,6 @@
<int key="NSCellFlags">67239488</int>
<int key="NSCellFlags2">4196352</int>
<reference key="NSSupport" ref="26"/>
<object class="NSKeyPathExpression" key="NSRepresentedObject" id="76879785">
<int key="NSExpressionType">3</int>
<string key="NSSelectorName">valueForKey:</string>
<object class="NSSelfExpression" key="NSOperand" id="482739528">
<int key="NSExpressionType">1</int>
</object>
<array class="NSMutableArray" key="NSArguments">
<object class="NSKeyPathSpecifierExpression">
<int key="NSExpressionType">10</int>
<string key="NSKeyPath">string</string>
</object>
</array>
</object>
<reference key="NSControlView" ref="78209235"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
@@ -1529,9 +1517,9 @@
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="232834514">
<object class="NSMenuItem" key="NSMenuItem" id="186315633">
<reference key="NSMenu" ref="586880274"/>
<string key="NSTitle">astring</string>
<string key="NSTitle">string</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
@@ -1539,15 +1527,14 @@
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSRepObject" ref="76879785"/>
<reference key="NSTarget" ref="83480964"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="586880274">
<string key="NSTitle"/>
<array class="NSMutableArray" key="NSMenuItems">
<reference ref="232834514"/>
<object class="NSMenuItem" id="540884058">
<reference ref="186315633"/>
<object class="NSMenuItem" id="477727226">
<reference key="NSMenu" ref="586880274"/>
<string key="NSTitle">string2</string>
<string key="NSKeyEquiv"/>
@@ -1556,17 +1543,6 @@
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<object class="NSKeyPathExpression" key="NSRepObject">
<int key="NSExpressionType">3</int>
<string key="NSSelectorName">valueForKey:</string>
<reference key="NSOperand" ref="482739528"/>
<array class="NSMutableArray" key="NSArguments">
<object class="NSKeyPathSpecifierExpression">
<int key="NSExpressionType">10</int>
<string key="NSKeyPath">string2</string>
</object>
</array>
</object>
<reference key="NSTarget" ref="83480964"/>
</object>
</array>
@@ -1579,10 +1555,10 @@
</object>
</object>
<object class="NSPopUpButton" id="729950799">
<reference key="NSNextResponder" ref="838952732"/>
<reference key="NSNextResponder" ref="460920540"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{122, 4}, {99, 19}}</string>
<reference key="NSSuperview" ref="838952732"/>
<reference key="NSSuperview" ref="460920540"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="770001068"/>
<int key="NSTag">-1</int>
@@ -1591,7 +1567,7 @@
<int key="NSCellFlags">67239488</int>
<int key="NSCellFlags2">4196352</int>
<reference key="NSSupport" ref="26"/>
<integer value="8" key="NSRepresentedObject"/>
<integer value="4" key="NSRepresentedObject"/>
<reference key="NSControlView" ref="729950799"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
@@ -1599,9 +1575,9 @@
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="978983751">
<object class="NSMenuItem" key="NSMenuItem" id="46876958">
<reference key="NSMenu" ref="454623134"/>
<string key="NSTitle">begins with</string>
<string key="NSTitle">is</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
@@ -1609,48 +1585,24 @@
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<integer value="8" key="NSRepObject"/>
<integer value="4" key="NSRepObject"/>
<reference key="NSTarget" ref="215986163"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="454623134">
<string key="NSTitle"/>
<array class="NSMutableArray" key="NSMenuItems">
<reference ref="978983751"/>
<object class="NSMenuItem" id="531788973">
<reference ref="46876958"/>
<object class="NSMenuItem" id="637036835">
<reference key="NSMenu" ref="454623134"/>
<string key="NSTitle">is not</string>
<string key="NSTitle">matches</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<integer value="5" key="NSRepObject"/>
<reference key="NSTarget" ref="215986163"/>
</object>
<object class="NSMenuItem" id="756867223">
<reference key="NSMenu" ref="454623134"/>
<string key="NSTitle">ends with</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<integer value="9" key="NSRepObject"/>
<reference key="NSTarget" ref="215986163"/>
</object>
<object class="NSMenuItem" id="254043602">
<reference key="NSMenu" ref="454623134"/>
<string key="NSTitle">contains</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<integer value="99" key="NSRepObject"/>
<integer value="6" key="NSRepObject"/>
<reference key="NSTarget" ref="215986163"/>
</object>
</array>
@@ -1663,12 +1615,12 @@
</object>
</object>
<object class="NSTextField" id="770001068">
<reference key="NSNextResponder" ref="838952732"/>
<reference key="NSNextResponder" ref="460920540"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{227, 4}, {160, 18}}</string>
<reference key="NSSuperview" ref="838952732"/>
<reference key="NSSuperview" ref="460920540"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="106975478"/>
<reference key="NSNextKeyView" ref="446117794"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell">
<int key="NSCellFlags">343014976</int>
@@ -1705,7 +1657,7 @@
<string key="NSRuleOptionFrames.1">{{122, 4}, {99, 19}}</string>
<string key="NSRuleOptionFrames.2">{{227, 4}, {160, 18}}</string>
<array class="NSMutableArray" key="NSRuleOptionItems">
<dictionary class="NSMutableDictionary" id="866224734">
<dictionary class="NSMutableDictionary" id="182370408">
<integer value="1" key="depth"/>
<object class="NSPredicateEditorRowTemplate" key="pattern" id="626549045">
<int key="NSPredicateTemplateType">1</int>
@@ -1722,11 +1674,11 @@
<bool key="NSPredicateTemplateRightIsWildcard">YES</bool>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" id="353749474">
<dictionary class="NSMutableDictionary" id="261381641">
<integer value="2" key="depth"/>
<reference key="pattern" ref="626549045"/>
</dictionary>
<dictionary class="NSMutableDictionary" id="638210389">
<dictionary class="NSMutableDictionary" id="174024543">
<integer value="3" key="depth"/>
<reference key="pattern" ref="626549045"/>
</dictionary>
@@ -1735,8 +1687,240 @@
<string key="NSRuleOptionInitialFrames.0">{{37, 4}, {79, 19}}</string>
<string key="NSRuleOptionInitialFrames.1">{{122, 4}, {99, 19}}</string>
<string key="NSRuleOptionInitialFrames.2">{{227, 4}, {160, 18}}</string>
<reference key="NSRuleOptionAddButton" ref="536084415"/>
<reference key="NSRuleOptionSubtractButton" ref="106975478"/>
<reference key="NSRuleOptionAddButton" ref="562951042"/>
<reference key="NSRuleOptionSubtractButton" ref="446117794"/>
<int key="NSRuleOptionRowType">0</int>
<int key="NSRuleOptionPlusButtonRowType">0</int>
<bool key="NSRuleOptionEditable">YES</bool>
</object>
<object class="NSRuleEditorViewSliceRow" id="629602464">
<reference key="NSNextResponder" ref="211063809"/>
<int key="NSvFlags">290</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="274860396">
<reference key="NSNextResponder" ref="629602464"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{581, 4}, {18, 18}}</string>
<reference key="NSSuperview" ref="629602464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="407607490"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSRuleEditorButtonCell" key="NSCell">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134348800</int>
<string key="NSContents">+</string>
<reference key="NSSupport" ref="29"/>
<array class="NSMutableArray" key="NSAccessibilityOverriddenAttributes">
<dictionary class="NSMutableDictionary">
<string key="AXDescription">add</string>
<integer value="1" key="NSAccessibilityEncodedAttributesValueType"/>
</dictionary>
</array>
<reference key="NSControlView" ref="274860396"/>
<string key="NSAction">_addOption:</string>
<reference key="NSTarget" ref="629602464"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="28"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
</object>
<object class="NSButton" id="694388602">
<reference key="NSNextResponder" ref="629602464"/>
<int key="NSvFlags">257</int>
<string key="NSFrame">{{561, 4}, {18, 18}}</string>
<reference key="NSSuperview" ref="629602464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="274860396"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSRuleEditorButtonCell" key="NSCell">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">134348800</int>
<string key="NSContents">-</string>
<reference key="NSSupport" ref="29"/>
<array class="NSMutableArray" key="NSAccessibilityOverriddenAttributes">
<dictionary class="NSMutableDictionary">
<string key="AXDescription">remove</string>
<integer value="1" key="NSAccessibilityEncodedAttributesValueType"/>
</dictionary>
</array>
<reference key="NSControlView" ref="694388602"/>
<string key="NSAction">_deleteOption:</string>
<reference key="NSTarget" ref="629602464"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="28"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
</object>
</object>
<object class="NSPopUpButton" id="718999757">
<reference key="NSNextResponder" ref="629602464"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{37, 4}, {79, 19}}</string>
<reference key="NSSuperview" ref="629602464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="122014713"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="24005362">
<int key="NSCellFlags">67239488</int>
<int key="NSCellFlags2">4196352</int>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="718999757"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="549316260"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="845117556">
<reference key="NSMenu" ref="830052663"/>
<string key="NSTitle">one op</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="24005362"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="830052663">
<string key="NSTitle"/>
<array class="NSMutableArray" key="NSMenuItems">
<reference ref="845117556"/>
</array>
</object>
<int key="NSPreferredEdge">3</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">2</int>
</object>
</object>
<object class="NSPopUpButton" id="122014713">
<reference key="NSNextResponder" ref="629602464"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{122, 4}, {99, 19}}</string>
<reference key="NSSuperview" ref="629602464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="798358360"/>
<int key="NSTag">-1</int>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="1062860772">
<int key="NSCellFlags">67239488</int>
<int key="NSCellFlags2">4196352</int>
<reference key="NSSupport" ref="26"/>
<integer value="4" key="NSRepresentedObject"/>
<reference key="NSControlView" ref="122014713"/>
<int key="NSButtonFlags">-2038284033</int>
<int key="NSButtonFlags2">36</int>
<reference key="NSAlternateImage" ref="549316260"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="112417180">
<reference key="NSMenu" ref="542577028"/>
<string key="NSTitle">is</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<reference key="NSOnImage" ref="35465992"/>
<reference key="NSMixedImage" ref="502551668"/>
<string key="NSAction">_popUpItemAction:</string>
<integer value="4" key="NSRepObject"/>
<reference key="NSTarget" ref="1062860772"/>
</object>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="542577028">
<string key="NSTitle"/>
<array class="NSMutableArray" key="NSMenuItems">
<reference ref="112417180"/>
</array>
</object>
<int key="NSPreferredEdge">3</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
<int key="NSArrowPosition">2</int>
</object>
</object>
<object class="NSTextField" id="798358360">
<reference key="NSNextResponder" ref="629602464"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{227, 4}, {160, 18}}</string>
<reference key="NSSuperview" ref="629602464"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="694388602"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell">
<int key="NSCellFlags">343014976</int>
<int key="NSCellFlags2">4326400</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="26"/>
<reference key="NSControlView" ref="798358360"/>
<bool key="NSDrawsBackground">YES</bool>
<reference key="NSBackgroundColor" ref="1001319303"/>
<reference key="NSTextColor" ref="879899608"/>
</object>
</object>
</array>
<string key="NSFrame">{{0, 52}, {609, 26}}</string>
<reference key="NSSuperview" ref="211063809"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="718999757"/>
<int key="NSRuleRowIndex">2</int>
<int key="NSRuleIndentation">1</int>
<reference key="NSContainingRuleEditorView" ref="407607490"/>
<nil key="NSRuleBackgroundColor"/>
<array class="NSMutableArray" key="NSRuleOptionViews">
<reference ref="718999757"/>
<reference ref="122014713"/>
<reference ref="798358360"/>
</array>
<int key="NSRuleOptionFrames.count">3</int>
<string key="NSRuleOptionFrames.0">{{37, 4}, {79, 19}}</string>
<string key="NSRuleOptionFrames.1">{{122, 4}, {99, 19}}</string>
<string key="NSRuleOptionFrames.2">{{227, 4}, {160, 18}}</string>
<array class="NSMutableArray" key="NSRuleOptionItems">
<dictionary class="NSMutableDictionary" id="501663521">
<integer value="1" key="depth"/>
<object class="NSPredicateEditorRowTemplate" key="pattern" id="450238823">
<int key="NSPredicateTemplateType">1</int>
<int key="NSPredicateTemplateOptions">0</int>
<int key="NSPredicateTemplateModifier">0</int>
<int key="NSPredicateTemplateLeftAttributeType">0</int>
<int key="NSPredicateTemplateRightAttributeType">700</int>
<array key="NSPredicateTemplateViews">
<reference ref="718999757"/>
<reference ref="122014713"/>
<reference ref="798358360"/>
</array>
<bool key="NSPredicateTemplateLeftIsWildcard">NO</bool>
<bool key="NSPredicateTemplateRightIsWildcard">YES</bool>
</object>
</dictionary>
<dictionary class="NSMutableDictionary" id="908038237">
<integer value="2" key="depth"/>
<reference key="pattern" ref="450238823"/>
</dictionary>
<dictionary class="NSMutableDictionary" id="247067485">
<integer value="3" key="depth"/>
<reference key="pattern" ref="450238823"/>
</dictionary>
</array>
<int key="NSRuleOptionInitialFrames.count">3</int>
<string key="NSRuleOptionInitialFrames.0">{{37, 4}, {79, 19}}</string>
<string key="NSRuleOptionInitialFrames.1">{{122, 4}, {99, 19}}</string>
<string key="NSRuleOptionInitialFrames.2">{{227, 4}, {160, 18}}</string>
<reference key="NSRuleOptionAddButton" ref="274860396"/>
<reference key="NSRuleOptionSubtractButton" ref="694388602"/>
<int key="NSRuleOptionRowType">0</int>
<int key="NSRuleOptionPlusButtonRowType">0</int>
<bool key="NSRuleOptionEditable">YES</bool>
@@ -1745,7 +1929,7 @@
<string key="NSFrameSize">{609, 162}</string>
<reference key="NSSuperview" ref="407607490"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="939521342"/>
<reference key="NSNextKeyView" ref="356804940"/>
</object>
</array>
<set class="NSMutableSet" key="NSDragTypes">
@@ -1758,10 +1942,10 @@
<bool key="NSEnabled">YES</bool>
<double key="NSRuleEditorAlignmentGridWidth">75</double>
<double key="NSRuleEditorSliceHeight">26</double>
<string key="NSRuleEditorStringsFileName">format</string>
<string key="NSRuleEditorStringsFileName"/>
<bool key="NSRuleEditorEditable">YES</bool>
<bool key="NSRuleEditorAllowsEmptyCompoundRows">NO</bool>
<bool key="NSRuleEditorDisallowEmpty">NO</bool>
<bool key="NSRuleEditorDisallowEmpty">YES</bool>
<int key="NSRuleEditorNestingMode">3</int>
<string key="NSRuleEditorRowTypeKeyPath">rowType</string>
<string key="NSRuleEditorSubrowsArrayKeyPath">subrows</string>
@@ -1775,8 +1959,8 @@
<array class="NSMutableArray" key="NSBoundArray">
<dictionary class="NSMutableDictionary">
<array class="NSMutableArray" key="criteria">
<reference ref="677427269"/>
<reference ref="489242046"/>
<reference ref="244855320"/>
<reference ref="430874292"/>
</array>
<array class="NSMutableArray" key="displayValues">
<reference ref="862982389"/>
@@ -1786,9 +1970,9 @@
<array class="NSMutableArray" key="subrows">
<dictionary class="NSMutableDictionary">
<array class="NSMutableArray" key="criteria">
<reference ref="866224734"/>
<reference ref="353749474"/>
<reference ref="638210389"/>
<reference ref="182370408"/>
<reference ref="261381641"/>
<reference ref="174024543"/>
</array>
<array class="NSMutableArray" key="displayValues">
<reference ref="78209235"/>
@@ -1798,17 +1982,33 @@
<integer value="0" key="rowType"/>
<array class="NSMutableArray" key="subrows"/>
</dictionary>
<dictionary class="NSMutableDictionary">
<array class="NSMutableArray" key="criteria">
<reference ref="501663521"/>
<reference ref="908038237"/>
<reference ref="247067485"/>
</array>
<array class="NSMutableArray" key="displayValues">
<reference ref="718999757"/>
<reference ref="122014713"/>
<reference ref="798358360"/>
</array>
<integer value="0" key="rowType"/>
<array class="NSMutableArray" key="subrows"/>
</dictionary>
</array>
</dictionary>
</array>
</object>
<array class="NSMutableArray" key="NSRuleEditorSlices">
<reference ref="939521342"/>
<reference ref="838952732"/>
<reference ref="356804940"/>
<reference ref="460920540"/>
<reference ref="629602464"/>
</array>
<array key="NSPredicateTemplates">
<reference ref="171372468"/>
<reference ref="626549045"/>
<reference ref="450238823"/>
</array>
<nil key="NSPredicateEditorPredicate"/>
</object>
@@ -1862,7 +2062,7 @@
<array class="NSMutableArray" key="NSSubviews">
<object class="NSView" id="73349307">
<reference key="NSNextResponder" ref="196312022"/>
<int key="NSvFlags">256</int>
<int key="NSvFlags">274</int>
<array class="NSMutableArray" key="NSSubviews">
<object class="NSButton" id="872974531">
<reference key="NSNextResponder" ref="73349307"/>
@@ -1870,6 +2070,7 @@
<string key="NSFrame">{{9, 11}, {25, 25}}</string>
<reference key="NSSuperview" ref="73349307"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="738552837"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="556816448">
<int key="NSCellFlags">-2080244224</int>
@@ -4145,6 +4346,7 @@
<array class="NSMutableArray" key="children">
<reference ref="171372468"/>
<reference ref="626549045"/>
<reference ref="450238823"/>
</array>
<reference key="parent" ref="869316024"/>
</object>
@@ -4166,8 +4368,8 @@
<int key="objectID">1057</int>
<reference key="object" ref="586880274"/>
<array class="NSMutableArray" key="children">
<reference ref="232834514"/>
<reference ref="540884058"/>
<reference ref="186315633"/>
<reference ref="477727226"/>
</array>
<reference key="parent" ref="626549045"/>
</object>
@@ -4175,43 +4377,11 @@
<int key="objectID">1058</int>
<reference key="object" ref="454623134"/>
<array class="NSMutableArray" key="children">
<reference ref="978983751"/>
<reference ref="531788973"/>
<reference ref="756867223"/>
<reference ref="254043602"/>
<reference ref="46876958"/>
<reference ref="637036835"/>
</array>
<reference key="parent" ref="626549045"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1060</int>
<reference key="object" ref="978983751"/>
<reference key="parent" ref="454623134"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1063</int>
<reference key="object" ref="531788973"/>
<reference key="parent" ref="454623134"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1071</int>
<reference key="object" ref="232834514"/>
<reference key="parent" ref="586880274"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1072</int>
<reference key="object" ref="540884058"/>
<reference key="parent" ref="586880274"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1073</int>
<reference key="object" ref="756867223"/>
<reference key="parent" ref="454623134"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1074</int>
<reference key="object" ref="254043602"/>
<reference key="parent" ref="454623134"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1309</int>
<reference key="object" ref="196312022"/>
@@ -4512,6 +4682,61 @@
<reference key="object" ref="216021672"/>
<reference key="parent" ref="738552837"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1346</int>
<reference key="object" ref="46876958"/>
<reference key="parent" ref="454623134"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1347</int>
<reference key="object" ref="637036835"/>
<reference key="parent" ref="454623134"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1348</int>
<reference key="object" ref="186315633"/>
<reference key="parent" ref="586880274"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1349</int>
<reference key="object" ref="477727226"/>
<reference key="parent" ref="586880274"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1350</int>
<reference key="object" ref="450238823"/>
<array class="NSMutableArray" key="children">
<reference ref="830052663"/>
<reference ref="542577028"/>
</array>
<reference key="parent" ref="407607490"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1351</int>
<reference key="object" ref="830052663"/>
<array class="NSMutableArray" key="children">
<reference ref="845117556"/>
</array>
<reference key="parent" ref="450238823"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1355</int>
<reference key="object" ref="542577028"/>
<array class="NSMutableArray" key="children">
<reference ref="112417180"/>
</array>
<reference key="parent" ref="450238823"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1359</int>
<reference key="object" ref="112417180"/>
<reference key="parent" ref="542577028"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1366</int>
<reference key="object" ref="845117556"/>
<reference key="parent" ref="830052663"/>
</object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -4529,12 +4754,6 @@
<string key="106.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1" key="106.ImportedFromIB2"/>
<string key="106.editorWindowContentRectSynchronizationRect">{{596, 852}, {216, 23}}</string>
<string key="1060.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1063.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1071.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1072.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1073.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="1074.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<string key="111.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
<integer value="1" key="111.ImportedFromIB2"/>
<string key="112.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -4799,7 +5018,7 @@
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
<int key="maxID">1345</int>
<int key="maxID">1366</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">