aboutsummaryrefslogtreecommitdiffstats
path: root/WorldStatusController.m
blob: f93105573058e5a8e101cea85a5b2adeb9e8a173 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#import "WorldStatusController.h"

#import "World.h"

@interface World (TableDescription)
- (NSMutableDictionary *)worldDescription;
@end

@implementation World (TableDescription)
- (NSMutableDictionary *)worldDescription
{
    NSMutableDictionary *worldAttrs;
    NSString *statusString;
    
    switch ([self status]) {
        case MxConnected:
            statusString = @"c";
            break;
        case MxDisconnected:
            statusString = @"d";
            break;
        case MxRecentActivity:
            statusString = @"!";
            break;
        default:
            statusString = @"";
    }

    worldAttrs = [NSMutableDictionary dictionaryWithObjects:
        [NSArray arrayWithObjects: [self displayName], statusString, nil]
                                                    forKeys:
        [NSArray arrayWithObjects: @"connection", @"status", nil]];
    
    return worldAttrs;
}
@end

@implementation WorldStatusController (TableViewDelegate)
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
    NSArray *worlds;
    int row;

    // Make the selected world the main window.
    worlds = [[NSDocumentController sharedDocumentController] documents];
    row = [theTableView selectedRow];
    if (row >= 0 && (unsigned)row < [worlds count]) {
        [[[worlds objectAtIndex: row] windowForSheet] makeKeyAndOrderFront: self];
        [NSApp activateIgnoringOtherApps: YES];
    }
}

- (void)tableView: (NSTableView *)aTableView
  willDisplayCell: (id)aCell
   forTableColumn: (NSTableColumn *)aTableColumn
              row: (int)rowIndex
{
    NSArray *worlds;
    
    worlds = [[NSDocumentController sharedDocumentController] documents];
    if (rowIndex >= 0 && (unsigned)rowIndex < [worlds count]) {
        NSColor *cellColor;
        NSFont *font;
        World *world;
        
        font = [[NSFontManager sharedFontManager] fontWithFamily: @"Helvetica"
                                                          traits: NSUnboldFontMask | NSUnitalicFontMask
                                                          weight: 9.0
                                                            size: 12.0];
        world = [worlds objectAtIndex: rowIndex];
        switch ([world status]) {
            case MxConnected:
                cellColor = [[NSUserDefaults standardUserDefaults] connectedColor];
                break;
            case MxDisconnected:
                cellColor = [[NSUserDefaults standardUserDefaults] disconnectedColor];
                font = [[NSFontManager sharedFontManager] convertFont: font toHaveTrait: NSItalicFontMask];
                break;
            case MxRecentActivity:
                cellColor = [[NSUserDefaults standardUserDefaults] recentActivityColor];
                font = [[NSFontManager sharedFontManager] convertFont: font toHaveTrait: NSBoldFontMask];
                break;
            default:
                cellColor = [NSColor blackColor];
                break;
        }
        [aCell setFont: font];
        [aCell setTextColor: cellColor];
    }
}
@end

@implementation WorldStatusController (TableViewDataSource)
- (int)numberOfRowsInTableView: (NSTableView *)aTableView
{
    return [[[NSDocumentController sharedDocumentController] documents] count];
}

- (id)tableView: (NSTableView *)aTableView
objectValueForTableColumn: (NSTableColumn *)aTableColumn
            row: (int)rowIndex
{
    NSArray *worlds;

    worlds = [[NSDocumentController sharedDocumentController] documents];
    if (rowIndex >= 0 && (unsigned)rowIndex < [worlds count])
        return [[[worlds objectAtIndex: rowIndex] worldDescription] objectForKey: [aTableColumn identifier]];
    return nil;
}
@end

@implementation WorldStatusController
+ (WorldStatusController *)sharedController
{
    static WorldStatusController *sharedController = nil;
    
    if (sharedController == nil) {
        sharedController = [[WorldStatusController alloc] init];
    }
    return sharedController;
}

- (id)init
{
    self = [self initWithWindowNibName: @"WorldSelector"];
    [self setWindowFrameAutosaveName: @"worldStatusWindow"];
    return self;
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver: self];
    
    [super dealloc];
}

- (void)selectWorld: (World *)aWorld
{
    NSArray *worlds;
    int row;
    
    if (aWorld) {
        worlds = [[NSDocumentController sharedDocumentController] documents];
        row = [worlds indexOfObject: aWorld];
        [theTableView selectRow: row byExtendingSelection: NO];
    } else
        [theTableView deselectAll: self];
}

- (void)setFloating: (BOOL)isFloating
{
    [(NSPanel *)[self window] setFloatingPanel: isFloating];
}

- (void)setAlwaysVisible: (BOOL)isAlwaysVisible
{
    [(NSPanel *)[self window] setHidesOnDeactivate: isAlwaysVisible ? NO : YES];
}

- (void)windowDidLoad
{
    NSNotificationCenter *defaultCenter;
    
    [super windowDidLoad];

    defaultCenter = [NSNotificationCenter defaultCenter];
    [defaultCenter addObserver: self
                      selector: @selector(userDefaultsChanged:)
                          name: NSUserDefaultsDidChangeNotification
                        object: [NSUserDefaults standardUserDefaults]];
    [defaultCenter addObserver: self
                      selector: @selector(mainWindowChanged:)
                          name: NSWindowDidBecomeMainNotification
                        object: nil];
    [defaultCenter addObserver: self
                      selector: @selector(windowClosed:)
                          name: NSWindowWillCloseNotification
                        object: nil];

    [self setFloating: [[NSUserDefaults standardUserDefaults] selectorIsFloating]];
    [self setAlwaysVisible: [[NSUserDefaults standardUserDefaults] selectorIsAlwaysVisible]];
    [self selectWorld: [[NSDocumentController sharedDocumentController] currentDocument]];
}

- (void)update
{
    [theTableView reloadData];
}

- (void)userDefaultsChanged: (NSNotification *)aNotification
{
    [self setFloating: [[NSUserDefaults standardUserDefaults] selectorIsFloating]];
    [self setAlwaysVisible: [[NSUserDefaults standardUserDefaults] selectorIsAlwaysVisible]];
    [self update];
}

- (void)mainWindowChanged: (NSNotification *)aNotification
{
    World *world;
    
    world = [[[aNotification object] windowController] document];
    if ([world isKindOfClass: [World class]]) {
        if ([world status] == MxRecentActivity)
            [world setStatus: MxConnected];
        [self update];
        [self selectWorld: world];
        
        [world showWindows];
        [NSApp activateIgnoringOtherApps: YES];
    }
}

- (void)windowClosed: (NSNotification *)aNotification
{
    [theTableView reloadData];
    [self selectWorld: nil];
}
@end