aboutsummaryrefslogtreecommitdiffstats
path: root/WorldStatusController.m
diff options
context:
space:
mode:
authorBrian Cully <bjc@kublai.com>2008-04-02 19:20:20 -0400
committerBrian Cully <bjc@kublai.com>2008-04-02 19:20:20 -0400
commitab10720260e2c184b319026da89f4dfd338500bb (patch)
treea692a27435da0296972e43b21b2f35762e720bfd /WorldStatusController.m
downloadmoxie-ab10720260e2c184b319026da89f4dfd338500bb.tar.gz
moxie-ab10720260e2c184b319026da89f4dfd338500bb.zip
Initial commit
Diffstat (limited to 'WorldStatusController.m')
-rw-r--r--WorldStatusController.m218
1 files changed, 218 insertions, 0 deletions
diff --git a/WorldStatusController.m b/WorldStatusController.m
new file mode 100644
index 0000000..f931055
--- /dev/null
+++ b/WorldStatusController.m
@@ -0,0 +1,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 \ No newline at end of file