Changeset 51 for trunk


Ignore:
Timestamp:
11/18/02 08:57:41 (22 years ago)
Author:
Nicholas Riley
Message:

Alarms.nib: Removed horizontal scroll bar. Turned on grid. Set delegate to NJRTableDelegate instead of PSAlarmSetController.

NJRTableDelegate: In general, made functional (was previously unused). Fixed MyCompanyName. Changed ORDER_BY_CONTEXT to use key-value coding instead of assuming data consists of a dictionary of dictionaries. Added sorting support (reorderedData, replaces oData) with autosave support for sort context. Added _positionTypeSelectDisplay, which adjusts position and justification of type select display control based on the current sort column. Added support for reverse sorting in type select string. Use table data source instead of sorted data so text matches as displayed (this will break with non-text cells...).

NJRTableView: Adapted from iTableView (Jaguar table alternate table background color), TableTester (most everything else) and NJROutlineView (keyDown, moveToBeginning/EndOfDocument). Support for type selection, delete shortcut for row deletion, and iTunes-alike background colors and frame.

NSCharacterSet-NJRExtensions: Moved _typeSelectSet from NJROutlineView as it's now shared with NJRTableView. Still need to factor NJROutlineView as embedded in HostLauncher some day.

PSAlarm: Reorganized, renamed and categorized methods. Added time accessor for the benefit of sorting. Renamed compare: to compareDate: for clarity. Added compareMessage:, though it's currently unused. Renamed cancel to cancelTimer for clarity.

PSAlarmSetController: More fun with initial first responder on window show/hide; still need to work around bug properly (subclass NSComboBox?) and fix it for real. As is, works for OS X 10.1.

PSAlarms: Added alarms accessor, returning alarm array. Fixed memory leak on successful alarm removal (oops). Added removeAlarms:, needed with sorted alarm list.

PSAlarmsController: Set window resize increment. Changes to table delegate methods to use reordered alarm list. Register for NSTableViewSelectionDidChangeNotification now we're no longer the table view delegate. Fixed autoselection in alarmsChanged by using data reordering support in NJRTableView. Implement NJRTableViewDataSource to permit deletion from table view.

Pester.pbproj: Added new files.

Read Me.rtfd: Added TableTester/iTableView acknowledgements. Updated release notes.

Location:
trunk/Cocoa/Pester/Source
Files:
4 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cocoa/Pester/Source/English.lproj/Alarms.nib/classes.nib

    r26 r51  
    33        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
    44        {CLASS = NJRScrollView; LANGUAGE = ObjC; SUPERCLASS = NSScrollView; },
     5        {
     6            CLASS = NJRTableDelegate;
     7            LANGUAGE = ObjC;
     8            OUTLETS = {tableView = NSTableView; };
     9            SUPERCLASS = NSObject;
     10        },
     11        {
     12            CLASS = NJRTableView;
     13            LANGUAGE = ObjC;
     14            OUTLETS = {typeSelectDisplay = id; };
     15            SUPERCLASS = NSTableView;
     16        },
     17        {CLASS = NSObject; LANGUAGE = ObjC; },
    518        {
    619            ACTIONS = {remove = id; };
  • trunk/Cocoa/Pester/Source/English.lproj/Alarms.nib/info.nib

    r28 r51  
    11<?xml version="1.0" encoding="UTF-8"?>
    2 <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    3 <plist version="1.0">
     2<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
     3<plist version="0.9">
    44<dict>
    55        <key>IBDocumentLocation</key>
    6         <string>579 27 356 240 0 0 1600 1178 </string>
     6        <string>322 50 356 240 0 0 1280 832 </string>
    77        <key>IBFramework Version</key>
    8         <string>286.0</string>
     8        <string>263.2</string>
    99        <key>IBOpenObjects</key>
    1010        <array>
     
    1212        </array>
    1313        <key>IBSystem Version</key>
    14         <string>6D52</string>
     14        <string>5S66</string>
    1515</dict>
    1616</plist>
  • trunk/Cocoa/Pester/Source/NJRTableDelegate.h

    r34 r51  
    44//
    55//  Created by Nicholas Riley on Sun Oct 27 2002.
    6 //  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
     6//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
    77//
    88
    99#import <AppKit/AppKit.h>
     10#import "NJRTableView.h"
    1011
    1112
    1213@interface NJRTableDelegate : NSObject {
    13     IBOutlet NSTableView *tableView;
     14    IBOutlet NJRTableView *tableView;
    1415    NSTableColumn *sortingColumn;
    1516    NSString *sortingKey;
    1617    BOOL sortDescending;
    1718
    18     id oData; // XXX ???
     19    NSMutableArray *reorderedData;
    1920}
    2021
     22- (NSMutableArray *)reorderedDataForData:(NSArray *)data;
     23
     24- (NSSet *)selectedItems;
     25- (void)selectItems:(NSSet *)inSelectedItems;
     26
    2127@end
  • trunk/Cocoa/Pester/Source/NJRTableDelegate.m

    r34 r51  
    44//
    55//  Created by Nicholas Riley on Sun Oct 27 2002.
    6 //  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
     6//  Copyright (c) 2002 Nicholas Riley. All rights reserved.
    77//
    88
     
    1414typedef struct { NSString *key; BOOL descending; } SortContext;
    1515
    16 // Sort array of itemNums, by looking up the itemNum in the dictionary of dictionaries.
     16// Sort array of itemNums, by looking up the itemNum in the dictionary of objects.
    1717// based on code of Ondra Cada <ocs@ocs.cz> on cocoa-dev list
    1818
     
    2525
    2626        if (context->descending) {
    27             first  = [right objectForKey: key];
    28             second = [left  objectForKey: key];
     27            first  = [right valueForKey: key];
     28            second = [left  valueForKey: key];
    2929        } else {
    30             first  = [left  objectForKey: key];
    31             second = [right objectForKey: key];
     30            first  = [left  valueForKey: key];
     31            second = [right valueForKey: key];
    3232        }
    3333
     
    4141}
    4242
     43@interface NJRTableDelegate (Private)
     44
     45- (void)_positionTypeSelectDisplay;
     46- (void)_sortByColumn:(NSTableColumn *)inTableColumn;
     47
     48@end
     49
    4350@implementation NJRTableDelegate
    4451
    4552#pragma mark initialize-release
    4653
     54- (void)awakeFromNib;
     55{
     56    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_positionTypeSelectDisplay) name: NSViewFrameDidChangeNotification object: tableView];
     57}
     58
    4759- (void)dealloc
    4860{
     61    [[NSNotificationCenter defaultCenter] removeObserver: self];
    4962    [sortingColumn release];
    5063    [sortingKey release];
     64    [reorderedData release];
    5165    [super dealloc];
    5266}
     
    6882}
    6983
     84#pragma mark sorting
     85
     86- (NSString *)_sortContextDefaultKey;
     87{
     88    NSString *autosaveName = [tableView autosaveName];
     89    if (autosaveName != nil)
     90        return [NSString stringWithFormat: @"NJRTableDelegate SortContext %@", autosaveName];
     91    else
     92        return nil;
     93}
     94
     95- (void)_sortData;
     96{
     97    SortContext ctxt = { sortingKey, sortDescending };
     98    NSString *sortContextKey = [self _sortContextDefaultKey];
     99
     100    if (sortContextKey != nil) {
     101        [[NSUserDefaults standardUserDefaults] setObject:
     102            [NSDictionary dictionaryWithObjectsAndKeys: sortingKey, @"sortingKey", [NSNumber numberWithBool: sortDescending], @"sortDescending", nil]
     103                                                    forKey: [self _sortContextDefaultKey]];
     104    }
     105   
     106    // sort the NSMutableArray
     107    [reorderedData sortUsingFunction: ORDER_BY_CONTEXT context: &ctxt];
     108    [tableView reloadData];
     109}
     110
     111- (void)_sortByColumn:(NSTableColumn *)inTableColumn;
     112{
     113    NSSet *oldSelection = [self selectedItems];
     114    if (sortingColumn == inTableColumn) {
     115        // User clicked same column, change sort order
     116        sortDescending = !sortDescending;
     117        // Possible optimization: Don't actually re-sort if you just change the sorting direction; instead, just display either the nth item or the (count-1-n)th item depending on ascending/descending.)
     118    } else {
     119        // User clicked new column, change old/new column headers, save new sorting column, and re-sort the array.
     120        if (sortingColumn != nil) {
     121            [tableView setIndicatorImage: nil inTableColumn: sortingColumn];
     122            sortDescending = NO; // on initial sort, preserve previous sort order
     123        }
     124        [self setSortingKey: [inTableColumn identifier]];
     125        [self setSortingColumn: inTableColumn];
     126        [tableView setHighlightedTableColumn: inTableColumn];
     127    }
     128    [tableView setIndicatorImage: (sortDescending ? [NSTableView descendingSortIndicator] : [NSTableView ascendingSortIndicator]) inTableColumn: inTableColumn];
     129    [self _positionTypeSelectDisplay];
     130    // Actually sort the data
     131    [self _sortData];
     132    [self selectItems: oldSelection];
     133}
     134
     135- (void)_initialSortData;
     136{
     137    NSString *sortContextKey = [self _sortContextDefaultKey];
     138    NSDictionary *sortContext;
     139    NSString *key;
     140    NSTableColumn *column;
     141
     142    if (sortContextKey == nil) goto noContext;
     143    if ( (sortContext = [[NSUserDefaults standardUserDefaults] dictionaryForKey: sortContextKey]) == nil) goto noContext;
     144    if ( (key = [sortContext objectForKey: @"sortingKey"]) == nil) goto noContext;
     145    if ( (column = [tableView tableColumnWithIdentifier: key]) == nil) goto noContext;
     146    sortDescending = [[sortContext objectForKey: @"sortDescending"] boolValue];
     147    [self _sortByColumn: column];
     148    return;
     149   
     150noContext:
     151    sortDescending = NO;
     152    [self _sortByColumn: [[tableView tableColumns] objectAtIndex: 0]];
     153}
     154
     155- (NSMutableArray *)reorderedDataForData:(NSArray *)data;
     156{
     157    if (reorderedData == nil) {
     158        reorderedData = [data mutableCopy];
     159        [self _initialSortData];
     160    } else {
     161        NSSet *oldSelection = [self selectedItems];
     162        [reorderedData release]; reorderedData = nil;
     163        reorderedData = [data mutableCopy];
     164        [self _sortData];
     165        [self selectItems: oldSelection];
     166    }
     167    return reorderedData;
     168}
     169
     170#pragma mark type selection
     171
     172- (void)_positionTypeSelectDisplay;
     173{
     174    [tableView resetTypeSelect]; // avoid extraneous matching
     175    if ([tableView typeSelectDisplay] != nil && sortingColumn != nil) {
     176        NSControl *typeSelectControl = [tableView typeSelectDisplay];
     177        if ([typeSelectControl isKindOfClass: [NSControl class]]) {
     178            NSView *superview = [typeSelectControl superview];
     179            NSRect columnRect = [superview convertRect: [tableView rectOfColumn: [tableView columnWithIdentifier: sortingKey]] fromView: tableView];
     180            // XXX support horizontal scroll bar/clipping (not for Pester, but eventually)
     181            NSRect tableScrollFrame = [[tableView enclosingScrollView] frame];
     182            NSRect selectFrame = [typeSelectControl frame];
     183            [superview setNeedsDisplayInRect: selectFrame]; // fix artifacts caused by moving view
     184            selectFrame.origin.x = columnRect.origin.x;
     185            selectFrame.size.width = columnRect.size.width;
     186            [typeSelectControl setAlignment: [[sortingColumn dataCell] alignment]];
     187            [typeSelectControl setFrame: selectFrame];
     188        }
     189    }
     190}
     191
    70192#pragma mark saving/restoring selection
    71193
     
    77199
    78200    while ( (rowNum = [e nextObject]) != nil) {
    79         id item = [oData objectAtIndex: [rowNum intValue]];
     201        id item = [reorderedData objectAtIndex: [rowNum intValue]];
    80202        [result addObject: item];
    81203    }
     
    92214
    93215    while ( (item = [e nextObject]) != nil ) {
    94         int row = [oData indexOfObjectIdenticalTo: item];
     216        int row = [reorderedData indexOfObjectIdenticalTo: item];
    95217        if (row != NSNotFound) {
    96218            [tableView selectRow: row byExtendingSelection: YES];
     
    101223}
    102224
    103 // ----------------------------------------------------------------------------------------
    104 // Sorting
    105 // ----------------------------------------------------------------------------------------
    106 
    107 - (void)sortData
    108 {
    109     SortContext ctxt = { sortingKey, sortDescending };
    110     NSSet *oldSelection = [self selectedItems];
    111 
    112     // sort the NSMutableArray
    113     [oData sortUsingFunction: ORDER_BY_CONTEXT context: &ctxt];
    114 
    115     [tableView reloadData];
    116     [self selectItems: oldSelection];
    117 }
    118 
    119 - (void)sortByColumn:(NSTableColumn *)inTableColumn;
    120 {
    121     if (sortingColumn == inTableColumn) {
    122         // User clicked same column, change sort order
    123         sortDescending = !sortDescending;
    124         // Possible optimization: Don't actually re-sort if you just change the sorting direction;
    125         // instead, just display either the nth item or the (count-1-n)th item depending on ascending/descending.)
     225@end
     226
     227@implementation NJRTableDelegate (NJRTableViewDelegate)
     228
     229- (void)tableView:(NSTableView *)aTableView didClickTableColumn:(NSTableColumn *)inTableColumn
     230{
     231    [[tableView window] makeFirstResponder: aTableView];
     232    [self _sortByColumn: inTableColumn];
     233}
     234
     235- (void)tableViewColumnDidResize:(NSNotification *)notification;
     236{
     237    [self _positionTypeSelectDisplay];
     238}
     239
     240- (void)tableViewColumnDidMove:(NSNotification *)notification;
     241{
     242    [self _positionTypeSelectDisplay];
     243}
     244
     245- (void)tableView:(NSTableView *)aTableView selectRowMatchingString:(NSString *)matchString;
     246{
     247    // Look for a highlighted column, presuming we are sorted by that column, and search its values.
     248    NSTableColumn *col = [aTableView highlightedTableColumn];
     249    id dataSource = [aTableView dataSource];
     250    int i, rowCount = [reorderedData count];
     251    if (nil == col) return;
     252    if (sortDescending) {
     253        for ( i = rowCount - 1 ; i >= 0 ; i-- ) {
     254            NSComparisonResult order = [matchString caseInsensitiveCompare:
     255                [dataSource tableView: aTableView objectValueForTableColumn: col row: i]];
     256            if (order != NSOrderedDescending) break;
     257        }
     258        if (i < 0) i = 0;
    126259    } else {
    127         // User clicked new column, change old/new column headers,
    128         // save new sorting column, and re-sort the array.
    129         sortDescending = NO;
    130         if (nil != sortingColumn) {
    131             [tableView setIndicatorImage: nil inTableColumn: sortingColumn];
    132         }
    133         [self setSortingKey: [inTableColumn identifier]];
    134         [self setSortingColumn: inTableColumn];
    135         [tableView setHighlightedTableColumn: inTableColumn];
    136     }
    137     [tableView setIndicatorImage: (sortDescending ? [NSTableView descendingSortIndicator] : [NSTableView ascendingSortIndicator]) inTableColumn: inTableColumn];
    138     // Actually sort the data
    139     [self sortData];
    140 }
    141 
    142 //      Sort by whatever column was clicked upon
    143 - (void)tableView:(NSTableView*)aTableView didClickTableColumn:(NSTableColumn *)inTableColumn
    144 {
    145     [[tableView window] makeFirstResponder: aTableView]; // help make this tableView be first responder
    146     [self sortByColumn:inTableColumn];
    147 }
    148 
    149 // ----------------------------------------------------------------------------------------
    150 // Alphabetic Type Ahead
    151 // ----------------------------------------------------------------------------------------
    152 
    153 - (void) typeAheadString:(NSString *)inString;
    154 {
    155     // This general sample looks for a highlighted column, presuming that is that column we are sorted by, and uses that as the lookup key.
    156     NSTableColumn *col = [tableView highlightedTableColumn];
    157     if (nil != col) {
    158         NSString *key = [col identifier];
    159         int i;
    160         for ( i = 0 ; i < [oData count] ; i++ ) {
    161             NSDictionary *rowDict = [oData objectAtIndex:i];
    162             NSString *compareTo = [rowDict objectForKey:key];
    163             NSComparisonResult order = [inString caseInsensitiveCompare:compareTo];
     260        for ( i = 0 ; i < rowCount ; i++ ) {
     261            NSComparisonResult order = [matchString caseInsensitiveCompare:
     262                [dataSource tableView: aTableView objectValueForTableColumn: col row: i]];
    164263            if (order != NSOrderedDescending) break;
    165264        }
    166         // Make sure we're not overflowing the row count.
    167         if (i >= [oData count]) {
    168             i = [oData count] - 1;
    169         }
    170         // Now select row i -- either the one we found, or the last row if not found.
    171         [tableView selectRow:i byExtendingSelection:NO];
    172         [tableView scrollRowToVisible:i];
    173     }
     265        if (i >= rowCount) i = rowCount - 1;
     266    }
     267    // Now select row i -- either the one we found, or the first/last row if not found.
     268    [aTableView selectRow: i byExtendingSelection: NO];
     269    [aTableView scrollRowToVisible: i];
    174270}
    175271
  • trunk/Cocoa/Pester/Source/NSTableView-NJRExtensions.h

    r34 r51  
    1717- (float)cellHeight;
    1818
    19 - (NSArray *)selectedRowIndices;
    20 
    2119@end
  • trunk/Cocoa/Pester/Source/NSTableView-NJRExtensions.m

    r34 r51  
    2828+ (NSImage *)descendingSortIndicator;
    2929{
    30     NSImage *result = [NSImage imageNamed:@"NSDescendingSortIndicator"];
    31     if (result == nil && [[NSTableView class] respondsToSelector:@selector(_defaultTableHeaderReverseSortImage)])
     30    NSImage *result = [NSImage imageNamed: @"NSDescendingSortIndicator"];
     31    if (result == nil && [[NSTableView class] respondsToSelector: @selector(_defaultTableHeaderReverseSortImage)])
    3232        result = [NSTableView _defaultTableHeaderReverseSortImage];
    3333    return result;
    34 }
    35 
    36 - (NSArray *)selectedRowIndices;
    37 {
    38     NSEnumerator *theEnum = [self selectedRowEnumerator];
    39     NSNumber *rowNumber;
    40     NSMutableArray *rowNumberArray = [NSMutableArray arrayWithCapacity: [self numberOfSelectedRows]];
    41 
    42     while (nil != (rowNumber = [theEnum nextObject]) )
    43         [rowNumberArray addObject: rowNumber];
    44 
    45     return rowNumberArray;
    4634}
    4735
  • trunk/Cocoa/Pester/Source/PSAlarm.h

    r43 r51  
    3838
    3939- (NSCalendarDate *)date;
     40- (NSCalendarDate *)time;
    4041- (NSTimeInterval)interval;
    4142- (NSString *)message;
     
    5051- (NSString *)invalidMessage;
    5152
    52 - (NSComparisonResult)compare:(PSAlarm *)otherAlarm;
     53- (NSComparisonResult)compareDate:(PSAlarm *)otherAlarm;
     54- (NSComparisonResult)compareMessage:(PSAlarm *)otherAlarm;
    5355
    5456- (BOOL)setTimer;
    55 - (void)cancel;
     57- (void)cancelTimer;
    5658
    5759@end
  • trunk/Cocoa/Pester/Source/PSAlarm.m

    r43 r51  
    2020
    2121@implementation PSAlarm
     22
     23#pragma mark initialize-release
    2224
    2325+ (void)initialize; // XXX change on locale modification, subscribe to NSNotifications
     
    4143}
    4244
     45#pragma mark private
     46
    4347- (void)_setAlarmDate:(NSCalendarDate *)aDate;
    4448{
     
    5054}
    5155
    52 - (void)_invalidate:(NSString *)aMessage;
     56- (void)_beInvalid:(NSString *)aMessage;
    5357{
    5458    alarmType = PSAlarmInvalid;
     
    6266}
    6367
    64 - (void)_validateForType:(PSAlarmType)type;
     68- (void)_beValidWithType:(PSAlarmType)type;
    6569{
    6670    if (alarmType == PSAlarmSet) return; // already valid
     
    7579    alarmDate = [NSCalendarDate dateWithTimeIntervalSinceNow: alarmInterval];
    7680    [alarmDate retain];
    77     [self _validateForType: PSAlarmInterval];
    78 }
     81    [self _beValidWithType: PSAlarmInterval];
     82}
     83
     84- (void)_setIntervalFromDate;
     85{
     86    alarmInterval = [alarmDate timeIntervalSinceNow] + 1;
     87    if (alarmInterval <= 0) {
     88        [self _beInvalid: @"Please specify an alarm time in the future."];
     89        return;
     90    }
     91    [self _beValidWithType: PSAlarmDate];
     92}
     93
     94- (NSString *)_alarmTypeString;
     95{
     96    switch (alarmType) {
     97        case PSAlarmDate: return @"PSAlarmDate";
     98        case PSAlarmInterval: return @"PSAlarmInterval";
     99        case PSAlarmSet: return @"PSAlarmSet";
     100        case PSAlarmInvalid: return @"PSAlarmInvalid";
     101        default: return [NSString stringWithFormat: @"<unknown: %u>", alarmType];
     102    }
     103}
     104
     105- (void)_timerExpired:(NSTimer *)aTimer;
     106{
     107    [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmTimerExpiredNotification object: self];
     108    [timer release]; timer = nil;
     109}
     110
     111#pragma mark alarm setting
    79112
    80113- (void)setInterval:(NSTimeInterval)anInterval;
     
    82115    alarmInterval = anInterval;
    83116    if (alarmInterval <= 0) {
    84         [self _invalidate: @"Please specify an alarm interval."]; return;
     117        [self _beInvalid: @"Please specify an alarm interval."]; return;
    85118    }
    86119    [self _setDateFromInterval];
    87 }
    88 
    89 - (void)_setIntervalFromDate;
    90 {
    91     alarmInterval = [alarmDate timeIntervalSinceNow] + 1;
    92     if (alarmInterval <= 0) {
    93         [self _invalidate: @"Please specify an alarm time in the future."];
    94         return;
    95     }
    96     [self _validateForType: PSAlarmDate];
    97120}
    98121
     
    107130    NSCalendarDate *calTime, *calDate;
    108131    if (time == nil && date == nil) {
    109         [self _invalidate: @"Please specify an alarm date and time."]; return;
     132        [self _beInvalid: @"Please specify an alarm date and time."]; return;
    110133    }
    111134    if (time == nil) {
    112         [self _invalidate: @"Please specify an alarm time."]; return;
     135        [self _beInvalid: @"Please specify an alarm time."]; return;
    113136    }
    114137    if (date == nil) {
    115         [self _invalidate: @"Please specify an alarm date."]; return;
     138        [self _beInvalid: @"Please specify an alarm date."]; return;
    116139    }
    117140    // XXX if calTime's date is different from the default date, complain
     
    119142    calDate = [NSCalendarDate dateWithTimeIntervalSinceReferenceDate: [date timeIntervalSinceReferenceDate]];
    120143    if (calTime == nil || calDate == nil) {
    121         [self _invalidate: @"Please specify a reasonable date and time."];
     144        [self _beInvalid: @"Please specify a reasonable date and time."];
    122145    }
    123146    [self setForDateAtTime:
     
    131154}
    132155
    133 - (BOOL)isValid;
    134 {
    135     if (alarmType == PSAlarmDate) [self _setIntervalFromDate];
    136     return (alarmType != PSAlarmInvalid);
     156#pragma mark accessing
     157
     158- (NSString *)message;
     159{
     160    if (alarmMessage == nil || [alarmMessage isEqualToString: @""])
     161        return @"Alarm!";
     162    return alarmMessage;
    137163}
    138164
     
    146172}
    147173
    148 - (NSString *)message;
    149 {
    150     if (alarmMessage == nil || [alarmMessage isEqualToString: @""])
    151         return @"Alarm!";
    152     return alarmMessage;   
     174- (BOOL)isValid;
     175{
     176    if (alarmType == PSAlarmDate) [self _setIntervalFromDate];
     177    return (alarmType != PSAlarmInvalid);
    153178}
    154179
     
    163188    if (alarmType == PSAlarmInterval) [self _setDateFromInterval];
    164189    return alarmDate;
     190}
     191
     192- (NSCalendarDate *)time;
     193{
     194    if (alarmType == PSAlarmInterval) [self _setDateFromInterval];
     195    return [[NSCalendarDate alloc] initWithYear: 0
     196                                          month: 1
     197                                            day: 1
     198                                           hour: [alarmDate hourOfDay]
     199                                         minute: [alarmDate minuteOfHour]
     200                                         second: [alarmDate secondOfMinute]
     201                                       timeZone: nil];
     202}
     203
     204- (NSTimeInterval)interval;
     205{
     206    if (alarmType == PSAlarmSet || alarmType == PSAlarmDate) [self _setIntervalFromDate];
     207    return alarmInterval;
     208}
     209
     210- (void)addAlert:(PSAlert *)alert;
     211{
     212    if (alerts == nil) alerts = [[NSMutableArray alloc] initWithCapacity: 4];
     213    [alerts addObject: alert];
     214}
     215
     216- (void)removeAlerts;
     217{
     218    [alerts removeAllObjects];
     219}
     220
     221- (NSArray *)alerts;
     222{
     223    return [[alerts copy] autorelease];
    165224}
    166225
     
    193252}
    194253
    195 - (NSTimeInterval)interval;
    196 {
    197     if (alarmType == PSAlarmSet || alarmType == PSAlarmDate) [self _setIntervalFromDate];
    198     return alarmInterval;
    199 }
     254#pragma mark actions
    200255
    201256- (BOOL)setTimer;
     
    204259        case PSAlarmDate: if (![self isValid]) return NO;
    205260        case PSAlarmInterval:
    206             timer = [NSTimer scheduledTimerWithTimeInterval: alarmInterval
    207                                                      target: self
    208                                                    selector: @selector(_timerExpired:)
    209                                                    userInfo: nil
    210                                                     repeats: NO];
     261            timer = [NSTimer scheduledTimerWithTimeInterval: alarmInterval target: self selector: @selector(_timerExpired:) userInfo: nil repeats: NO];
    211262            if (timer != nil) {
    212263                [timer retain];
     
    220271}
    221272
    222 - (void)cancel;
     273- (void)cancelTimer;
    223274{
    224275    [timer invalidate]; [timer release]; timer = nil;
    225276}
    226277
    227 - (void)_timerExpired:(NSTimer *)aTimer;
    228 {
    229     [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmTimerExpiredNotification object: self];
    230     [timer release]; timer = nil;
    231 }
    232 
    233 - (NSString *)_alarmTypeString;
    234 {
    235     switch (alarmType) {
    236         case PSAlarmDate: return @"PSAlarmDate";
    237         case PSAlarmInterval: return @"PSAlarmInterval";
    238         case PSAlarmSet: return @"PSAlarmSet";
    239         case PSAlarmInvalid: return @"PSAlarmInvalid";
    240         default: return [NSString stringWithFormat: @"<unknown: %u>", alarmType];
    241     }
    242 }
    243 
    244 - (NSComparisonResult)compare:(PSAlarm *)otherAlarm;
     278#pragma mark comparing
     279
     280- (NSComparisonResult)compareDate:(PSAlarm *)otherAlarm;
    245281{
    246282    return [[self date] compare: [otherAlarm date]];
    247283}
    248284
    249 - (void)addAlert:(PSAlert *)alert;
    250 {
    251     if (alerts == nil) alerts = [[NSMutableArray alloc] initWithCapacity: 4];
    252     [alerts addObject: alert];
    253 }
    254 
    255 - (void)removeAlerts;
    256 {
    257     [alerts removeAllObjects];
    258 }
    259 
    260 - (NSArray *)alerts;
    261 {
    262     return [[alerts copy] autorelease];
    263 }
     285- (NSComparisonResult)compareMessage:(PSAlarm *)otherAlarm;
     286{
     287    return [[self message] caseInsensitiveCompare: [otherAlarm message]];
     288}
     289
     290#pragma mark printing
    264291
    265292- (NSString *)description;
     
    272299           [NSString stringWithFormat: @"\ntimer: %@", timer] : @""))];
    273300}
     301
     302#pragma mark archiving
    274303
    275304- (void)encodeWithCoder:(NSCoder *)coder;
  • trunk/Cocoa/Pester/Source/PSAlarmSetController.m

    r45 r51  
    9292    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(playSoundChanged:) name: NJRQTMediaPopUpButtonMovieChangedNotification object: sound];
    9393    [voice setDelegate: self];
    94     if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_1) {
     94    // XXX still broken under 10.2, check 10.1 behavior and see if subclassing NSComboBox will help
     95    // if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_1) {
    9596        // XXX workaround for 10.1.x bug which sets the first responder to the wrong field, but it works if I set the initial first responder to nil... go figure.
    9697        [[self window] setInitialFirstResponder: nil];
    97     }
     98    // }
    9899    [[self window] makeKeyAndOrderFront: nil];
    99100}
  • trunk/Cocoa/Pester/Source/PSAlarms.h

    r34 r51  
    2222+ (PSAlarms *)allAlarms;
    2323
     24- (NSArray *)alarms;
    2425- (PSAlarm *)nextAlarm;
    2526- (int)alarmCount;
     
    2728- (void)removeAlarmAtIndex:(int)index;
    2829- (void)removeAlarmsAtIndices:(NSArray *)indices;
     30- (void)removeAlarms:(NSSet *)alarmsToRemove;
    2931
    3032@end
  • trunk/Cocoa/Pester/Source/PSAlarms.m

    r28 r51  
    4646    nextAlarm = nil;
    4747    // sort alarms so earliest is first
    48     [alarms sortUsingSelector: @selector(compare:)];
     48    [alarms sortUsingSelector: @selector(compareDate:)];
    4949    // find first un-expired alarm
    5050    e = [alarms objectEnumerator];
     
    126126}
    127127
     128- (NSArray *)alarms;
     129{
     130    return alarms;
     131}
     132
    128133- (int)alarmCount;
    129134{
     
    138143- (void)removeAlarmAtIndex:(int)index;
    139144{
    140     [(PSAlarm *)[alarms objectAtIndex: index] cancel];
     145    [(PSAlarm *)[alarms objectAtIndex: index] cancelTimer];
    141146    [alarms removeObjectAtIndex: index];
    142147}
     
    151156        while ( (n = [e nextObject]) != nil) {
    152157            alarmIndex = [n intValue];
    153             [(PSAlarm *)[alarms objectAtIndex: alarmIndex] cancel];
     158            [(PSAlarm *)[alarms objectAtIndex: alarmIndex] cancelTimer];
    154159            indexArray[i] = alarmIndex;
    155160            i++;
    156161        }
    157162        [alarms removeObjectsFromIndices: indexArray numIndices: indexCount];
     163        free(indexArray); indexArray = NULL;
    158164        [self _changed];
    159165    NS_HANDLER
     
    164170}
    165171
     172- (void)removeAlarms:(NSSet *)alarmsToRemove;
     173{
     174    NSEnumerator *e = [alarms objectEnumerator];
     175    PSAlarm *alarm;
     176    NSMutableArray *indices = [NSMutableArray arrayWithCapacity: [alarmsToRemove count]];
     177    int alarmIndex = 0;
     178
     179    while ( (alarm = [e nextObject]) != nil) {
     180        if ([alarmsToRemove containsObject: alarm])
     181            [indices addObject: [NSNumber numberWithInt: alarmIndex]];
     182        alarmIndex++;
     183    }
     184    [self removeAlarmsAtIndices: indices];
     185}
     186
    166187@end
  • trunk/Cocoa/Pester/Source/PSAlarmsController.h

    r26 r51  
    1414    IBOutlet NSButton *removeButton;
    1515    PSAlarms *alarms;
     16    NSArray *reorderedAlarms;
    1617}
    1718
  • trunk/Cocoa/Pester/Source/PSAlarmsController.m

    r34 r51  
    1010#import "PSAlarm.h"
    1111#import "NSTableView-NJRExtensions.h"
    12 
     12#import "NJRTableView.h"
     13#import "NJRTableDelegate.h"
    1314
    1415@implementation PSAlarmsController
     16
     17- (void)alarmsChanged;
     18{
     19    reorderedAlarms = [[tableView delegate] reorderedDataForData: [alarms alarms]];
     20}
    1521
    1622- (id)init;
     
    2329        if (nil == [[NSUserDefaults standardUserDefaults] objectForKey:
    2430            [@"NSWindow Frame " stringByAppendingString: [[self window] frameAutosaveName]]])
    25         {
     31           {
    2632            [[self window] center];
    27         }
     33           }
    2834        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(alarmsChanged) name: PSAlarmsDidChangeNotification object: alarms];
     35        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(tableViewSelectionDidChange:) name: NSTableViewSelectionDidChangeNotification object: tableView];
    2936        [tableView setAutosaveName: @"Alarm list"];
    3037        [tableView setAutosaveTableColumns: YES];
    31         [tableView noteNumberOfRowsChanged];
     38        [self alarmsChanged];
    3239        [[self window] makeFirstResponder: tableView];
     40        [[self window] setResizeIncrements: NSMakeSize(1, [tableView cellHeight])];
    3341    }
    3442    return self;
    3543}
    3644
    37 - (void)alarmsChanged; // XXX fix autoselection to be more reasonable, see whatever I did in that _Learning Cocoa_ project I think
    38 {
    39     [tableView reloadData];
    40     [tableView deselectAll: self];
    41 }
    4245
    4346- (IBAction)remove:(id)sender;
    4447{
    45     [alarms removeAlarmsAtIndices: [[tableView selectedRowEnumerator] allObjects]];
     48    [alarms removeAlarms: [[tableView delegate] selectedItems]];
    4649}
    4750
     
    5760- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row;
    5861{
    59     PSAlarm *alarm = [alarms alarmAtIndex: row];
     62    PSAlarm *alarm = [reorderedAlarms objectAtIndex: row];
    6063
    6164    if ([[tableColumn identifier] isEqualToString: @"message"]) return [alarm message];
     
    7073    return nil;
    7174}
     75@end
     76
     77@implementation PSAlarmsController (NJRTableViewDataSource)
     78
     79- (void)removeSelectedRowsFromTableView:(NSTableView *)aTableView;
     80{
     81    [self remove: aTableView];
     82}
     83
    7284@end
    7385
  • trunk/Cocoa/Pester/Source/Pester.pbproj/nicholas.pbxuser

    r49 r51  
    1212                        F500E5370359719B01AEEDB1,
    1313                        F5B15F74037E42EB01AEEDB1,
    14                         F562F810037E79EE01AEEDB1,
    1514                );
    1615                executables = (
     
    1817                );
    1918                perUserDictionary = {
    20                         PBXPerProjectTemplateStateSaveDate = 58758807;
    21                         "PBXTemplateGeometry-F5CA7EC8015C06940DCA290F" = {
    22                                 ContentSize = "{705, 569}";
     19                        PBXPerProjectTemplateStateSaveDate = 59271904;
     20                        "PBXTemplateGeometry-F5314676015831810DCA290F" = {
     21                                ContentSize = "{618, 257}";
    2322                                LeftSlideOut = {
    2423                                        Collapsed = NO;
    25                                         Frame = "{{0, 0}, {705, 569}}";
     24                                        Frame = "{{0, 23}, {618, 234}}";
     25                                        Split0 = {
     26                                                ActiveTab = 2;
     27                                                Collapsed = YES;
     28                                                Frame = "{{0, 0}, {618, 234}}";
     29                                                Split0 = {
     30                                                        Frame = "{{1e+06, 1e+06}, {618, 0}}";
     31                                                };
     32                                                SplitCount = 1;
     33                                                Tab0 = {
     34                                                        Debugger = {
     35                                                                Collapsed = NO;
     36                                                                Frame = "{{0, 0}, {952, 321}}";
     37                                                                Split0 = {
     38                                                                        Frame = "{{0, 24}, {952, 297}}";
     39                                                                        Split0 = {
     40                                                                                Frame = "{{0, 0}, {468, 297}}";
     41                                                                        };
     42                                                                        Split1 = {
     43                                                                                DebugVariablesTableConfiguration = (
     44                                                                                        Name,
     45                                                                                        126.803,
     46                                                                                        Value,
     47                                                                                        150.074,
     48                                                                                        Summary,
     49                                                                                        172.123,
     50                                                                                );
     51                                                                                Frame = "{{477, 0}, {475, 297}}";
     52                                                                        };
     53                                                                        SplitCount = 2;
     54                                                                };
     55                                                                SplitCount = 1;
     56                                                                Tab0 = {
     57                                                                        Frame = "{{0, 0}, {100, 50}}";
     58                                                                };
     59                                                                Tab1 = {
     60                                                                        Frame = "{{0, 0}, {100, 50}}";
     61                                                                };
     62                                                                TabCount = 2;
     63                                                                TabsVisible = YES;
     64                                                        };
     65                                                        Frame = "{{0, 0}, {952, 321}}";
     66                                                        LauncherConfigVersion = 7;
     67                                                };
     68                                                Tab1 = {
     69                                                        Frame = "{{0, 0}, {781, 452}}";
     70                                                        LauncherConfigVersion = 3;
     71                                                        Runner = {
     72                                                                Frame = "{{0, 0}, {781, 452}}";
     73                                                        };
     74                                                };
     75                                                Tab2 = {
     76                                                        BuildMessageFrame = "{{0, 0}, {620, 123}}";
     77                                                        BuildTranscriptFrame = "{{0, 132}, {620, 98}}";
     78                                                        Frame = "{{0, 0}, {618, 228}}";
     79                                                };
     80                                                Tab3 = {
     81                                                        Frame = "{{0, 0}, {612, 295}}";
     82                                                };
     83                                                TabCount = 4;
     84                                                TabsVisible = NO;
     85                                        };
     86                                        SplitCount = 1;
     87                                        Tab0 = {
     88                                                Frame = "{{0, 0}, {300, 533}}";
     89                                                GroupTreeTableConfiguration = (
     90                                                        TargetStatusColumn,
     91                                                        18,
     92                                                        MainColumn,
     93                                                        267,
     94                                                );
     95                                        };
     96                                        Tab1 = {
     97                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     98                                                ClassesTreeTableConfiguration = (
     99                                                        PBXBookColumnIdentifier,
     100                                                        20,
     101                                                        PBXClassColumnIdentifier,
     102                                                        237,
     103                                                );
     104                                                Frame = "{{0, 0}, {278, 659}}";
     105                                                MembersFrame = "{{0, 407}, {280, 252}}";
     106                                                MembersTreeTableConfiguration = (
     107                                                        PBXBookColumnIdentifier,
     108                                                        20,
     109                                                        PBXMethodColumnIdentifier,
     110                                                        236,
     111                                                );
     112                                        };
     113                                        Tab2 = {
     114                                                Frame = "{{0, 0}, {200, 100}}";
     115                                        };
     116                                        Tab3 = {
     117                                                Frame = "{{0, 0}, {200, 100}}";
     118                                                Split0 = {
     119                                                        Frame = "{{0, 0}, {200, 45}}";
     120                                                        TargetTreeTableConfiguration = (
     121                                                                ActiveTarget,
     122                                                                16,
     123                                                                TargetName,
     124                                                                168,
     125                                                        );
     126                                                };
     127                                                Split1 = {
     128                                                        BuildStyleTreeTableConfiguration = (
     129                                                                IsActive,
     130                                                                16,
     131                                                                Name,
     132                                                                169,
     133                                                        );
     134                                                        Frame = "{{0, 54}, {200, 46}}";
     135                                                };
     136                                                SplitCount = 2;
     137                                        };
     138                                        Tab4 = {
     139                                                ExecutableTreeTableConfiguration = (
     140                                                        ActiveExecutable,
     141                                                        16,
     142                                                        ExecutableName,
     143                                                        217,
     144                                                );
     145                                                Frame = "{{0, 0}, {250, 100}}";
     146                                        };
     147                                        Tab5 = {
     148                                                BreakpointsTreeTableConfiguration = (
     149                                                        breakpointColumn,
     150                                                        197,
     151                                                        enabledColumn,
     152                                                        31,
     153                                                );
     154                                                Frame = "{{0, 0}, {250, 100}}";
     155                                        };
     156                                        TabCount = 6;
     157                                        TabsVisible = NO;
     158                                };
     159                                StatusViewVisible = YES;
     160                                Template = F5314676015831810DCA290F;
     161                                ToolbarVisible = YES;
     162                                WindowLocation = "{460, 270}";
     163                        };
     164                        "PBXTemplateGeometry-F5CA7EC9015C08ED0DCA290F" = {
     165                                ContentSize = "{665, 594}";
     166                                LeftSlideOut = {
     167                                        Collapsed = NO;
     168                                        Frame = "{{0, 0}, {665, 594}}";
     169                                        Split0 = {
     170                                                ActiveTab = 3;
     171                                                Collapsed = NO;
     172                                                Frame = "{{0, 0}, {665, 594}}";
     173                                                Split0 = {
     174                                                        Frame = "{{0, 304}, {665, 290}}";
     175                                                };
     176                                                SplitCount = 1;
     177                                                Tab0 = {
     178                                                        Debugger = {
     179                                                                Collapsed = NO;
     180                                                                Frame = "{{0, 0}, {484, 208}}";
     181                                                                Split0 = {
     182                                                                        Frame = "{{0, 24}, {484, 184}}";
     183                                                                        Split0 = {
     184                                                                                Frame = "{{0, 0}, {236, 184}}";
     185                                                                        };
     186                                                                        Split1 = {
     187                                                                                DebugVariablesTableConfiguration = (
     188                                                                                        Name,
     189                                                                                        48.80299,
     190                                                                                        Value,
     191                                                                                        71.07401,
     192                                                                                        Summary,
     193                                                                                        93.123,
     194                                                                                );
     195                                                                                Frame = "{{245, 0}, {239, 184}}";
     196                                                                        };
     197                                                                        SplitCount = 2;
     198                                                                };
     199                                                                SplitCount = 1;
     200                                                                Tab0 = {
     201                                                                        Frame = "{{0, 0}, {100, 50}}";
     202                                                                };
     203                                                                Tab1 = {
     204                                                                        Frame = "{{0, 0}, {100, 50}}";
     205                                                                };
     206                                                                TabCount = 2;
     207                                                                TabsVisible = YES;
     208                                                        };
     209                                                        Frame = "{{0, 0}, {484, 208}}";
     210                                                        LauncherConfigVersion = 7;
     211                                                };
     212                                                Tab1 = {
     213                                                        Frame = "{{0, 0}, {664, 208}}";
     214                                                        LauncherConfigVersion = 3;
     215                                                        Runner = {
     216                                                                Frame = "{{0, 0}, {664, 208}}";
     217                                                        };
     218                                                };
     219                                                Tab2 = {
     220                                                        BuildMessageFrame = "{{0, 0}, {666, 43}}";
     221                                                        BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
     222                                                        Frame = "{{0, 0}, {664, 50}}";
     223                                                };
     224                                                Tab3 = {
     225                                                        Frame = "{{0, 0}, {665, 298}}";
     226                                                };
     227                                                TabCount = 4;
     228                                                TabsVisible = NO;
     229                                        };
     230                                        SplitCount = 1;
     231                                        Tab0 = {
     232                                                Frame = "{{0, 0}, {313, 531}}";
     233                                                GroupTreeTableConfiguration = (
     234                                                        TargetStatusColumn,
     235                                                        18,
     236                                                        MainColumn,
     237                                                        280,
     238                                                );
     239                                        };
     240                                        Tab1 = {
     241                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     242                                                ClassesTreeTableConfiguration = (
     243                                                        PBXBookColumnIdentifier,
     244                                                        20,
     245                                                        PBXClassColumnIdentifier,
     246                                                        237,
     247                                                );
     248                                                Frame = "{{0, 0}, {278, 659}}";
     249                                                MembersFrame = "{{0, 407}, {280, 252}}";
     250                                                MembersTreeTableConfiguration = (
     251                                                        PBXBookColumnIdentifier,
     252                                                        20,
     253                                                        PBXMethodColumnIdentifier,
     254                                                        236,
     255                                                );
     256                                        };
     257                                        Tab2 = {
     258                                                Frame = "{{0, 0}, {200, 100}}";
     259                                        };
     260                                        Tab3 = {
     261                                                Frame = "{{0, 0}, {200, 557}}";
     262                                                Split0 = {
     263                                                        Frame = "{{0, 0}, {200, 270}}";
     264                                                        TargetTreeTableConfiguration = (
     265                                                                ActiveTarget,
     266                                                                16,
     267                                                                TargetName,
     268                                                                168,
     269                                                        );
     270                                                };
     271                                                Split1 = {
     272                                                        BuildStyleTreeTableConfiguration = (
     273                                                                IsActive,
     274                                                                16,
     275                                                                Name,
     276                                                                169,
     277                                                        );
     278                                                        Frame = "{{0, 279}, {200, 278}}";
     279                                                };
     280                                                SplitCount = 2;
     281                                        };
     282                                        Tab4 = {
     283                                                ExecutableTreeTableConfiguration = (
     284                                                        ActiveExecutable,
     285                                                        16,
     286                                                        ExecutableName,
     287                                                        217,
     288                                                );
     289                                                Frame = "{{0, 0}, {250, 100}}";
     290                                        };
     291                                        Tab5 = {
     292                                                BreakpointsTreeTableConfiguration = (
     293                                                        breakpointColumn,
     294                                                        197,
     295                                                        enabledColumn,
     296                                                        31,
     297                                                );
     298                                                Frame = "{{0, 0}, {250, 100}}";
     299                                        };
     300                                        TabCount = 6;
     301                                        TabsVisible = NO;
     302                                };
     303                                StatusViewVisible = NO;
     304                                Template = F5CA7EC9015C08ED0DCA290F;
     305                                ToolbarVisible = NO;
     306                                WindowLocation = "{69, 216}";
     307                        };
     308                        "PBXTemplateGeometry-F5CA7ECB015C094F0DCA290F" = {
     309                                ContentSize = "{668, 621}";
     310                                LeftSlideOut = {
     311                                        Collapsed = NO;
     312                                        Frame = "{{0, 0}, {668, 621}}";
    26313                                        Split0 = {
    27314                                                Collapsed = NO;
    28                                                 Frame = "{{0, 0}, {705, 569}}";
    29                                                 Split0 = {
    30                                                         Frame = "{{0, 0}, {705, 569}}";
     315                                                Frame = "{{0, 0}, {668, 621}}";
     316                                                Split0 = {
     317                                                        Frame = "{{0, 0}, {668, 621}}";
    31318                                                };
    32319                                                SplitCount = 1;
     
    67354                                                };
    68355                                                Tab1 = {
    69                                                         Frame = "{{0, 0}, {522, 208}}";
     356                                                        Frame = "{{0, 0}, {664, 208}}";
    70357                                                        LauncherConfigVersion = 3;
    71358                                                        Runner = {
    72                                                                 Frame = "{{0, 0}, {522, 208}}";
     359                                                                Frame = "{{0, 0}, {664, 208}}";
    73360                                                        };
    74361                                                };
    75362                                                Tab2 = {
    76                                                         BuildMessageFrame = "{{0, 0}, {809, 410}}";
    77                                                         BuildTranscriptFrame = "{{0, 419}, {809, 119}}";
    78                                                         Frame = "{{0, 0}, {807, 536}}";
     363                                                        BuildMessageFrame = "{{0, 0}, {666, 43}}";
     364                                                        BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
     365                                                        Frame = "{{0, 0}, {664, 50}}";
    79366                                                };
    80367                                                Tab3 = {
     
    86373                                        SplitCount = 1;
    87374                                        Tab0 = {
    88                                                 Frame = "{{0, 0}, {300, 533}}";
     375                                                Frame = "{{0, 0}, {313, 531}}";
    89376                                                GroupTreeTableConfiguration = (
    90377                                                        TargetStatusColumn,
    91378                                                        18,
    92379                                                        MainColumn,
    93                                                         267,
     380                                                        280,
    94381                                                );
    95382                                        };
     
    115402                                        };
    116403                                        Tab3 = {
    117                                                 Frame = "{{0, 0}, {222, 536}}";
    118                                                 TargetTableConfiguration = (
    119                                                         ActiveObject,
     404                                                Frame = "{{0, 0}, {200, 557}}";
     405                                                Split0 = {
     406                                                        Frame = "{{0, 0}, {200, 270}}";
     407                                                        TargetTreeTableConfiguration = (
     408                                                                ActiveTarget,
     409                                                                16,
     410                                                                TargetName,
     411                                                                168,
     412                                                        );
     413                                                };
     414                                                Split1 = {
     415                                                        BuildStyleTreeTableConfiguration = (
     416                                                                IsActive,
     417                                                                16,
     418                                                                Name,
     419                                                                169,
     420                                                        );
     421                                                        Frame = "{{0, 279}, {200, 278}}";
     422                                                };
     423                                                SplitCount = 2;
     424                                        };
     425                                        Tab4 = {
     426                                                ExecutableTreeTableConfiguration = (
     427                                                        ActiveExecutable,
    120428                                                        16,
    121                                                         ObjectNames,
    122                                                         202.296,
    123                                                 );
    124                                         };
    125                                         Tab4 = {
     429                                                        ExecutableName,
     430                                                        217,
     431                                                );
     432                                                Frame = "{{0, 0}, {250, 100}}";
     433                                        };
     434                                        Tab5 = {
    126435                                                BreakpointsTreeTableConfiguration = (
    127436                                                        breakpointColumn,
     
    130439                                                        31,
    131440                                                );
    132                                                 Frame = "{{0, 0}, {250, 528}}";
    133                                         };
    134                                         TabCount = 5;
     441                                                Frame = "{{0, 0}, {250, 100}}";
     442                                        };
     443                                        TabCount = 6;
    135444                                        TabsVisible = NO;
    136445                                };
    137446                                StatusViewVisible = NO;
    138                                 Template = F5CA7EC8015C06940DCA290F;
    139                                 ToolbarVisible = YES;
    140                                 WindowLocation = "{11, 351}";
     447                                Template = F5CA7ECB015C094F0DCA290F;
     448                                ToolbarVisible = NO;
     449                                WindowLocation = "{361, 189}";
    141450                        };
    142                         "PBXTemplateGeometry-F5CA7ECB015C094F0DCA290F" = {
    143                                 ContentSize = "{668, 621}";
     451                        "PBXTemplateGeometry-F5CA7ECC015C09990DCA290F" = {
     452                                ContentSize = "{773, 558}";
    144453                                LeftSlideOut = {
    145454                                        Collapsed = NO;
    146                                         Frame = "{{0, 0}, {668, 621}}";
     455                                        Frame = "{{0, 23}, {773, 535}}";
     456                                        Split0 = {
     457                                                ActiveTab = 0;
     458                                                Collapsed = NO;
     459                                                Frame = "{{24, 0}, {749, 535}}";
     460                                                Split0 = {
     461                                                        Frame = "{{0, 337}, {749, 198}}";
     462                                                };
     463                                                SplitCount = 1;
     464                                                Tab0 = {
     465                                                        Debugger = {
     466                                                                ActiveTab = 1;
     467                                                                Collapsed = NO;
     468                                                                Frame = "{{0, 0}, {749, 331}}";
     469                                                                Split0 = {
     470                                                                        Frame = "{{0, 127}, {749, 204}}";
     471                                                                        Split0 = {
     472                                                                                Frame = "{{0, 0}, {366, 204}}";
     473                                                                        };
     474                                                                        Split1 = {
     475                                                                                DebugVariablesTableConfiguration = (
     476                                                                                        Name,
     477                                                                                        120.803,
     478                                                                                        Value,
     479                                                                                        116.074,
     480                                                                                        Summary,
     481                                                                                        111.123,
     482                                                                                );
     483                                                                                Frame = "{{375, 0}, {374, 204}}";
     484                                                                        };
     485                                                                        SplitCount = 2;
     486                                                                };
     487                                                                SplitCount = 1;
     488                                                                Tab0 = {
     489                                                                        Frame = "{{0, 0}, {100, 50}}";
     490                                                                };
     491                                                                Tab1 = {
     492                                                                        Frame = "{{0, 0}, {749, 103}}";
     493                                                                };
     494                                                                TabCount = 2;
     495                                                                TabsVisible = YES;
     496                                                        };
     497                                                        Frame = "{{0, 0}, {749, 331}}";
     498                                                        LauncherConfigVersion = 7;
     499                                                };
     500                                                Tab1 = {
     501                                                        Frame = "{{0, 0}, {664, 208}}";
     502                                                        LauncherConfigVersion = 3;
     503                                                        Runner = {
     504                                                                Frame = "{{0, 0}, {664, 208}}";
     505                                                        };
     506                                                };
     507                                                Tab2 = {
     508                                                        BuildMessageFrame = "{{0, 0}, {666, 43}}";
     509                                                        BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
     510                                                        Frame = "{{0, 0}, {664, 50}}";
     511                                                };
     512                                                Tab3 = {
     513                                                        Frame = "{{0, 0}, {612, 295}}";
     514                                                };
     515                                                TabCount = 4;
     516                                                TabsVisible = NO;
     517                                        };
     518                                        SplitCount = 1;
     519                                        Tab0 = {
     520                                                Frame = "{{0, 0}, {313, 531}}";
     521                                                GroupTreeTableConfiguration = (
     522                                                        TargetStatusColumn,
     523                                                        18,
     524                                                        MainColumn,
     525                                                        280,
     526                                                );
     527                                        };
     528                                        Tab1 = {
     529                                                ClassesFrame = "{{0, 0}, {280, 398}}";
     530                                                ClassesTreeTableConfiguration = (
     531                                                        PBXBookColumnIdentifier,
     532                                                        20,
     533                                                        PBXClassColumnIdentifier,
     534                                                        237,
     535                                                );
     536                                                Frame = "{{0, 0}, {278, 659}}";
     537                                                MembersFrame = "{{0, 407}, {280, 252}}";
     538                                                MembersTreeTableConfiguration = (
     539                                                        PBXBookColumnIdentifier,
     540                                                        20,
     541                                                        PBXMethodColumnIdentifier,
     542                                                        236,
     543                                                );
     544                                        };
     545                                        Tab2 = {
     546                                                Frame = "{{0, 0}, {200, 100}}";
     547                                        };
     548                                        Tab3 = {
     549                                                Frame = "{{0, 0}, {200, 557}}";
     550                                                Split0 = {
     551                                                        Frame = "{{0, 0}, {200, 270}}";
     552                                                        TargetTreeTableConfiguration = (
     553                                                                ActiveTarget,
     554                                                                16,
     555                                                                TargetName,
     556                                                                168,
     557                                                        );
     558                                                };
     559                                                Split1 = {
     560                                                        BuildStyleTreeTableConfiguration = (
     561                                                                IsActive,
     562                                                                16,
     563                                                                Name,
     564                                                                169,
     565                                                        );
     566                                                        Frame = "{{0, 279}, {200, 278}}";
     567                                                };
     568                                                SplitCount = 2;
     569                                        };
     570                                        Tab4 = {
     571                                                ExecutableTreeTableConfiguration = (
     572                                                        ActiveExecutable,
     573                                                        16,
     574                                                        ExecutableName,
     575                                                        217,
     576                                                );
     577                                                Frame = "{{0, 0}, {250, 100}}";
     578                                        };
     579                                        Tab5 = {
     580                                                BreakpointsTreeTableConfiguration = (
     581                                                        breakpointColumn,
     582                                                        197,
     583                                                        enabledColumn,
     584                                                        31,
     585                                                );
     586                                                Frame = "{{0, 0}, {250, 100}}";
     587                                        };
     588                                        TabCount = 6;
     589                                        TabsVisible = YES;
     590                                };
     591                                StatusViewVisible = YES;
     592                                Template = F5CA7ECC015C09990DCA290F;
     593                                ToolbarVisible = YES;
     594                                WindowLocation = "{13, 212}";
     595                        };
     596                        "PBXTemplateGeometry-F5E465990156DFB90DCA290F" = {
     597                                ContentSize = "{352, 553}";
     598                                LeftSlideOut = {
     599                                        ActiveTab = 0;
     600                                        Collapsed = YES;
     601                                        Frame = "{{0, 23}, {352, 530}}";
    147602                                        Split0 = {
    148603                                                Collapsed = NO;
    149                                                 Frame = "{{0, 0}, {668, 621}}";
    150                                                 Split0 = {
    151                                                         Frame = "{{0, 0}, {668, 621}}";
     604                                                Frame = "{{1e+06, 1e+06}, {0, 530}}";
     605                                                Split0 = {
     606                                                        Frame = "{{0, 0}, {0, 530}}";
    152607                                                };
    153608                                                SplitCount = 1;
     
    207662                                        SplitCount = 1;
    208663                                        Tab0 = {
    209                                                 Frame = "{{0, 0}, {313, 531}}";
     664                                                Frame = "{{0, 0}, {328, 530}}";
    210665                                                GroupTreeTableConfiguration = (
    211666                                                        TargetStatusColumn,
    212667                                                        18,
    213668                                                        MainColumn,
    214                                                         280,
     669                                                        295,
    215670                                                );
    216671                                        };
    217672                                        Tab1 = {
    218                                                 ClassesFrame = "{{0, 0}, {280, 398}}";
     673                                                ClassesFrame = "{{0, 0}, {343, 348}}";
    219674                                                ClassesTreeTableConfiguration = (
    220675                                                        PBXBookColumnIdentifier,
    221676                                                        20,
    222677                                                        PBXClassColumnIdentifier,
    223                                                         237,
    224                                                 );
    225                                                 Frame = "{{0, 0}, {278, 659}}";
    226                                                 MembersFrame = "{{0, 407}, {280, 252}}";
     678                                                        300,
     679                                                );
     680                                                Frame = "{{0, 0}, {341, 578}}";
     681                                                MembersFrame = "{{0, 357}, {343, 221}}";
    227682                                                MembersTreeTableConfiguration = (
    228683                                                        PBXBookColumnIdentifier,
    229684                                                        20,
    230685                                                        PBXMethodColumnIdentifier,
    231                                                         236,
     686                                                        299,
    232687                                                );
    233688                                        };
    234689                                        Tab2 = {
    235                                                 Frame = "{{0, 0}, {200, 100}}";
     690                                                Frame = "{{0, 0}, {319, 576}}";
    236691                                        };
    237692                                        Tab3 = {
    238                                                 Frame = "{{0, 0}, {200, 557}}";
    239                                                 TargetTableConfiguration = (
    240                                                         ActiveObject,
     693                                                Frame = "{{0, 0}, {341, 578}}";
     694                                                Split0 = {
     695                                                        Frame = "{{0, 0}, {341, 281}}";
     696                                                        TargetTreeTableConfiguration = (
     697                                                                ActiveTarget,
     698                                                                16,
     699                                                                TargetName,
     700                                                                309,
     701                                                        );
     702                                                };
     703                                                Split1 = {
     704                                                        BuildStyleTreeTableConfiguration = (
     705                                                                IsActive,
     706                                                                16,
     707                                                                Name,
     708                                                                310,
     709                                                        );
     710                                                        Frame = "{{0, 290}, {341, 288}}";
     711                                                };
     712                                                SplitCount = 2;
     713                                        };
     714                                        Tab4 = {
     715                                                ExecutableTreeTableConfiguration = (
     716                                                        ActiveExecutable,
    241717                                                        16,
    242                                                         ObjectNames,
    243                                                         202.296,
    244                                                 );
    245                                         };
    246                                         Tab4 = {
     718                                                        ExecutableName,
     719                                                        286,
     720                                                );
     721                                                Frame = "{{0, 0}, {319, 576}}";
     722                                        };
     723                                        Tab5 = {
    247724                                                BreakpointsTreeTableConfiguration = (
    248725                                                        breakpointColumn,
     
    253730                                                Frame = "{{0, 0}, {250, 100}}";
    254731                                        };
    255                                         TabCount = 5;
    256                                         TabsVisible = NO;
    257                                 };
    258                                 StatusViewVisible = NO;
    259                                 Template = F5CA7ECB015C094F0DCA290F;
    260                                 ToolbarVisible = NO;
    261                                 WindowLocation = "{48, 349}";
    262                         };
    263                         "PBXTemplateGeometry-F5CA7ECC015C09990DCA290F" = {
    264                                 ContentSize = "{956, 601}";
    265                                 LeftSlideOut = {
    266                                         ActiveTab = 4;
    267                                         Collapsed = NO;
    268                                         Frame = "{{0, 23}, {956, 578}}";
    269                                         Split0 = {
    270                                                 ActiveTab = 0;
    271                                                 Collapsed = NO;
    272                                                 Frame = "{{274, 0}, {682, 578}}";
    273                                                 Split0 = {
    274                                                         Frame = "{{0, 273}, {682, 305}}";
    275                                                 };
    276                                                 SplitCount = 1;
    277                                                 Tab0 = {
    278                                                         Debugger = {
    279                                                                 Collapsed = NO;
    280                                                                 Frame = "{{0, 0}, {682, 267}}";
    281                                                                 Split0 = {
    282                                                                         Frame = "{{0, 24}, {682, 243}}";
    283                                                                         Split0 = {
    284                                                                                 Frame = "{{0, 0}, {328, 243}}";
    285                                                                         };
    286                                                                         Split1 = {
    287                                                                                 DebugVariablesTableConfiguration = (
    288                                                                                         Name,
    289                                                                                         93.80298,
    290                                                                                         Value,
    291                                                                                         116.074,
    292                                                                                         Summary,
    293                                                                                         109.123,
    294                                                                                 );
    295                                                                                 Frame = "{{337, 0}, {345, 243}}";
    296                                                                         };
    297                                                                         SplitCount = 2;
    298                                                                 };
    299                                                                 SplitCount = 1;
    300                                                                 Tab0 = {
    301                                                                         Frame = "{{0, 0}, {100, 50}}";
    302                                                                 };
    303                                                                 Tab1 = {
    304                                                                         Frame = "{{0, 0}, {100, 50}}";
    305                                                                 };
    306                                                                 TabCount = 2;
    307                                                                 TabsVisible = YES;
    308                                                         };
    309                                                         Frame = "{{0, 0}, {682, 267}}";
    310                                                         LauncherConfigVersion = 7;
    311                                                 };
    312                                                 Tab1 = {
    313                                                         Frame = "{{0, 0}, {664, 208}}";
    314                                                         LauncherConfigVersion = 3;
    315                                                         Runner = {
    316                                                                 Frame = "{{0, 0}, {664, 208}}";
    317                                                         };
    318                                                 };
    319                                                 Tab2 = {
    320                                                         BuildMessageFrame = "{{0, 0}, {666, 43}}";
    321                                                         BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
    322                                                         Frame = "{{0, 0}, {664, 50}}";
    323                                                 };
    324                                                 Tab3 = {
    325                                                         Frame = "{{0, 0}, {612, 295}}";
    326                                                 };
    327                                                 TabCount = 4;
    328                                                 TabsVisible = NO;
    329                                         };
    330                                         SplitCount = 1;
    331                                         Tab0 = {
    332                                                 Frame = "{{0, 0}, {313, 531}}";
    333                                                 GroupTreeTableConfiguration = (
    334                                                         TargetStatusColumn,
    335                                                         18,
    336                                                         MainColumn,
    337                                                         280,
    338                                                 );
    339                                         };
    340                                         Tab1 = {
    341                                                 ClassesFrame = "{{0, 0}, {280, 398}}";
    342                                                 ClassesTreeTableConfiguration = (
    343                                                         PBXBookColumnIdentifier,
    344                                                         20,
    345                                                         PBXClassColumnIdentifier,
    346                                                         237,
    347                                                 );
    348                                                 Frame = "{{0, 0}, {278, 659}}";
    349                                                 MembersFrame = "{{0, 407}, {280, 252}}";
    350                                                 MembersTreeTableConfiguration = (
    351                                                         PBXBookColumnIdentifier,
    352                                                         20,
    353                                                         PBXMethodColumnIdentifier,
    354                                                         236,
    355                                                 );
    356                                         };
    357                                         Tab2 = {
    358                                                 Frame = "{{0, 0}, {200, 100}}";
    359                                         };
    360                                         Tab3 = {
    361                                                 Frame = "{{0, 0}, {200, 557}}";
    362                                                 TargetTableConfiguration = (
    363                                                         ActiveObject,
    364                                                         16,
    365                                                         ObjectNames,
    366                                                         202.296,
    367                                                 );
    368                                         };
    369                                         Tab4 = {
    370                                                 BreakpointsTreeTableConfiguration = (
    371                                                         breakpointColumn,
    372                                                         197,
    373                                                         enabledColumn,
    374                                                         31,
    375                                                 );
    376                                                 Frame = "{{0, 0}, {250, 578}}";
    377                                         };
    378                                         TabCount = 5;
     732                                        TabCount = 6;
    379733                                        TabsVisible = YES;
    380734                                };
    381735                                StatusViewVisible = YES;
    382                                 Template = F5CA7ECC015C09990DCA290F;
     736                                Template = F5E465990156DFB90DCA290F;
    383737                                ToolbarVisible = YES;
    384                                 WindowLocation = "{79, 361}";
     738                                WindowLocation = "{2, 217}";
    385739                        };
    386740                        PBXWorkspaceContents = (
     
    459813                                                Split0 = {
    460814                                                        Split0 = {
     815                                                                NavContent0 = {
     816                                                                        bookmark = F562F80B037E5D2101AEEDB1;
     817                                                                        history = (
     818                                                                                F5B163A5037E543A01AEEDB1,
     819                                                                        );
     820                                                                };
    461821                                                                NavCount = 1;
    462822                                                                NavGeometry0 = {
    463                                                                         Frame = "{{0, 0}, {618, 150}}";
     823                                                                        Frame = "{{0, 0}, {668, 621}}";
    464824                                                                        NavBarVisible = YES;
    465825                                                                };
     
    494854                                                Split0 = {
    495855                                                        Split0 = {
    496                                                                 NavContent0 = {
    497                                                                         bookmark = F562F814037E7F6101AEEDB1;
    498                                                                         history = (
    499                                                                                 F562F813037E7F6101AEEDB1,
    500                                                                         );
    501                                                                 };
    502856                                                                NavCount = 1;
    503857                                                                NavGeometry0 = {
    504                                                                         Frame = "{{0, 0}, {668, 621}}";
    505                                                                         NavBarVisible = YES;
    506                                                                 };
    507                                                         };
    508                                                         SplitCount = 1;
    509                                                         Tab0 = {
    510                                                                 Debugger = {
    511                                                                         Split0 = {
    512                                                                                 SplitCount = 2;
    513                                                                         };
    514                                                                         SplitCount = 1;
    515                                                                         TabCount = 2;
    516                                                                 };
    517                                                                 LauncherConfigVersion = 7;
    518                                                         };
    519                                                         Tab1 = {
    520                                                                 LauncherConfigVersion = 3;
    521                                                                 Runner = {
    522                                                                 };
    523                                                         };
    524                                                         TabCount = 4;
    525                                                 };
    526                                                 SplitCount = 1;
    527                                                 Tab1 = {
    528                                                         OptionsSetName = "Hierarchy, all classes";
    529                                                 };
    530                                                 TabCount = 5;
    531                                         };
    532                                 },
    533                                 {
    534                                         LeftSlideOut = {
    535                                                 Split0 = {
    536                                                         Split0 = {
    537                                                                 NavContent0 = {
    538                                                                         bookmark = F562F818037E7F6101AEEDB1;
    539                                                                         history = (
    540                                                                                 F562F815037E7F6101AEEDB1,
    541                                                                                 F562F816037E7F6101AEEDB1,
    542                                                                         );
    543                                                                         prevStack = (
    544                                                                                 F562F817037E7F6101AEEDB1,
    545                                                                         );
    546                                                                 };
    547                                                                 NavCount = 1;
    548                                                                 NavGeometry0 = {
    549                                                                         Frame = "{{0, 0}, {682, 305}}";
     858                                                                        Frame = "{{0, 0}, {618, 150}}";
    550859                                                                        NavBarVisible = YES;
    551860                                                                };
     
    8231132                                },
    8241133                                {
     1134                                        ContentSize = "{668, 621}";
     1135                                        LeftSlideOut = {
     1136                                                Collapsed = NO;
     1137                                                Frame = "{{0, 0}, {668, 621}}";
     1138                                                Split0 = {
     1139                                                        Collapsed = NO;
     1140                                                        Frame = "{{0, 0}, {668, 621}}";
     1141                                                        Split0 = {
     1142                                                                Frame = "{{0, 0}, {668, 621}}";
     1143                                                        };
     1144                                                        SplitCount = 1;
     1145                                                        Tab0 = {
     1146                                                                Debugger = {
     1147                                                                        Collapsed = NO;
     1148                                                                        Frame = "{{0, 0}, {484, 208}}";
     1149                                                                        Split0 = {
     1150                                                                                Frame = "{{0, 24}, {484, 184}}";
     1151                                                                                Split0 = {
     1152                                                                                        Frame = "{{0, 0}, {236, 184}}";
     1153                                                                                };
     1154                                                                                Split1 = {
     1155                                                                                        DebugVariablesTableConfiguration = (
     1156                                                                                                Name,
     1157                                                                                                123,
     1158                                                                                                Value,
     1159                                                                                                85,
     1160                                                                                                Summary,
     1161                                                                                                62.123,
     1162                                                                                        );
     1163                                                                                        Frame = "{{245, 0}, {239, 184}}";
     1164                                                                                };
     1165                                                                                SplitCount = 2;
     1166                                                                        };
     1167                                                                        SplitCount = 1;
     1168                                                                        Tab0 = {
     1169                                                                                Frame = "{{0, 0}, {100, 50}}";
     1170                                                                        };
     1171                                                                        Tab1 = {
     1172                                                                                Frame = "{{0, 0}, {100, 50}}";
     1173                                                                        };
     1174                                                                        TabCount = 2;
     1175                                                                        TabsVisible = YES;
     1176                                                                };
     1177                                                                Frame = "{{0, 0}, {484, 208}}";
     1178                                                                LauncherConfigVersion = 7;
     1179                                                        };
     1180                                                        Tab1 = {
     1181                                                                Frame = "{{0, 0}, {664, 208}}";
     1182                                                                LauncherConfigVersion = 3;
     1183                                                                Runner = {
     1184                                                                        Frame = "{{0, 0}, {664, 208}}";
     1185                                                                };
     1186                                                        };
     1187                                                        Tab2 = {
     1188                                                                BuildMessageFrame = "{{0, 0}, {666, 43}}";
     1189                                                                BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
     1190                                                                Frame = "{{0, 0}, {664, 50}}";
     1191                                                        };
     1192                                                        Tab3 = {
     1193                                                                Frame = "{{0, 0}, {612, 295}}";
     1194                                                        };
     1195                                                        TabCount = 4;
     1196                                                        TabsVisible = NO;
     1197                                                };
     1198                                                SplitCount = 1;
     1199                                                Tab0 = {
     1200                                                        Frame = "{{0, 0}, {313, 531}}";
     1201                                                        GroupTreeTableConfiguration = (
     1202                                                                TargetStatusColumn,
     1203                                                                18,
     1204                                                                MainColumn,
     1205                                                                280,
     1206                                                        );
     1207                                                };
     1208                                                Tab1 = {
     1209                                                        ClassesFrame = "{{0, 0}, {280, 398}}";
     1210                                                        ClassesTreeTableConfiguration = (
     1211                                                                PBXBookColumnIdentifier,
     1212                                                                20,
     1213                                                                PBXClassColumnIdentifier,
     1214                                                                237,
     1215                                                        );
     1216                                                        Frame = "{{0, 0}, {278, 659}}";
     1217                                                        MembersFrame = "{{0, 407}, {280, 252}}";
     1218                                                        MembersTreeTableConfiguration = (
     1219                                                                PBXBookColumnIdentifier,
     1220                                                                20,
     1221                                                                PBXMethodColumnIdentifier,
     1222                                                                236,
     1223                                                        );
     1224                                                };
     1225                                                Tab2 = {
     1226                                                        Frame = "{{0, 0}, {200, 100}}";
     1227                                                };
     1228                                                Tab3 = {
     1229                                                        Frame = "{{0, 0}, {200, 557}}";
     1230                                                        TargetTableConfiguration = (
     1231                                                                ActiveObject,
     1232                                                                16,
     1233                                                                ObjectNames,
     1234                                                                202.296,
     1235                                                        );
     1236                                                };
     1237                                                Tab4 = {
     1238                                                        BreakpointsTreeTableConfiguration = (
     1239                                                                breakpointColumn,
     1240                                                                197,
     1241                                                                enabledColumn,
     1242                                                                31,
     1243                                                        );
     1244                                                        Frame = "{{0, 0}, {250, 100}}";
     1245                                                };
     1246                                                TabCount = 5;
     1247                                                TabsVisible = NO;
     1248                                        };
     1249                                        StatusViewVisible = NO;
     1250                                        Template = F5CA7ECB015C094F0DCA290F;
     1251                                        ToolbarVisible = NO;
     1252                                        WindowLocation = "{392, 503}";
     1253                                },
     1254                                {
    8251255                                        ContentSize = "{618, 257}";
    8261256                                        LeftSlideOut = {
     
    8781308                                                        };
    8791309                                                        Tab2 = {
    880                                                                 BuildMessageFrame = "{{0, 0}, {620, 122}}";
    881                                                                 BuildTranscriptFrame = "{{0, 131}, {620, 99}}";
     1310                                                                BuildMessageFrame = "{{0, 0}, {620, 123}}";
     1311                                                                BuildTranscriptFrame = "{{0, 132}, {620, 98}}";
    8821312                                                                Frame = "{{0, 0}, {618, 228}}";
    8831313                                                        };
     
    9441374                                        WindowLocation = "{427, 271}";
    9451375                                },
    946                                 {
    947                                         ContentSize = "{668, 621}";
    948                                         LeftSlideOut = {
    949                                                 Collapsed = NO;
    950                                                 Frame = "{{0, 0}, {668, 621}}";
    951                                                 Split0 = {
    952                                                         Collapsed = NO;
    953                                                         Frame = "{{0, 0}, {668, 621}}";
    954                                                         Split0 = {
    955                                                                 Frame = "{{0, 0}, {668, 621}}";
    956                                                         };
    957                                                         SplitCount = 1;
    958                                                         Tab0 = {
    959                                                                 Debugger = {
    960                                                                         Collapsed = NO;
    961                                                                         Frame = "{{0, 0}, {484, 208}}";
    962                                                                         Split0 = {
    963                                                                                 Frame = "{{0, 24}, {484, 184}}";
    964                                                                                 Split0 = {
    965                                                                                         Frame = "{{0, 0}, {236, 184}}";
    966                                                                                 };
    967                                                                                 Split1 = {
    968                                                                                         DebugVariablesTableConfiguration = (
    969                                                                                                 Name,
    970                                                                                                 123,
    971                                                                                                 Value,
    972                                                                                                 85,
    973                                                                                                 Summary,
    974                                                                                                 62.123,
    975                                                                                         );
    976                                                                                         Frame = "{{245, 0}, {239, 184}}";
    977                                                                                 };
    978                                                                                 SplitCount = 2;
    979                                                                         };
    980                                                                         SplitCount = 1;
    981                                                                         Tab0 = {
    982                                                                                 Frame = "{{0, 0}, {100, 50}}";
    983                                                                         };
    984                                                                         Tab1 = {
    985                                                                                 Frame = "{{0, 0}, {100, 50}}";
    986                                                                         };
    987                                                                         TabCount = 2;
    988                                                                         TabsVisible = YES;
    989                                                                 };
    990                                                                 Frame = "{{0, 0}, {484, 208}}";
    991                                                                 LauncherConfigVersion = 7;
    992                                                         };
    993                                                         Tab1 = {
    994                                                                 Frame = "{{0, 0}, {664, 208}}";
    995                                                                 LauncherConfigVersion = 3;
    996                                                                 Runner = {
    997                                                                         Frame = "{{0, 0}, {664, 208}}";
    998                                                                 };
    999                                                         };
    1000                                                         Tab2 = {
    1001                                                                 BuildMessageFrame = "{{0, 0}, {666, 43}}";
    1002                                                                 BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
    1003                                                                 Frame = "{{0, 0}, {664, 50}}";
    1004                                                         };
    1005                                                         Tab3 = {
    1006                                                                 Frame = "{{0, 0}, {612, 295}}";
    1007                                                         };
    1008                                                         TabCount = 4;
    1009                                                         TabsVisible = NO;
    1010                                                 };
    1011                                                 SplitCount = 1;
    1012                                                 Tab0 = {
    1013                                                         Frame = "{{0, 0}, {313, 531}}";
    1014                                                         GroupTreeTableConfiguration = (
    1015                                                                 TargetStatusColumn,
    1016                                                                 18,
    1017                                                                 MainColumn,
    1018                                                                 280,
    1019                                                         );
    1020                                                 };
    1021                                                 Tab1 = {
    1022                                                         ClassesFrame = "{{0, 0}, {280, 398}}";
    1023                                                         ClassesTreeTableConfiguration = (
    1024                                                                 PBXBookColumnIdentifier,
    1025                                                                 20,
    1026                                                                 PBXClassColumnIdentifier,
    1027                                                                 237,
    1028                                                         );
    1029                                                         Frame = "{{0, 0}, {278, 659}}";
    1030                                                         MembersFrame = "{{0, 407}, {280, 252}}";
    1031                                                         MembersTreeTableConfiguration = (
    1032                                                                 PBXBookColumnIdentifier,
    1033                                                                 20,
    1034                                                                 PBXMethodColumnIdentifier,
    1035                                                                 236,
    1036                                                         );
    1037                                                 };
    1038                                                 Tab2 = {
    1039                                                         Frame = "{{0, 0}, {200, 100}}";
    1040                                                 };
    1041                                                 Tab3 = {
    1042                                                         Frame = "{{0, 0}, {200, 557}}";
    1043                                                         TargetTableConfiguration = (
    1044                                                                 ActiveObject,
    1045                                                                 16,
    1046                                                                 ObjectNames,
    1047                                                                 202.296,
    1048                                                         );
    1049                                                 };
    1050                                                 Tab4 = {
    1051                                                         BreakpointsTreeTableConfiguration = (
    1052                                                                 breakpointColumn,
    1053                                                                 197,
    1054                                                                 enabledColumn,
    1055                                                                 31,
    1056                                                         );
    1057                                                         Frame = "{{0, 0}, {250, 100}}";
    1058                                                 };
    1059                                                 TabCount = 5;
    1060                                                 TabsVisible = NO;
    1061                                         };
    1062                                         StatusViewVisible = NO;
    1063                                         Template = F5CA7ECB015C094F0DCA290F;
    1064                                         ToolbarVisible = NO;
    1065                                         WindowLocation = "{392, 503}";
    1066                                 },
    1067                                 {
    1068                                         ContentSize = "{956, 601}";
    1069                                         LeftSlideOut = {
    1070                                                 ActiveTab = 4;
    1071                                                 Collapsed = NO;
    1072                                                 Frame = "{{0, 23}, {956, 578}}";
    1073                                                 Split0 = {
    1074                                                         ActiveTab = 0;
    1075                                                         Collapsed = NO;
    1076                                                         Frame = "{{274, 0}, {682, 578}}";
    1077                                                         Split0 = {
    1078                                                                 Frame = "{{0, 273}, {682, 305}}";
    1079                                                         };
    1080                                                         SplitCount = 1;
    1081                                                         Tab0 = {
    1082                                                                 Debugger = {
    1083                                                                         Collapsed = NO;
    1084                                                                         Frame = "{{0, 0}, {682, 267}}";
    1085                                                                         Split0 = {
    1086                                                                                 Frame = "{{0, 24}, {682, 243}}";
    1087                                                                                 Split0 = {
    1088                                                                                         Frame = "{{0, 0}, {329, 243}}";
    1089                                                                                 };
    1090                                                                                 Split1 = {
    1091                                                                                         DebugVariablesTableConfiguration = (
    1092                                                                                                 Name,
    1093                                                                                                 93.80298,
    1094                                                                                                 Value,
    1095                                                                                                 116.074,
    1096                                                                                                 Summary,
    1097                                                                                                 108.123,
    1098                                                                                         );
    1099                                                                                         Frame = "{{338, 0}, {344, 243}}";
    1100                                                                                 };
    1101                                                                                 SplitCount = 2;
    1102                                                                         };
    1103                                                                         SplitCount = 1;
    1104                                                                         Tab0 = {
    1105                                                                                 Frame = "{{0, 0}, {100, 50}}";
    1106                                                                         };
    1107                                                                         Tab1 = {
    1108                                                                                 Frame = "{{0, 0}, {100, 50}}";
    1109                                                                         };
    1110                                                                         TabCount = 2;
    1111                                                                         TabsVisible = YES;
    1112                                                                 };
    1113                                                                 Frame = "{{0, 0}, {682, 267}}";
    1114                                                                 LauncherConfigVersion = 7;
    1115                                                         };
    1116                                                         Tab1 = {
    1117                                                                 Frame = "{{0, 0}, {664, 208}}";
    1118                                                                 LauncherConfigVersion = 3;
    1119                                                                 Runner = {
    1120                                                                         Frame = "{{0, 0}, {664, 208}}";
    1121                                                                 };
    1122                                                         };
    1123                                                         Tab2 = {
    1124                                                                 BuildMessageFrame = "{{0, 0}, {666, 43}}";
    1125                                                                 BuildTranscriptFrame = "{{0, 52}, {666, 0}}";
    1126                                                                 Frame = "{{0, 0}, {664, 50}}";
    1127                                                         };
    1128                                                         Tab3 = {
    1129                                                                 Frame = "{{0, 0}, {612, 295}}";
    1130                                                         };
    1131                                                         TabCount = 4;
    1132                                                         TabsVisible = NO;
    1133                                                 };
    1134                                                 SplitCount = 1;
    1135                                                 Tab0 = {
    1136                                                         Frame = "{{0, 0}, {313, 531}}";
    1137                                                         GroupTreeTableConfiguration = (
    1138                                                                 TargetStatusColumn,
    1139                                                                 18,
    1140                                                                 MainColumn,
    1141                                                                 280,
    1142                                                         );
    1143                                                 };
    1144                                                 Tab1 = {
    1145                                                         ClassesFrame = "{{0, 0}, {280, 398}}";
    1146                                                         ClassesTreeTableConfiguration = (
    1147                                                                 PBXBookColumnIdentifier,
    1148                                                                 20,
    1149                                                                 PBXClassColumnIdentifier,
    1150                                                                 237,
    1151                                                         );
    1152                                                         Frame = "{{0, 0}, {278, 659}}";
    1153                                                         MembersFrame = "{{0, 407}, {280, 252}}";
    1154                                                         MembersTreeTableConfiguration = (
    1155                                                                 PBXBookColumnIdentifier,
    1156                                                                 20,
    1157                                                                 PBXMethodColumnIdentifier,
    1158                                                                 236,
    1159                                                         );
    1160                                                 };
    1161                                                 Tab2 = {
    1162                                                         Frame = "{{0, 0}, {200, 100}}";
    1163                                                 };
    1164                                                 Tab3 = {
    1165                                                         Frame = "{{0, 0}, {200, 557}}";
    1166                                                         TargetTableConfiguration = (
    1167                                                                 ActiveObject,
    1168                                                                 16,
    1169                                                                 ObjectNames,
    1170                                                                 202.296,
    1171                                                         );
    1172                                                 };
    1173                                                 Tab4 = {
    1174                                                         BreakpointsTreeTableConfiguration = (
    1175                                                                 breakpointColumn,
    1176                                                                 197,
    1177                                                                 enabledColumn,
    1178                                                                 31,
    1179                                                         );
    1180                                                         Frame = "{{0, 0}, {250, 578}}";
    1181                                                 };
    1182                                                 TabCount = 5;
    1183                                                 TabsVisible = YES;
    1184                                         };
    1185                                         StatusViewVisible = YES;
    1186                                         Template = F5CA7ECC015C09990DCA290F;
    1187                                         ToolbarVisible = YES;
    1188                                         WindowLocation = "{79, 361}";
    1189                                 },
    11901376                        );
    1191                         PBXWorkspaceStateSaveDate = 58758807;
     1377                        PBXWorkspaceStateSaveDate = 59271904;
    11921378                };
    11931379                perUserProjectItems = {
    1194                         F562F813037E7F6101AEEDB1 = F562F813037E7F6101AEEDB1;
    1195                         F562F814037E7F6101AEEDB1 = F562F814037E7F6101AEEDB1;
    1196                         F562F815037E7F6101AEEDB1 = F562F815037E7F6101AEEDB1;
    1197                         F562F816037E7F6101AEEDB1 = F562F816037E7F6101AEEDB1;
    1198                         F562F817037E7F6101AEEDB1 = F562F817037E7F6101AEEDB1;
    1199                         F562F818037E7F6101AEEDB1 = F562F818037E7F6101AEEDB1;
     1380                        F562F80B037E5D2101AEEDB1 = F562F80B037E5D2101AEEDB1;
     1381                        F5B163A5037E543A01AEEDB1 = F5B163A5037E543A01AEEDB1;
    12001382                };
    12011383                projectwideBuildSettings = {
     
    12311413                name = "PSAlarmSetController.m: inAtChanged:";
    12321414                rLen = 0;
    1233                 rLoc = 8580;
     1415                rLoc = 8686;
    12341416                rType = 0;
    12351417                vrLen = 1674;
     
    12411423                name = "PSAlarm.m: scheduledTimerWithTarget:selector:";
    12421424                rLen = 0;
    1243                 rLoc = 7029;
     1425                rLoc = 8289;
    12441426                rType = 0;
    12451427                vrLen = 822;
     
    12711453                name = "PSAlarmsController.m: numberOfRowsInTableView:";
    12721454                rLen = 0;
    1273                 rLoc = 1720;
     1455                rLoc = 1925;
    12741456                rType = 0;
    12751457                vrLen = 1085;
    12761458                vrLoc = 0;
    12771459        };
    1278         F562F810037E79EE01AEEDB1 = {
    1279                 isa = PBXSymbolicBreakpoint;
    1280                 state = 1;
    1281                 symbolName = "-[PSAlarmSetController awakeFromNib]";
    1282         };
    1283         F562F813037E7F6101AEEDB1 = {
    1284                 fRef = F59DC6D40353C9E601AEEDB1;
    1285                 isa = PBXBookmark;
    1286         };
    1287         F562F814037E7F6101AEEDB1 = {
    1288                 fRef = F59DC6D40353C9E601AEEDB1;
     1460        F562F80B037E5D2101AEEDB1 = {
     1461                fRef = F59DC6FD0354188F01AEEDB1;
    12891462                isa = PBXTextBookmark;
    1290                 name = "PSAlarmSetController.m: awakeFromNib";
     1463                name = "NJRDateFormatter.m: initWithDateFormat:allowNaturalLanguage:";
    12911464                rLen = 0;
    1292                 rLoc = 2784;
     1465                rLoc = 6368;
    12931466                rType = 0;
    1294                 vrLen = 1841;
    1295                 vrLoc = 0;
    1296         };
    1297         F562F815037E7F6101AEEDB1 = {
    1298                 fRef = F59DC6D40353C9E601AEEDB1;
    1299                 isa = PBXTextBookmark;
    1300                 name = "PSAlarmSetController.m: awakeFromNib";
    1301                 rLen = 51;
    1302                 rLoc = 3497;
    1303                 rType = 0;
    1304                 vrLen = 1188;
    1305                 vrLoc = 3010;
    1306         };
    1307         F562F816037E7F6101AEEDB1 = {
    1308                 fRef = F5F240CC036A877301FE7503;
    1309                 isa = PBXTextBookmark;
    1310                 rLen = 0;
    1311                 rLoc = 71;
    1312                 rType = 1;
    1313         };
    1314         F562F817037E7F6101AEEDB1 = {
    1315                 fRef = F59DC6D40353C9E601AEEDB1;
    1316                 isa = PBXTextBookmark;
    1317                 name = "PSAlarmSetController.m: awakeFromNib";
    1318                 rLen = 51;
    1319                 rLoc = 3497;
    1320                 rType = 0;
    1321                 vrLen = 1188;
    1322                 vrLoc = 3010;
    1323         };
    1324         F562F818037E7F6101AEEDB1 = {
    1325                 fRef = F5F240CC036A877301FE7503;
    1326                 isa = PBXTextBookmark;
    1327                 name = "NJRQTMediaPopUpButton.m: _addRecentMediaFromAliasesData:";
    1328                 rLen = 0;
    1329                 rLoc = 2850;
    1330                 rType = 0;
    1331                 vrLen = 580;
    1332                 vrLoc = 2437;
     1467                vrLen = 2132;
     1468                vrLoc = 5663;
    13331469        };
    13341470        F596730D0355CFA301407038 = {
     
    13721508                        F515C769037DFB63018DB5B3,
    13731509                        F515C76A037E01E1018DB5B3,
     1510                        F5B79835035F3A180136A8DD,
     1511                        F5B7983A035F65070136A8DD,
    13741512                );
    13751513                isa = PBXBookmarkGroup;
     
    13911529                name = "PSAlarmSetController.m: inAtChanged:";
    13921530                rLen = 36;
    1393                 rLoc = 8485;
     1531                rLoc = 8591;
    13941532                rType = 0;
    13951533                vrLen = 478;
     
    14211559                symbolName = "-[NSException raise]";
    14221560        };
     1561        F5B163A5037E543A01AEEDB1 = {
     1562                fRef = F59DC6FD0354188F01AEEDB1;
     1563                isa = PBXTextBookmark;
     1564                name = "NJRDateFormatter.m: format:withoutComponent:";
     1565                rLen = 0;
     1566                rLoc = 829;
     1567                rType = 0;
     1568                vrLen = 2132;
     1569                vrLoc = 5663;
     1570        };
     1571        F5B79835035F3A180136A8DD = {
     1572                fRef = F517D63E0356B80C016D68B9;
     1573                isa = PBXTextBookmark;
     1574                name = "PSAlarmsController.m: alarmsChanged";
     1575                rLen = 0;
     1576                rLoc = 384;
     1577                rType = 0;
     1578                vrLen = 989;
     1579                vrLoc = 1167;
     1580        };
     1581        F5B7983A035F65070136A8DD = {
     1582                fRef = F5B79836035F64F80136A8DD;
     1583                isa = PBXTextBookmark;
     1584                name = "NJRTableView.m: 1";
     1585                rLen = 0;
     1586                rLoc = 0;
     1587                rType = 0;
     1588                vrLen = 215;
     1589                vrLoc = 0;
     1590        };
    14231591        F5F19881036B90CD01EB0372 = {
    14241592                fRef = F59DC6D40353C9E601AEEDB1;
     
    14261594                name = "PSAlarmSetController.m: setAlarm:";
    14271595                rLen = 0;
    1428                 rLoc = 12078;
     1596                rLoc = 12184;
    14291597                rType = 0;
    14301598                vrLen = 1431;
  • trunk/Cocoa/Pester/Source/Pester.pbproj/project.pbxproj

    r49 r51  
    241241                        productReference = 17587328FF379C6511CA2CBB;
    242242                        productSettingsXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    243 <!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">
    244 <plist version=\"1.0\">
     243<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">
     244<plist version=\"0.9\">
    245245<dict>
    246246        <key>CFBundleDevelopmentRegion</key>
     
    312312                                F5F19910036D3B3101EB0372,
    313313                                F515C768037DFB56018DB5B3,
     314                                F5B79839035F64F80136A8DD,
     315                                F5B79868038865B30136A8DD,
    314316                        );
    315317                        isa = PBXHeadersBuildPhase;
    316                         runOnlyForDeploymentPostprocessing = 0;
    317318                };
    318319                29B97328FDCFA39411CA2CEA = {
     
    330331                        );
    331332                        isa = PBXResourcesBuildPhase;
    332                         runOnlyForDeploymentPostprocessing = 0;
    333333                };
    334334                29B9732BFDCFA39411CA2CEA = {
     
    369369                                F5F198DB036BE75E01EB0372,
    370370                                F5F1990F036D3B3101EB0372,
     371                                F5B79838035F64F80136A8DD,
     372                                F5B79867038865B30136A8DD,
    371373                        );
    372374                        isa = PBXSourcesBuildPhase;
    373                         runOnlyForDeploymentPostprocessing = 0;
    374375                };
    375376                29B9732CFDCFA39411CA2CEA = {
     
    390391                        );
    391392                        isa = PBXFrameworksBuildPhase;
    392                         runOnlyForDeploymentPostprocessing = 0;
    393393                };
    394394//290
     
    631631                                F59DC6FD0354188F01AEEDB1,
    632632                                F5F2418A036A910B01FE7503,
     633                                F5B79866038865B30136A8DD,
     634                                F5B79865038865B30136A8DD,
    633635                                F5F1990E036D3B3101EB0372,
    634636                                F5F1990D036D3B3101EB0372,
    635637                                F59E4C0E036B43D2016B311C,
    636638                                F59E4C0D036B43D2016B311C,
     639                                F560E30E035787BC01A4E466,
     640                                F560E30D035787BB01A4E466,
    637641                                F5F198DA036BE75E01EB0372,
    638642                                F5F198D9036BE75E01EB0372,
     
    644648                F560E314035787F901A4E466 = {
    645649                        children = (
    646                                 F560E30E035787BC01A4E466,
    647                                 F560E30D035787BB01A4E466,
     650                                F5B79837035F64F80136A8DD,
     651                                F5B79836035F64F80136A8DD,
    648652                                F552A8AB0358E8B201AEEDB1,
    649653                                F552A8AC0358E8B201AEEDB1,
     
    12411245                        };
    12421246                };
     1247                F5B79836035F64F80136A8DD = {
     1248                        isa = PBXFileReference;
     1249                        path = NJRTableView.m;
     1250                        refType = 4;
     1251                };
     1252                F5B79837035F64F80136A8DD = {
     1253                        isa = PBXFileReference;
     1254                        path = NJRTableView.h;
     1255                        refType = 4;
     1256                };
     1257                F5B79838035F64F80136A8DD = {
     1258                        fileRef = F5B79836035F64F80136A8DD;
     1259                        isa = PBXBuildFile;
     1260                        settings = {
     1261                        };
     1262                };
     1263                F5B79839035F64F80136A8DD = {
     1264                        fileRef = F5B79837035F64F80136A8DD;
     1265                        isa = PBXBuildFile;
     1266                        settings = {
     1267                        };
     1268                };
     1269                F5B79865038865B30136A8DD = {
     1270                        isa = PBXFileReference;
     1271                        path = "NSCharacterSet-NJRExtensions.m";
     1272                        refType = 4;
     1273                };
     1274                F5B79866038865B30136A8DD = {
     1275                        isa = PBXFileReference;
     1276                        path = "NSCharacterSet-NJRExtensions.h";
     1277                        refType = 4;
     1278                };
     1279                F5B79867038865B30136A8DD = {
     1280                        fileRef = F5B79865038865B30136A8DD;
     1281                        isa = PBXBuildFile;
     1282                        settings = {
     1283                        };
     1284                };
     1285                F5B79868038865B30136A8DD = {
     1286                        fileRef = F5B79866038865B30136A8DD;
     1287                        isa = PBXBuildFile;
     1288                        settings = {
     1289                        };
     1290                };
    12431291                F5F19865036B806201EB0372 = {
    12441292                        children = (
Note: See TracChangeset for help on using the changeset viewer.