MPDCon-1.5.1/0000755000175000017500000000000012251635015012746 5ustar sebastiasebastiaMPDCon-1.5.1/Documentation/0000755000175000017500000000000012244352107015557 5ustar sebastiasebastiaMPDCon-1.5.1/Documentation/COPYING0000644000175000017500000004307611716254200016622 0ustar sebastiasebastia GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. MPDCon-1.5.1/Documentation/Install0000644000175000017500000000074712251634732017125 0ustar sebastiasebastiaInstallation Instructions: Make sure you first have libmpdclient installed (See http://www.musicpd.org). Tested with libmpdclient-2.7. Second, you need GNUstep installed (See http://www.gnustep.org). Tested with gnustep-make-1.6.2, gnustep-base-1.24.0 and gnustep-gui and gnustep-back 1.22.0. Then, just type make sudo -E make install On Linux, you likely need to have libbsd, and the corresponding -dev package installed. On Linux run: make need-libbsd=yes sudo -E make install MPDCon-1.5.1/AppController.h0000644000175000017500000000644312072316665015722 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Application Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_APPCONTROLLER_H #define _PCAPPPROJ_APPCONTROLLER_H #include #include "PlayView.h" #include "PreferencesController.h" #include "PlaylistController.h" #include "PlaylistItem.h" #include "MPDController.h" #include "PlaylistsManagerController.h" #include "StatisticsController.h" #include "CrossfadeController.h" #include "CollectionBrowser.h" #include "LyricsInspector.h" #include "SongInspector.h" #include "PlaylistInspector.h" #include "RandomPlaylistFeed.h" #include "Strings.h" #define player_MPD 0 #define player_CD 1 @interface AppController : NSObject { IBOutlet NSButton *playButton; IBOutlet NSButton *stopButton; IBOutlet NSButton *prevButton; IBOutlet NSButton *nextButton; IBOutlet NSButton *shuffleButton; IBOutlet NSButton *repeatButton; IBOutlet PlayView *playView; IBOutlet NSSlider *percentSlider; IBOutlet NSSlider *volumeSlider; IBOutlet NSWindow *window; IBOutlet NSMenuItem *statisticsItem; IBOutlet NSMenuItem *browseItem; IBOutlet NSMenuItem *updateItem; IBOutlet NSMenuItem *showItem; IBOutlet NSMenuItem *manageItem; NSTimer *anTimer; int player; int playedSong; int prevState; BOOL connected; BOOL didDisconnect; MPDController *mpdController; RandomPlaylistFeed *randomPlaylistFeed; } // Gui Methods - (void) showPrefPanel:(id)sender; - (void) showLyricsInspector:(id)sender; - (void) showSongInspector:(id)sender; - (void) showPlaylistInspector:(id)sender; - (void) showPlaylist: (id)sender; - (void) managePlaylists: (id)sender; - (void) browseCollection: (id)sender; - (void) browseCollectionByDirectory: (id)sender; - (void) serverStatistics: (id)sender; - (void) showCrossfade: (id)sender; - (void) connect: (id)sender; - (void) updateCollection: (id)sender; - (void) play: (id)sender; - (void) stop: (id)sender; - (void) prev: (id)sender; - (void) next: (id)sender; - (void) shuffle: (id)sender; - (void) repeat: (id)sender; - (void) percentChanged: (id)sender; - (void) volumeChanged: (id)sender; // Notification Methods - (void) didDisconnect: (NSNotification *)notif; - (void) didConnect: (NSNotification *)notif; - (void) prefsChanged: (NSNotification *)notif; // Service Methods - (void) getPlaylist: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error; - (void) getAlbums: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error; @end #endif MPDCon-1.5.1/AppController.m0000644000175000017500000003215512244155327015723 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Application Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "AppController.h" /* --------------------- - Private Interface - ---------------------*/ @interface AppController(Private) - (void) _updateView: (id)sender; @end @implementation AppController /* -------------------------- - Initialization Methods - --------------------------*/ - (void) dealloc { [mpdController release]; [anTimer release]; [randomPlaylistFeed release]; [super dealloc]; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { NSNotificationCenter *defCenter; BOOL reversedTime; defCenter = [NSNotificationCenter defaultCenter]; [[NSApp mainMenu] setTitle:@"MPDCon"]; [window setFrameAutosaveName: @"PlayerWindow"]; mpdController = [MPDController sharedMPDController]; randomPlaylistFeed = [[RandomPlaylistFeed alloc] init]; prevState = state_NOCONN; [defCenter addObserver: self selector: @selector(didDisconnect:) name: DidNotConnectNotification object: nil]; [defCenter addObserver: self selector: @selector(didConnect:) name: DidConnectNotification object: nil]; [defCenter addObserver: self selector: @selector(prefsChanged:) name: PreferencesChangedNotification object: nil]; didDisconnect = NO; [self connect: self]; reversedTime = [[NSUserDefaults standardUserDefaults] boolForKey: @"reversedTime"]; [playView setReversedTime: reversedTime]; } - (void) showPrefPanel: (id)sender { [[PreferencesController sharedPreferencesController] showWindow: sender]; } - (void) showLyricsInspector: (id)sender { if (! connected) { return; } [[LyricsInspector sharedLyricsInspector] showWindow: sender]; } - (void) showSongInspector: (id)sender { if (! connected) { return; } [[SongInspector sharedSongInspector] showWindow: sender]; } - (void) showPlaylistInspector: (id)sender { if (! connected) { return; } [[PlaylistInspector sharedPlaylistInspector] showWindow: sender]; } - (void) showPlaylist: (id)sender { if (! connected) { return; } [[PlaylistController sharedPlaylistController] showWindow: sender]; } - (void) managePlaylists: (id)sender { if (! connected) { return; } [[PlaylistsManagerController sharedPLManagerController] showWindow: sender]; } - (void) browseCollection: (id)sender { if (! connected) { return; } [[CollectionController sharedCollectionController] showWindow: self]; } - (void) browseCollectionByDirectory: (id)sender { if (! connected) { return; } [[CollectionBrowser sharedCollectionBrowser] showWindow: self]; } - (void) serverStatistics: (id)sender { if (! connected) { return; } [[StatisticsController sharedStatisticsController] showWindow: sender]; } - (void) showCrossfade: (id)sender { if (! connected) { return; } [[CrossfadeController sharedCrossfadeController] showWindow: sender]; } - (void) connect: (id)sender { NSString *host; NSString *port; NSString *pword; NSString *tout; host = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdHost"]; port = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdPort"]; tout = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdTimeout"]; pword = nil; if ([[NSUserDefaults standardUserDefaults] integerForKey: @"usePassword"] != 0) { pword = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdPassword"]; } if ((host == nil) || (port == nil) || (tout == nil)) { [self showPrefPanel: self]; } else { didDisconnect = NO; [mpdController connectToServer: host port: port password: pword timeout: tout]; } } - (void) updateCollection: (id) sender { [mpdController updateCollection]; } - (void) play: (id)sender { if (! connected) { return; } [mpdController play]; } - (void) stop: (id)sender { if (! connected) { return; } [mpdController stop]; } - (void) prev: (id)sender { if (! connected) { return; } [mpdController prev]; } - (void) next: (id)sender { if (! connected) { return; } [mpdController next]; } - (void) shuffle: (id)sender { if (! connected) return; [mpdController toggleShuffle]; } - (void) repeat: (id)sender { if (! connected) { return; } [mpdController toggleRepeat]; } - (void) percentChanged: (id)sender { int seekTime; if (! connected) { [percentSlider setFloatValue: 0.0]; return; } if ([mpdController getState] == state_NOCONN) { [percentSlider setFloatValue: 0.0]; return; } seekTime = (int) [percentSlider floatValue]; [mpdController seekToTime: seekTime]; [playView setElapsedTime: seekTime]; } - (void) volumeChanged: (id)sender { if ((! connected) || ([mpdController getState] == state_NOCONN)) { [volumeSlider setFloatValue: 0.0]; return; } [mpdController setVolume: [volumeSlider floatValue]]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) didDisconnect: (NSNotification *)notif { if (!didDisconnect) { didDisconnect = YES; if (connected) { if (anTimer) { [anTimer invalidate]; } } connected = NO; [playView enableDisplay: NO]; [playButton setImage: [NSImage imageNamed: @"Play.tiff"]]; [percentSlider setFloatValue: 0.0]; NSRunAlertPanel(_(@"Server Problems"), [notif object], nil, nil, nil); } } - (void) didConnect: (NSNotification *)aNotif { if (! connected) { connected = YES; anTimer = [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(_updateView:) userInfo: nil repeats: YES]; } didDisconnect = NO; } - (void) prefsChanged: (NSNotification *)notif { [self connect: self]; } /* ------------------- - Service Methods - -------------------*/ - (void) getPlaylist: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error { NSMutableString *allSongsString; NSString *formString; NSArray *playlist; int length; int totaltime, tMin, tSecs, tHour; int i, j; allSongsString = [[NSMutableString alloc] init]; playlist = [mpdController getPlaylist]; length = [[NSString stringWithFormat: @"%"PRIuPTR, [playlist count]] length]; formString = [NSString stringWithFormat: @"Track %s%d%s - ", "%", length, "d/%d"]; j = [playlist count]; totaltime = 0; for (i = 0; i < j; i++) { int time; [allSongsString appendString: [NSString stringWithFormat: formString, i+1, j]]; [allSongsString appendString: [[playlist objectAtIndex: i] getArtist]]; [allSongsString appendString: @" - "]; [allSongsString appendString: [[playlist objectAtIndex: i] getTitle]]; [allSongsString appendString: @" - "]; time = [[playlist objectAtIndex: i] getTotalTime]; totaltime += time; tSecs = (time % 60); tMin = (int) time/60; [allSongsString appendString: [NSString stringWithFormat: @"%d:%02d\n", tMin, tSecs]]; } tSecs = (totaltime % 60); tMin = (int) (totaltime/60) % 60; tHour = (int) totaltime/3600; [allSongsString appendString: [NSString stringWithFormat: @"\nTotal Playtime: %d:%02d:%02d\n", tHour, tMin, tSecs]]; [pboard declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil]; [pboard setString: allSongsString forType: NSStringPboardType]; RELEASE(allSongsString); return; } - (void) getAlbums: (NSPasteboard*)pboard userData: (NSString*)userData error: (NSString**)error { NSMutableString *allAlbumsString; NSArray *artists; int i; allAlbumsString = [[NSMutableString alloc] init]; artists = [mpdController getAllArtists]; for (i = 0; i < [artists count]; i++) { NSString *artist; NSArray *albums; int j; artist = [artists objectAtIndex: i]; albums = [mpdController getAlbumsForArtist: artist]; for (j = 0; j < [albums count]; j++) { NSString *album; album = [albums objectAtIndex: j]; [allAlbumsString appendString: [NSString stringWithFormat: @"%@ - %@\n", artist, album]]; } } [pboard declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil]; [pboard setString: allAlbumsString forType: NSStringPboardType]; RELEASE(allAlbumsString); return; } /* -------------------------------- - Application Delegate Methods - --------------------------------*/ - (void) applicationDidFinishLaunching: (NSNotification *)not { [NSApp setServicesProvider: self]; } - (BOOL) validateMenuItem: (id)menuItem { switch ([menuItem tag]) { case 10: case 14: case 15: case 16: case 17: case 18: return connected; break; case 13: return didDisconnect; break; default: return YES; break; } } @end /* ------------------- - Private Methods - -------------------*/ @implementation AppController(Private) - (void) _updateView: (id)sender { int state; if (! connected) { return; } if ([mpdController getState] == state_NOCONN) { return; } if ([mpdController getState] == state_UNKNOWN) { return; } if ([mpdController playlistChanged]) { NSNotification *aNotif; aNotif = [NSNotification notificationWithName: PlaylistChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] postNotification: aNotif]; } if ([mpdController isRandom]) { [shuffleButton setState: YES]; } else { [shuffleButton setState: NO]; } if ([mpdController isRepeat]) { [repeatButton setState: YES]; } else { [repeatButton setState: NO]; } [volumeSlider setIntValue: [mpdController getVolume]]; state = [mpdController getState]; if((state == state_PLAY) || (state == state_PAUSE)) { PlaylistItem *currSong; int currentSongNr; int playlistLength; currentSongNr = [mpdController getCurrentSongNr]; playlistLength = [mpdController getPlaylistLength]; currSong = [[mpdController getCurrentSong] retain]; if (currentSongNr != playedSong) { playedSong = currentSongNr; if ([currSong getTotalTime] != 0) { [percentSlider setMaxValue: (double) [currSong getTotalTime]]; } [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: SongChangedNotification object: nil]]; } [playView enableDisplay: YES]; [playView setCurrentSong: currentSongNr]; [playView setTotalSongs: playlistLength]; if((state == state_PAUSE) && (prevState != state_PAUSE)) { NSImage *pImage; prevState = state_PAUSE; pImage = [NSImage imageNamed: @"Play.tiff"]; [playButton setImage: pImage]; } else if ((state == state_PLAY) &&(prevState != state_PLAY)) { NSImage *pImage; prevState = state_PLAY; pImage = [NSImage imageNamed: @"Pause.tiff"]; [playButton setImage: pImage]; [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: SongChangedNotification object: nil]]; } [playView setDisplaySong: currSong]; if ([currSong getTotalTime] != 0) { [percentSlider setDoubleValue: (double)[currSong getElapsedTime]]; } [currSong release]; } else if (prevState != state_STOP) { NSImage *pImage; prevState = state_STOP; pImage = [NSImage imageNamed: @"Play.tiff"]; [playButton setImage: pImage]; [playButton setTitle: @"Play"]; [percentSlider setFloatValue: 0.0]; [playView enableDisplay: NO]; [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: SongChangedNotification object: nil]]; } } @end MPDCon-1.5.1/BoldCell.h0000644000175000017500000000204211716254166014606 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:44:24 +0100 by mrsanders This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _BOLDCELL_H_ #define _BOLDCELL_H_ #include #include #include "BoldFormatter.h" @interface BoldCell : NSTextFieldCell { } @end #endif // _BOLDCELL_H_ MPDCon-1.5.1/BoldCell.m0000644000175000017500000000202111716254166014610 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:44:24 +0100 by mrsanders This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "BoldCell.h" @implementation BoldCell - (void) awakeFromNib { BoldFormatter *bForm = [[BoldFormatter alloc] init]; [self setFormatter: [bForm autorelease]]; } @end MPDCon-1.5.1/BoldFormatter.h0000644000175000017500000000202711716254166015675 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _BOLDFORMATTER_H_ #define _BOLDFORMATTER_H_ #include #include @interface BoldFormatter : NSFormatter { } @end #endif // _BOLDFORMATTER_H_ MPDCon-1.5.1/BoldFormatter.m0000644000175000017500000000353711717236141015703 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "BoldFormatter.h" @implementation BoldFormatter - (NSString *) stringForObjectValue: (id) anObject { return anObject; } - (NSAttributedString *)attributedStringForObjectValue: (id) anObject withDefaultAttributes: (NSDictionary *) attr { if (anObject != nil) { NSFont *theFont = [NSFont boldSystemFontOfSize: [NSFont systemFontSize]]; NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString: anObject]; NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithDictionary: attr]; [attrs setObject: theFont forKey: NSFontAttributeName]; if ([aString length]) { [aString setAttributes: attrs range: NSMakeRange(0, [aString length])]; } return [aString autorelease]; } else { NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString: @""]; return [aString autorelease]; } } - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error { *obj = string; } @end MPDCon-1.5.1/ChangeLog0000644000175000017500000004476512251634751014546 0ustar sebastiasebastia2013-12-10: Sebastian Reitenbach * RandomPlaylistFeed.m * GNUmakefile.preamble * GNUmakefile * Documentation/Install bump version to 1.5.1 add built fix for systems that don't have arc4random in libc 2013-12-02: Sebastian Reitenbach * CollectionBrowser.m get rid of -windowDidResize: method to fix weirdo resizing issues get rid of DoubleClick action thingies remove extraneous ) * MPDConInfo.plist, GNUMakefile, MPDCon.pcproj update version to 1.5 * PlaylistController.m make the removal of selected songs from playlist work 2013-11-23: Sebastian Reitenbach * CollectionBrowser.m * remove some NSLog entries 2013-11-23: Sebastian Reitenbach * AppController.m * CollectionBrowser.m * CollectionController.m * MPDController.m * restructuring about notifications sent on collection updates * Resources/CollectionBrowser.gorm * re-add missing connection from NSOwner to -browser * CollectionBrowser.m * make the update and add buttons work as expected * CollectionController.m * AppController.m * MPDController.m * remove some NSLog * CollectionBrowser.m * reload browser columns when collection change notification are received * Documentation/Install mention the need for libbsd(-dev) on Linux 2013-11-22: Sebastian Reitenbach * Resources/CollectionBrowser.gorm * add an update and add button 2013-11-14: Sebastian Reitenbach * AppController.m * CollectionBrowser.m * CollectionController.m * LyricsInspector.m * PlayView.m * PlaylistController.m * PlaylistInspector.m * PlaylistItem.m * PlaylistsManagerController.m * RandomPlaylistFeed.m * SQLiteAdaptor.m * SongInspector.m * fix a couple of format strings, potential memory leaks, uses of uninitialized pointers, and others found by clang static analyzer 2013-02-09: Sebastian Reitenbach * SQLiteAdaptor.m fix compilation with clang * PlaylistsManagerController.[h|m] * CollectionController.[h|m] (unsigned) int -> NS(U)Integer transitions 2012-01-06: Sebastian Reitenbach * MPDController.[h|m], CollectionBrowser.[h|m], Resources/CollectionBrowser.gorm, AppController.m, Resources/Player.gorm * add a Music Collection filesystem browser * PlaylistItem.m, do not try to retrieve the lyrics for unknow artists or songs * PlaylistController.m after playlistChanged, update the highlight the current song 2012-12-20: Sebastian Reitenbach * MPDController.m fix double frees and crashers in the collection controller * Update release version to 1.4 2012-12-15: Sebastian Reitenbach * RandomPlaylistFeed.[h|m] honour the IncludeUnratedSongs default, and optimize algorithm a bit. * PlaylistInspector.[h|m] new outlets for the IncludeUnratedSongs default, and grey out other text when it is disabled * Resources/PlaylistInspector.gorm new outlets for some text in order to disable them, and checkbox to include unrated songs * SQLiteAdaptor.m little fix 2012-12-12: Sebastian Reitenbach * PlaylistItem.[m|h] make the rating an Integer, not unsigned integer * SQLiteAdaptor.[h|m] same as above, and use the quoteString from libSQLite correcly * RandomPlaylistFeed, make the feed based on rating work 2012-12-11: Sebastian Reitenbach * nearly any .m file: get rid of GNUstep macros 2012-12-10: Sebastian Reitenbach * Strings.h add new string for Notification for the random playlist feed * GNUmakefile, PC.project, add RandomPlaylistFeed.[h|m] * Implement a random Playlist Feed * PlaylistInspector.[h|m] move out the threading, and put it in the RandomPlaylistFeed class * MPDController.[h|m] parameterize getAllTracksWithMetadata: * CollectionController.m use the new method * AppController.[h|m] initialize the RandomPlaylistFeed 2012-12-02: Sebastian Reitenbach * SongInspector.h add method to shut up gcc from whining it may not be available * PlaylistItem.[h|m], LyricsInspector.[h|m] Move the lyrics retriveal from web from the LyricsInspector to the PlaylistItem. There is a better place for it. While there, shut up gcc from whining, save as for the SongInspector 2012-11-25: Sebastian Reitenbach * SQLiteAdaptor.[h|m] restructuring, to also save retrieved lyrics from the web in the SQLite database * PlaylistItem.[h|m] restructuring, and adding methods to retrieve, save song lyrics * LyricsInspector.m try to lookup lyrics in DB before consulting the web and save found lyrics from web to DB 2012-11-11: Sebastian Reitenbach * GNUmakefile.preamble, MPDCon.pcproj/PC.project * link against -lSQLClient, the SongRatings will be saved in a sqlite3 database * PlaylistInspector.[h|m], Resources/PlaylistInspector.gorm make it kind of work * PlaylistItem.[h|m], get rid of the Private category, and use SQLiteAdaptor to store the SongRatings * GNUMakefile, MPDCon.pcproject/PC.project Add SQLiteAdaptor.[h|m] * CollectionController.[h|m] new method: getAllTracks 2012-11-10: Sebastian Reitenbach * MPDController.[h|m] * Add - (void) removeSongRange: (NSRange)songRange; needed for the PlaylistInspector * PlaylistController.[h|m] * expose a - (NSString *) playlistLength, which gives back the length of the playlist as timestamp, needed by the PlaylistInspector * move the loading of the playlist to the init method 2012-10-31: Sebastian Reitenbach * PlaylistController.m int -> NSInteger conversions * PlaylistInspector.[h|m], AppController.[h|m], GNUmakefile, Resources/PlaylistInspector.gorm, Resources/Player.gorm MPDCon.pcproj/PC.projec * Add PlaylistInspector, empty so far 2012-10-29: Sebastian Reitenbach * GNUmakefile * PlaylistController.h * PlaylistController.m * PlaylistItem.h * PlaylistItem.m * SongRatingCell.h * SongRatingCell.m * MPDCon.pcproj/PC.project * Resources/Star.tiff * Add Rating of songs in the PlaylistViewer, still with some NSLog output, and still not 100% * while there, some int -> NS(U)Integer conversions * Add helper method to PlalistItem: _playlistItemPathToRatingKey stolen from RSSKit, and delete keys from the Ratings database when Rating gets set to 0 * Now that it seems to work as expected, remove NSLogs from SongRatingCell.m PlaylistItem.m 2012-10-19: Sebastian Reitenbach * LyricsInspector.m When the server is not reachable tell the user about it in the inspector. * GNUmakefile * GNUmakefile.preamble * MPDConInfo.plist * MPDCon.pcproj/PC.project * Version 1.3 2012-09-25: Sebastian Reitenbach * grant a little bit more space for the title in the lyrics inspector * Make the buttons in the PlaylistViewer wider to show all the button text 2012-09-25: Sebastian Reitenbach * Resources/Player.gorm * Resources/SongInspector.gorm * SongInspector.[h|m] * AppController.[h|m] * GNUMakefile * PlaylistItem.[h|m] * MPDController.m * Add an Inspector to see all details about the currently played song. PlaylistItem had to be enhanced to handle all available MPD tags. MPDController had to be enhanced to also set the new parameters of a PlaylistItem. 2012-09-02: Sebastian Reitenbach * Resources/Player.gorm * Resources/LyricsInspector.gorm * LyricsInspector.[h|m] * AppController.[h|m] * GNUmakefile * Add an Inspector to retrieve lyrics from lyrics.wikia.com, based on the artist and title of the song. The API only gives back about 1/7 of the full lyrics if found, due to fair use and such. Additionally it gives a URL, where the full Lyrics can be found. Therefore the Inspector got a button to open the URL using NSWorkSpace openURL. 2012-06-09: Sebastian Reitenbach * Documentation/Install update * GNUmakefile.preamble, use pkg-config to figure out how to link against libmpdclient 2012-06-08: Sebastian Reitenbach * MPDConInfo.plist * MPDCon.pcproj/PC.project * Add Project URL * remove obsolete Resources/Info-gnustep.plist * GNUmakefile * MPDCon.pcproj/PC.project * remove reference to non-existent Resources/TODO.txt * remove reference to obsolete and removed Resources/Info-gnustep.plist 2012-04-29: Sebastian Reitenbach * Fix version in objects * Resources/Collection.gorm/objects.gorm * Resources/Player.gorm/objects.gorm * Resources/PlaylistViewer.gorm/objects.gorm * Resources/Preferences.gorm/objects.gorm * Resources/StatisticsViewer.gorm/objects.gorm * Fix bogus version in Gorm files, due to OpenBSD bogusness initially created 2012-04-14: Sebastian Reitenbach * MPDCon/MPDConInfo.plist * MPDCon/MPDCon.pcproj/PC.project Make the version 1.2, and update Authors, Copyright... 2012-03-25: Sebastian Reitenbach * PlaylistController.m fix warning: suggest parentheses around assignment used as truth value * MPDController.m: fix warnings about potentially uninitialized used of variables * CollectionController.m: warning: suggest parentheses around assignment used as truth value 2012-02-23: Sebastian Reitenbach * PreferencesController.m: fix handling of the password field 2012-02-17 Sebastian Reitenbach * AppController.m, CollectionController.m, MPDController.h, MPDController.m After updating the Collection, update the Collection Interface * track the state of the collection (overall nr of artists/albums) in the MPDController, and add a method to check whether it changed. * let the CollectionController listen for a notification, in case the AppController detects a change. * PlaylistManagerController.m do not try to remove playlists that don't exist when saving playlists 2012-02-16 Sebastian Reitenbach * Update to newer ProjectCenter project * get rid of BSD licensed libmpdclient.[h|m] * AppController.m new default mpdTimeout, and cleanups * Bold/MormalFormatter.m code cleanups * PreferencesController.[h|m] new preference mpdTimeout, and add some sane default values for it, and for mpdHost and mpdPort * CollectionController.[h|m] fix some warnings and code cleanup * Info-gnustep.plist general bumps from PC * MPDController.[h|m]: update to new libmpdclient API * PlaylistController.[h|m] code cleanups and now show Genre, and allow filter for Genre * PlaylistItem.[h|m] code cleanups and now show Genre, and allow filter for Genre * improvements to the Interfaces, new mpdTimeout in the Preferences, show Genre in PlaylistViewer and other minor nits * MPDConInfo.plist new file from PC 2004-06-14 Daniel Luederwald * OwnTableView.m, FindController.m: Code Reformatting * CrossfadeController.m, CollectionController.m, AppController.m: Reformatted Code 2004-06-13 Daniel Luederwald * FindController.m, CollectionController.m, CollectionController.h: *** empty log message *** * AppController.m, AppController.h: Implemented getAlbums service * FindController.m, FindController.h, CrossfadeController.m, CrossfadeController.h, CollectionController.m, CollectionController.h, MPDController.m, MPDController.h: Refactoring * PlaylistController.m, PlaylistController.h: More Refactoring * PlayView.m, PlayView.h: Refactoring * AppController.h: *** empty log message *** * AppController.h, AppController.m: More Refactoring 2004-06-12 Daniel Luederwald * OwnPanel.h, OwnPanel.m: *** empty log message *** * OwnPanel.h, OwnPanel.m: New file. 2004-06-04 Daniel Luederwald * FindController.m, FindController.h, AppController.m: Bugfix * AppController.m: *** empty log message *** * PlaylistsManagerController.m: Begin of localization * PlaylistController.m: *** empty log message *** * PlayView.m, MPDController.m, FindController.m, AppController.m: Begin of localization * Strings.h: New file. * StatisticsController.h, PreferencesController.h, PlaylistsManagerController.h, PlaylistController.h, PlayView.h, OwnTableView.h, MPDController.h, FindController.h, CrossfadeController.h, CollectionController.h: *** empty log message *** * AppController.h: Service Method * StatisticsController.m, PreferencesController.m, PlaylistsManagerController.m, PlaylistController.m, PlayView.m, MPDController.m, FindController.m: *** empty log message *** * CollectionController.m: Find Capability * AppController.m: Service Method 2004-06-02 Daniel Luederwald * AppController.m, FindController.m: *** empty log message *** * FindController.h, AppController.h, FindController.m, AppController.m: Refactoring * CollectionController.m, FindController.m, FindController.h, AppController.m, CollectionController.h, PlaylistController.h: *** empty log message *** * CollectionController.h, PlaylistController.m: Find Capability * CollectionController.m: Find Capabilities * FindController.h, FindController.m: *** empty log message *** 2004-06-01 Daniel Luederwald * CollectionController.m: *** empty log message *** * CollectionController.m, PlaylistController.m, CollectionController.h: Implemented Find Capabilities * PlaylistController.h: *** empty log message *** * PlaylistController.h: Implemented Find Capabilities * FindController.h: *** empty log message *** * AppController.h, AppController.m: Added Find Capabilities * FindController.m, FindController.h: New file. 2004-05-30 Daniel Luederwald * PlaylistController.m: Highlight moved Song * OwnTableView.h: Bugfix * OwnTableView.h, OwnTableView.m: New file. 2004-05-27 Daniel Luederwald * PlaylistController.m: *** empty log message *** * PreferencesController.h: Minor Bugfix * MPDController.m: More Refactoring 2004-05-26 Daniel Luederwald * MPDController.m: Bugfix * MPDController.h, MPDController.m, PlaylistController.m, PlaylistController.h, PlayView.m, PlayView.h, AppController.m: Refactoring * AppController.h, PreferencesController.h: *** empty log message *** * PreferencesController.m: Refactoring * PlaylistItem.h: *** empty log message *** * PlaylistItem.m: Refactoring * CollectionController.h: *** empty log message *** * CollectionController.m, PlaylistsManagerController.h, PlaylistsManagerController.m: Refactoring * StatisticsController.h: *** empty log message *** * StatisticsController.m: Refactoring * StatisticsItem.h: *** empty log message *** * StatisticsItem.m: Refactoring * CrossfadeController.h: *** empty log message *** * CrossfadeController.m, AppController.m: Refactoring 2004-05-22 Daniel Luederwald * MPDController.h, MPDController.m: Refactoring + Handling of missing Tags * CrossfadeController.m: *** empty log message *** * PreferencesController.m: Bugfix * AppController.m: *** empty log message *** 2004-05-21 Daniel Luederwald * AppController.m, AppController.h: *** empty log message *** * AppController.m, AppController.h: Remember PlayerWindow screen-location * PlayView.h, PlayView.m: More Refactoring + Bugfix 2004-05-20 Daniel Luederwald * PlayView.m: Modified Scrolling * AppController.m, AppController.h, CrossfadeController.h, StatisticsItem.h: Refactoring * StatisticsController.h: *** empty log message *** * StatisticsController.m, StatisticsController.h: Refactoring * PlaylistsManagerController.m, PlaylistsManagerController.h, CollectionController.m, CollectionController.h: *** empty log message *** * PlaylistsManagerController.m: Refactoring * PlaylistsManagerController.h: *** empty log message *** * PlaylistsManagerController.h: Refactoring 2004-05-19 Daniel Luederwald * CollectionController.m, CollectionController.h, PlaylistItem.h, PlayView.h, PlayView.m: Refactoring * PreferencesController.m: Refactoring + Bugfix * PreferencesController.h: Bugfix * PreferencesController.h, PlaylistController.m, PlaylistController.h, MPDController.h, MPDController.m: Refactoring * CrossfadeController.h: New file. * MPDController.h, AppController.h, AppController.m, MPDController.m: Implemented Crossfade * CrossfadeController.m: New file. * AppController.h, AppController.m: *** empty log message *** * MPDController.h: Passwords for MPD implemented Error Handling * AppController.h: *** empty log message *** * PreferencesController.h: Passwords for MPD implemented * StatisticsController.m, CollectionController.m: *** empty log message *** * MPDController.m: Passwords for MPD implemented Error Handling * PreferencesController.m, AppController.m: Passwords for MPD implemented 2004-05-18 Daniel Luederwald * MPDController.h, PlaylistController.m, PlaylistController.h: Implemented ShuffleList * PreferencesController.m: *** empty log message *** * AppController.m, AppController.h: Try to connect to Server if Preferences changed. * MPDController.m: Fixed Server-Errors * PreferencesController.m: *** empty log message *** * AppController.m, AppController.h: Fixed Server-Errors * StatisticsItem.h, StatisticsController.h: New file. * MPDController.h, AppController.h: Added Server-Statistics 2004-05-17 Daniel Luederwald * StatisticsItem.m, StatisticsController.m: New file. * MPDController.m, AppController.m: Added Server-Statistics * AppController.m: *** empty log message *** * PlaylistsManagerController.h, CollectionController.h, PlaylistItem.h, MPDController.h, PlaylistController.h, libmpdclient.h, PlayView.h, PreferencesController.h, AppController.h, PlaylistsManagerController.m, CollectionController.m, MPDController.m, PlaylistItem.m, PlaylistController.m, PlayView.m, PreferencesController.m, AppController.m: New file. MPDCon-1.5.1/CollectionBrowser.h0000644000175000017500000000061312072316665016566 0ustar sebastiasebastia/* All Rights reserved */ #include #include "MPDController.h" @interface CollectionBrowser : NSWindowController { IBOutlet NSBrowser *browser; IBOutlet NSBrowser *window; MPDController *mpdController; NSArray *directories; NSMutableDictionary *dirhierarchy; NSMutableDictionary *dirmetadata; } // Initialization Methods + (id) sharedCollectionBrowser; @end MPDCon-1.5.1/CollectionBrowser.m0000644000175000017500000001222512247130574016572 0ustar sebastiasebastia/* All Rights reserved */ #include #include "CollectionBrowser.h" #include "Strings.h" @interface CollectionBrowser(Private) - (void) _refreshView:(id) sender; @end @implementation CollectionBrowser + (id) sharedCollectionBrowser { static CollectionBrowser *_sharedCollectionBrowser = nil; if (! _sharedCollectionBrowser) { _sharedCollectionBrowser = [[CollectionBrowser allocWithZone: [self zone]] init]; } return _sharedCollectionBrowser; } - (id) init { if ((self = [self initWithWindowNibName: @"CollectionBrowser"]) != nil) { [self setWindowFrameAutosaveName: @"CollectionBrowser"]; mpdController = [MPDController sharedMPDController]; directories = [[mpdController getAllDirectories] retain]; dirhierarchy = [[NSMutableDictionary alloc] init]; dirmetadata = [[NSMutableDictionary alloc] init]; } return self; } - (void) dealloc { [mpdController release]; [directories release]; [dirhierarchy release]; [dirmetadata release]; [super dealloc]; } /* -------------------- - Playlist Methods - --------------------*/ - (void) addSelected: (id)sender { NSEnumerator *songEnum = [[browser selectedCells] objectEnumerator]; NSCell *selectedSong; NSString *path = [browser pathToColumn:[browser selectedColumn]]; while ((selectedSong = [songEnum nextObject]) != nil) { [NSString pathWithComponents: [NSArray arrayWithObjects: path, [selectedSong objectValue], nil]]; [[MPDController sharedMPDController] addTrack: [[NSString pathWithComponents: [NSArray arrayWithObjects: path, [selectedSong objectValue], nil]] substringFromIndex:1]]; } } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { NSNotificationCenter *defCenter; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(_refreshView:) name: ShownCollectionChangedNotification object: nil]; [browser setPath:@"/"]; [browser setDelegate: self]; } - (void) updateCollection: (id)sender { [[MPDController sharedMPDController] updateCollection]; } /* ----------------------- - NSBrowser Delegates - -----------------------*/ - (NSInteger)browser:(NSBrowser *)sender numberOfRowsInColumn:(NSInteger)column { NSInteger count; NSEnumerator *dirEnum, *fileEnum; NSString *dir, *file; NSMutableArray *tmpArray = [NSMutableArray new]; NSSet *uniqueElements; NSArray *files; NSString *ptc = [sender pathToColumn: column]; NSString *rptc = [ptc substringFromIndex:1]; dirEnum = [directories objectEnumerator]; while ((dir = [dirEnum nextObject]) != nil) { if ([[dir pathComponents] count] > column) { NSString *tmpObject = [NSString stringWithFormat:@"%@", [[dir pathComponents] objectAtIndex:column]]; if ([dir hasPrefix:rptc]) { if ([tmpArray indexOfObject:dir] == NSNotFound) { [tmpArray addObject:tmpObject]; } } if ([rptc length] == 0 && column == 0) { if (![tmpArray containsObject:tmpObject]) { [tmpArray addObject:tmpObject]; } } [dirmetadata setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%@%@", ptc,tmpObject]]; } } uniqueElements = [NSSet setWithArray:tmpArray]; [tmpArray release]; tmpArray = [NSMutableArray arrayWithArray: [uniqueElements allObjects]]; [tmpArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; files = [mpdController getAllFilesInDirectory:rptc]; [tmpArray addObjectsFromArray: files]; [dirhierarchy setObject:tmpArray forKey:ptc]; fileEnum = [files objectEnumerator]; while ((file = [fileEnum nextObject]) != nil) { [dirmetadata setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%@%@", ptc,file]]; } count = [tmpArray count]; return count; } - (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(NSInteger)row column:(NSInteger)column { NSString *ptc = [sender pathToColumn: column]; NSString *content = [NSString stringWithFormat:@"%@", [[dirhierarchy objectForKey:ptc] objectAtIndex:row]]; [cell setStringValue:content]; [cell setTitle:content]; [cell setLeaf: [[dirmetadata objectForKey:[NSString stringWithFormat:@"%@%@", ptc,content]] boolValue]]; [cell setLoaded: YES]; } - (BOOL)browser:(NSBrowser *)browser canDragRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column withEvent:(NSEvent *)event { return YES; } - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize { // Doesn't work. Why ???? printf("windowWillResize: %s\n", [NSStringFromSize(proposedFrameSize) cString]); return proposedFrameSize; } @end @implementation CollectionBrowser(Private) - (void) _refreshView:(id) sender { NSInteger idx; NSInteger last = [browser lastColumn]; directories = [[mpdController getAllDirectories] retain]; for (idx = 0;idx < last;idx++) { [browser reloadColumn:idx]; } } @end MPDCon-1.5.1/CollectionController.h0000644000175000017500000000503412105450041017250 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Collection Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_COLLECTIONCONTROLLER_H #define _PCAPPPROJ_COLLECTIONCONTROLLER_H #include #include "MPDController.h" #include "PlaylistItem.h" #include "Strings.h" #include "BoldFormatter.h" #include "NormalFormatter.h" @interface CollectionController : NSWindowController { IBOutlet NSBrowser *collectionView; IBOutlet NSTableView *trackView; IBOutlet NSWindow *window; IBOutlet NSTextField *filterField; NSArray *allArtists; NSArray *allAlbums; NSArray *allSongs; NSArray *filteredTracks; } // Initialization Methods + (id) sharedCollectionController; // Playlist Methods - (void) addSelected: (id)sender; // Gui Methods - (void) updateCollection: (id)sender; - (void) doubleClicked: (id)sender; - (void) filterCollection: (id)sender; - (void) clearFilter: (id)sender; - (NSArray *) getAllTracks; // TableView dataSource Methods - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView; - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(NSInteger) row; // Browser delegate Methods - (NSInteger)browser:(NSBrowser *)sender numberOfRowsInColumn:(NSInteger)column; - (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(NSInteger)row column:(NSInteger)column; - (NSString *)browser:(NSBrowser *)sender titleOfColumn:(NSInteger)column; - (void) selectionChanged: (id)sender; // TableView dragging Methods - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard; // Notification Methods - (void) didNotConnect: (NSNotification *)aNotif; @end #endif MPDCon-1.5.1/CollectionController.m0000644000175000017500000003451412244135426017275 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Collection Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "CollectionController.h" /* --------------------- - Private Interface - ---------------------*/ @interface CollectionController(Private) - (void) _refreshViews: (id)sender; - (void) _filterCollectionByString: (NSString *)filterString; - (void) _getAllAlbumsForArtistAt: (NSInteger)row; - (void) _getAllTracksForArtistAt: (NSInteger)artistRow albumAt: (NSInteger)albumRow; int _artistSort(id artist1, id artist2, void *context); int _albumSort(id album1, id album2, void *context); int _trackSort(id track1, id track2, void *context); int _titleSort(id title1, id title2, void *context); int _aSort(id string1, id string2, void *context); @end @implementation CollectionController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedCollectionController { static CollectionController *_sharedCollectionController = nil; if (! _sharedCollectionController) { _sharedCollectionController = [[CollectionController allocWithZone: [self zone]] init]; } return _sharedCollectionController; } - (id) init { self = [self initWithWindowNibName: @"Collection"]; if (self) { [self setWindowFrameAutosaveName: @"Collection"]; } return self; } - (void) dealloc { [allSongs release]; [allArtists release]; [allAlbums release]; [filteredTracks release]; [super dealloc]; } /* -------------------- - Playlist Methods - --------------------*/ - (void) addSelected: (id)sender { NSEnumerator *songEnum = [trackView selectedRowEnumerator]; NSNumber *songNumber; while ((songNumber = [songEnum nextObject]) != nil) { [[MPDController sharedMPDController] addTrack: [[allSongs objectAtIndex: [songNumber intValue]] getPath]]; } } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { NSNotificationCenter *defCenter; [trackView setAutosaveName: @"CollectionTrackTable"]; [trackView setAutosaveTableColumns: YES]; [trackView setTarget: self]; [trackView setDoubleAction: @selector(doubleClicked:)]; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; [defCenter addObserver: self selector: @selector(_refreshViews:) name: ShownCollectionChangedNotification object: nil]; [self _refreshViews:nil]; } - (void) updateCollection: (id)sender { [[MPDController sharedMPDController] updateCollection]; } - (void) doubleClicked: (id)sender { if ([trackView clickedRow] >= 0) { [self addSelected: self]; } else { NSString *identifier; identifier = [(NSTableColumn *)[[trackView tableColumns] objectAtIndex: [trackView clickedColumn]] identifier]; if ([identifier isEqual: @"artist"]) { NSArray *tmpArray = [[[allSongs autorelease] sortedArrayUsingFunction: _artistSort context: NULL] retain]; allSongs = tmpArray; } else if ([identifier isEqual: @"album"]) { NSArray *tmpArray = [[[allSongs autorelease] sortedArrayUsingFunction: _albumSort context: NULL] retain]; allSongs = tmpArray; } else if ([identifier isEqual: @"title"]) { NSArray *tmpArray = [[[allSongs autorelease] sortedArrayUsingFunction: _titleSort context: NULL] retain]; allSongs = tmpArray; } else if ([identifier isEqual: @"trackNr"]) { NSArray *tmpArray = [[[allSongs autorelease] sortedArrayUsingFunction: _trackSort context: NULL] retain]; allSongs = tmpArray; } [trackView reloadData]; } } - (void) filterCollection: (id) sender { [self _refreshViews:nil]; } - (void) clearFilter: (id)sender { if ([[filterField stringValue] compare: @""] == NSOrderedSame) { return; } [filterField setStringValue: @""]; [self _refreshViews:nil]; } /* -------------------------------- - TableView dataSource Methods - --------------------------------*/ - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView { return [allSongs count]; } - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(NSInteger) row { NSString *identifier = [tableColumn identifier]; return [[allSongs objectAtIndex: row] valueForKey: identifier]; } /* ---------------------------- - Browser delegate Methods - ----------------------------*/ - (NSInteger)browser:(NSBrowser *)sender numberOfRowsInColumn:(NSInteger)column { if (column == 0) { return [allArtists count] + 1; } else { [self _getAllAlbumsForArtistAt: [sender selectedRowInColumn: 0]]; return [allAlbums count]+1; } } - (void)browser:(NSBrowser *)sender willDisplayCell:(id)cell atRow:(NSInteger)row column:(NSInteger)column { #warning FIXME the formatters are not working if (column == 0) { [cell setLeaf: NO]; if (row == 0) { //[cell setFormatter: [[[BoldFormatter alloc] init] autorelease]]; [cell setStringValue: [NSString stringWithFormat: @"All (%"PRIuPTR" Artists)", [allArtists count]]]; } else { //[cell setFormatter: [[[NormalFormatter alloc] init] autorelease]]; [cell setStringValue: [allArtists objectAtIndex: row-1]]; } } else { [cell setLeaf: YES]; if (row == 0) { //[cell setFormatter: [[[BoldFormatter alloc] init] autorelease]]; [cell setStringValue: [NSString stringWithFormat: @"All (%"PRIuPTR" Albums)", [allAlbums count]]]; } else { //[cell setFormatter: [[[NormalFormatter alloc] init] autorelease]]; [cell setStringValue: [allAlbums objectAtIndex: row-1]]; } } } - (NSString *)browser:(NSBrowser *)sender titleOfColumn:(NSInteger)column { if (column == 0) { return @"Artists"; } else if (column == 1) { return @"Albums"; } else { return @""; } } - (void) selectionChanged: (id) sender { [self _getAllTracksForArtistAt: [sender selectedRowInColumn: 0] albumAt: [sender selectedRowInColumn: 1]]; [trackView reloadData]; [trackView deselectAll: sender]; if ([trackView numberOfRows] > 0) { [trackView scrollRowToVisible: 0]; } } /* ------------------------------ - TableView dragging Methods - ------------------------------*/ - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard { NSArray *typeArray; NSMutableArray *songArray; BOOL accept; NSUInteger count; count = [rows count]; if (count > 0) { NSUInteger i; songArray = [[NSMutableArray alloc] init]; for (i = 0; i < count; i++) { [songArray addObject: [[allSongs objectAtIndex: [[rows objectAtIndex: i] integerValue]] getPath]]; } accept = YES; typeArray = [NSArray arrayWithObjects: CollectionDragType, nil]; [pboard declareTypes: typeArray owner: self]; [pboard setPropertyList: [songArray autorelease] forType: CollectionDragType]; } else { accept = NO; } return accept; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } - (NSArray *) getAllTracks { return filteredTracks; } @end /* ------------------- - Private Methods - -------------------*/ @implementation CollectionController(Private) - (void) _refreshViews:(id) sender { [self _filterCollectionByString: [filterField stringValue]]; [collectionView reloadColumn: 0]; [collectionView selectRow: 0 inColumn: 0]; [self selectionChanged: collectionView]; } - (void) _getAllAlbumsForArtistAt: (NSInteger)row { [allAlbums release]; NSMutableSet *tmpAlbums = [[NSMutableSet alloc] init]; NSUInteger i; for (i = 0; i < [filteredTracks count]; i++) { if (row <= 0) { [tmpAlbums addObject: [[filteredTracks objectAtIndex: i] getAlbum]]; } else { if ([[[filteredTracks objectAtIndex: i] getArtist] compare: [allArtists objectAtIndex: (row-1)]] == NSOrderedSame) { [tmpAlbums addObject: [[filteredTracks objectAtIndex: i] getAlbum]]; } } } allAlbums = [[[[tmpAlbums autorelease] allObjects] sortedArrayUsingFunction: _aSort context: NULL] retain]; } - (void) _getAllTracksForArtistAt: (NSInteger)artistRow albumAt: (NSInteger)albumRow { [allSongs release]; if (artistRow < 1) { if (albumRow < 1) { allSongs = [[NSArray arrayWithArray: filteredTracks] retain]; } else { NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; NSUInteger i; for (i = 0; i < [filteredTracks count]; i++) { if ([[[filteredTracks objectAtIndex: i] getAlbum] compare: [allAlbums objectAtIndex: (albumRow -1)]] == NSOrderedSame) { [tmpArray addObject: [filteredTracks objectAtIndex: i]]; } } allSongs = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; } } else { if (albumRow < 1) { NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; NSUInteger i; for (i = 0; i < [filteredTracks count]; i++) { if ([[[filteredTracks objectAtIndex: i] getArtist] compare: [allArtists objectAtIndex: (artistRow -1)]] == NSOrderedSame) { [tmpArray addObject: [filteredTracks objectAtIndex: i]]; } } allSongs = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; } else { NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; NSUInteger i; for (i = 0; i < [filteredTracks count]; i++) { if (([[[filteredTracks objectAtIndex: i] getArtist] compare: [allArtists objectAtIndex: (artistRow -1)]] == NSOrderedSame) && ([[[filteredTracks objectAtIndex: i] getAlbum] compare: [allAlbums objectAtIndex: (albumRow -1)]] == NSOrderedSame)) { [tmpArray addObject: [filteredTracks objectAtIndex: i]]; } } allSongs = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; } } } - (void) _filterCollectionByString: (NSString *) fString { [allArtists release]; [filteredTracks release]; if ([fString compare: @""] == NSOrderedSame) { allArtists = [[[MPDController sharedMPDController] getAllArtists] retain]; filteredTracks = [[[MPDController sharedMPDController] getAllTracksWithMetadata: YES] retain]; } else { NSArray *allTracks = [[[MPDController sharedMPDController] getAllTracksWithMetadata: YES] retain]; NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; NSMutableSet *tmpArtists = [[NSMutableSet alloc] init]; NSUInteger i; for (i = 0; i < [allTracks count]; i++) { if ([[[allTracks objectAtIndex: i] getArtist] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [allTracks objectAtIndex: i]]; } else if ([[[allTracks objectAtIndex: i] getTitle] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [allTracks objectAtIndex: i]]; } else if ([[[allTracks objectAtIndex: i] getAlbum] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [allTracks objectAtIndex: i]]; } } [allTracks release]; filteredTracks = [[NSArray arrayWithArray: [tmpArray autorelease]] retain]; for (i = 0; i < [filteredTracks count]; i++) { [tmpArtists addObject: [[filteredTracks objectAtIndex: i] getArtist]]; } allArtists = [[[[tmpArtists autorelease] allObjects] sortedArrayUsingFunction: _aSort context: NULL] retain]; } } int _artistSort(id artist1, id artist2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)artist1; pl2 = (PlaylistItem *)artist2; return [[pl1 getArtist] caseInsensitiveCompare: [pl2 getArtist]]; } int _albumSort(id album1, id album2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)album1; pl2 = (PlaylistItem *)album2; return [[pl1 getAlbum] caseInsensitiveCompare: [pl2 getAlbum]]; } int _titleSort(id track1, id track2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)track1; pl2 = (PlaylistItem *)track2; return [[pl1 getTitle] caseInsensitiveCompare: [pl2 getTitle]]; } int _trackSort(id track1, id track2, void *context) { PlaylistItem *pl1, *pl2; pl1 = (PlaylistItem *)track1; pl2 = (PlaylistItem *)track2; return [[pl1 getTrackNr] caseInsensitiveCompare: [pl2 getTrackNr]]; } int _aSort(id string1, id string2, void *context) { return [string1 caseInsensitiveCompare: string2]; } @end MPDCon-1.5.1/CrossfadeController.h0000644000175000017500000000253711716254167017115 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Crossfade Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_CROSSFADECONTROLLER_H #define _PCAPPPROJ_CROSSFADECONTROLLER_H #include #include "MPDController.h" #include "Strings.h" @interface CrossfadeController : NSWindowController { IBOutlet NSTextField *valueField; IBOutlet NSStepper *valueStepper; IBOutlet NSWindow *window; } // Initialization Methods + (id) sharedCrossfadeController; // Gui Methods - (void) valueChanged: (id)sender; - (void) apply: (id)sender; - (void) revert: (id)sender; @end #endif MPDCon-1.5.1/CrossfadeController.m0000644000175000017500000000446311716254170017114 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Crossfade Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "CrossfadeController.h" /* --------------------- - Private Interface - ---------------------*/ @interface CrossfadeController(Private) - (void) _getValues; @end @implementation CrossfadeController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedCrossfadeController { static CrossfadeController *_sharedCrossfadeController = nil; if (! _sharedCrossfadeController) { _sharedCrossfadeController = [[CrossfadeController allocWithZone: [self zone]] init]; } return _sharedCrossfadeController; } - (id) init { self = [self initWithWindowNibName: @"CrossfadeView"]; if (self) { [self setWindowFrameAutosaveName: @"CrossfadeView"]; } return self; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [self _getValues]; } - (void) valueChanged: (id)sender { [valueField setIntValue: [valueStepper intValue]]; } - (void) apply: (id)sender { [[MPDController sharedMPDController] setCrossfade: [valueStepper intValue]]; [[self window] performClose: self]; } - (void) revert: (id)sender { [self _getValues]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation CrossfadeController(Private) - (void) _getValues { [valueStepper setIntValue: [[MPDController sharedMPDController] getCrossfade]]; [self valueChanged: self]; } @end MPDCon-1.5.1/GNUmakefile0000644000175000017500000000462212251634757015040 0ustar sebastiasebastia# # GNUmakefile - Generated by ProjectCenter # ifeq ($(GNUSTEP_MAKEFILES),) GNUSTEP_MAKEFILES := $(shell gnustep-config --variable=GNUSTEP_MAKEFILES 2>/dev/null) endif ifeq ($(GNUSTEP_MAKEFILES),) $(error You need to set GNUSTEP_MAKEFILES before compiling!) endif include $(GNUSTEP_MAKEFILES)/common.make # # Application # VERSION = 1.5.1 PACKAGE_NAME = MPDCon APP_NAME = MPDCon MPDCon_APPLICATION_ICON = MPDCon.tiff # # Resource files # MPDCon_RESOURCE_FILES = \ Resources/Player.gorm \ Resources/Preferences.gorm \ Resources/PlaylistViewer.gorm \ Resources/Collection.gorm \ Resources/PlaylistsManager.gorm \ Resources/StatisticsViewer.gorm \ Resources/CrossfadeView.gorm \ Resources/LyricsInspector.gorm \ Resources/SongInspector.gorm \ Resources/PlaylistInspector.gorm \ Resources/CollectionBrowser.gorm \ Resources/Play.tiff \ Resources/Pause.tiff \ Resources/Next.tiff \ Resources/Prev.tiff \ Resources/Stop.tiff \ Resources/GNUstep.tiff \ Resources/Repeat.tiff \ Resources/Shuffle.tiff \ Resources/Playlist.tiff \ Resources/Crossfade.tiff \ Resources/MPDCon.tiff \ Resources/MoveSong.tiff \ Resources/Current.tiff \ Resources/Star.tiff \ Resources/Install \ Resources/COPYING # # Header files # MPDCon_HEADER_FILES = \ AppController.h \ PreferencesController.h \ PlayView.h \ PlaylistController.h \ MPDController.h \ PlaylistItem.h \ CollectionController.h \ PlaylistsManagerController.h \ StatisticsController.h \ StatisticsItem.h \ CrossfadeController.h \ OwnTableView.h \ Strings.h \ BoldCell.h \ BoldFormatter.h \ NormalFormatter.h \ LyricsInspector.h \ SongInspector.h \ SongRatingCell.h \ PlaylistInspector.h \ RatingStarView.h \ RatingStarViewController.h \ SQLiteAdaptor.h \ RandomPlaylistFeed.h \ CollectionBrowser.h # # Class files # MPDCon_OBJC_FILES = \ AppController.m \ PreferencesController.m \ PlayView.m \ PlaylistController.m \ MPDController.m \ PlaylistItem.m \ CollectionController.m \ PlaylistsManagerController.m \ StatisticsController.m \ StatisticsItem.m \ CrossfadeController.m \ OwnTableView.m \ BoldCell.m \ BoldFormatter.m \ NormalFormatter.m \ LyricsInspector.m \ SongInspector.m \ SongRatingCell.m \ PlaylistInspector.m \ SQLiteAdaptor.m \ RandomPlaylistFeed.m \ CollectionBrowser.m # # Other sources # MPDCon_OBJC_FILES += \ main.m # # Makefiles # -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/aggregate.make include $(GNUSTEP_MAKEFILES)/application.make -include GNUmakefile.postamble MPDCon-1.5.1/GNUmakefile.postamble0000644000175000017500000000124411716254170017012 0ustar sebastiasebastia# # GNUmakefile.postamble - Generated by ProjectCenter # # Things to do before compiling # before-all:: # Things to do after compiling # after-all:: # Things to do before installing # before-install:: # Things to do after installing # after-install:: # Things to do before uninstalling # before-uninstall:: # Things to do after uninstalling # after-uninstall:: # Things to do before cleaning # before-clean:: # Things to do after cleaning # after-clean:: # Things to do before distcleaning # before-distclean:: # Things to do after distcleaning # after-distclean:: # Things to do before checking # before-check:: # Things to do after checking # after-check:: MPDCon-1.5.1/GNUmakefile.preamble0000644000175000017500000000133712251634443016616 0ustar sebastiasebastia# # GNUmakefile.preamble - Generated by ProjectCenter # ifeq (yes,$(need-libbsd)) LIBBSD_CPPFLAGS = -DNEED_BSD_H=yes LIBBSD_LDFLAGS = -lbsd endif # Additional flags to pass to the preprocessor ADDITIONAL_CPPFLAGS += ${LIBBSD_CPPFLAGS} # Additional flags to pass to Objective C compiler ADDITIONAL_OBJCFLAGS += # Additional flags to pass to C compiler ADDITIONAL_CFLAGS += # Additional flags to pass to the linker ADDITIONAL_LDFLAGS += -L/usr/local/lib -lmpdclient -lSQLClient ${LIBBSD_LDFLAGS} # Additional include directories the compiler should search ADDITIONAL_INCLUDE_DIRS += # Additional library directories the linker should search ADDITIONAL_LIB_DIRS += # Additional GUI libraries to link ADDITIONAL_GUI_LIBS += MPDCon-1.5.1/Info-gnustep.plist0000644000175000017500000000176611717236646016430 0ustar sebastiasebastia{ ApplicationDescription = "GNUstep Client for MPD"; ApplicationIcon = MPDCon.tiff; ApplicationName = MPDCon; ApplicationRelease = 1.2; Authors = ( "Daniel Luederwald " "Sebastian Reitenbach " ); Copyright = "Copyright (C) 2004 Daniel Luederwald"; CopyrightDescription = "Released under the GNU General Public License 2.0"; FullVersionID = 1.2; NSExecutable = MPDCon; NSIcon = MPDCon.tiff; NSMainNibFile = Player.gorm; NSPrincipalClass = NSApplication; NSRole = Application; NSTypes = ( ); NSServices = ( { NSPortName = MPDCon; NSMessage = getPlaylist; NSMenuItem = { default = "MPDCon/Get Playlist"; English = "MPDCon/Get Playlist"; }; NSReturnTypes = (NSStringPboardType); }, { NSPortName = MPDCon; NSMessage = getAlbums; NSMenuItem = { default = "MPDCon/Get Albums"; English = "MPDCon/Get Albums"; }; NSReturnTypes = (NSStringPboardType); } ); } MPDCon-1.5.1/LyricsInspector.h0000644000175000017500000000222212056712377016263 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: Sebastian Reitenbach Created: 2012-09-02 Lyrics Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "MPDController.h" @interface LyricsInspector : NSWindowController { id artist; id lyricsText; id title; MPDController *mpdController; NSMutableString *lyricsURL; } + (id) sharedLyricsInspector; - (void) updateLyrics; - (void) openURL: (id)sender; @end MPDCon-1.5.1/LyricsInspector.m0000644000175000017500000000502112241155375016263 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: Sebastian Reitenbach Created: 2012-09-02 Lyrics Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "LyricsInspector.h" #include "PlaylistItem.h" @implementation LyricsInspector /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedLyricsInspector { static LyricsInspector *_sharedLyricsInspector = nil; if (! _sharedLyricsInspector) { _sharedLyricsInspector = [[LyricsInspector allocWithZone: [self zone]] init]; } return _sharedLyricsInspector; } - (id) init { if ((self = [self initWithWindowNibName: @"LyricsInspector"]) != nil) { [self setWindowFrameAutosaveName: @"LyricsInspector"]; mpdController = [MPDController sharedMPDController]; } return self; } - (void) dealloc { [lyricsURL release]; [super dealloc]; } /* GUI methods */ - (void) awakeFromNib { NSNotificationCenter *defCenter; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [self updateLyrics]; } /* the method behind the button */ - (void) openURL: (id)sender { [[NSWorkspace sharedWorkspace] openURL: [NSURL URLWithString: lyricsURL]]; } /* the delegate methods */ - (void) songChanged:(NSNotification *)aNotif { [self updateLyrics]; } - (void) updateLyrics { PlaylistItem *currentSong; NSDictionary *lyrics; currentSong = [mpdController getCurrentSong]; [artist setStringValue:[currentSong getArtist]]; [title setStringValue:[currentSong getTitle]]; lyrics = [currentSong getLyrics]; [lyricsText setStringValue: [lyrics objectForKey:@"lyricsText"]]; lyricsURL = [[lyrics objectForKey:@"lyricsURL"] copy]; return; } @end MPDCon-1.5.1/MPDConInfo.plist0000644000175000017500000000115612247130247015724 0ustar sebastiasebastia{ ApplicationDescription = "GNUstep Client for MPD"; ApplicationIcon = "MPDCon.tiff"; ApplicationName = MPDCon; ApplicationRelease = "1.5"; Authors = ( "The GAP Team", "Daniel Luederwald " ); Copyright = "Copyright (C) 2013 GAP Team, 2004-06 Daniel Luederwald"; CopyrightDescription = "Released under the GNU General Public License 2.0 or later"; FullVersionID = "1.5"; NSExecutable = MPDCon; NSIcon = "MPDCon.tiff"; NSMainNibFile = "Player.gorm"; NSPrincipalClass = NSApplication; NSRole = Application; URL = "http://gap.nongnu.org/mpdcon"; }MPDCon-1.5.1/MPDController.h0000644000175000017500000000644512072316665015624 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:37:03 +0200 by flip MPD Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_MPDCONTROLLER_H_ #define _PCAPPPROJ_MPDCONTROLLER_H_ #include #include #include "PlaylistItem.h" #include "StatisticsItem.h" #include "Strings.h" #define state_NOCONN -1 #define state_UNKNOWN 0 #define state_STOP 1 #define state_PLAY 2 #define state_PAUSE 3 @interface MPDController : NSObject { struct mpd_connection *mpdConnection; NSString *host; NSString *port; NSString *password; NSString *timeout; long long currPlaylist; unsigned int currPlaylistVersion; // those two are used to check whether the collection changed unsigned int numArtists; unsigned int numAlbums; } // Initialization Methods + (id) sharedMPDController; // Connection Methods - (BOOL) connectToServer: (NSString *)hostName port: (NSString *)port password: (NSString *)pword timeout: (NSString *)tout; // Play Methods - (void) play; - (void) playSong: (int)song; - (void) stop; - (void) prev; - (void) next; - (void) toggleShuffle; - (void) toggleRepeat; - (void) seekToTime: (int)time; - (void) setVolume: (int)volume; - (void) setCrossfade: (int)cfTime; // Information Methods - (int) getState; - (BOOL) isRandom; - (BOOL) isRepeat; - (int) getVolume; - (int) getCrossfade; - (StatisticsItem *) getStatistics; // Playlist Commands - (PlaylistItem *) getCurrentSong; - (int) getCurrentSongNr; - (int) getPlaylistLength; - (NSArray *) getPlaylist; - (BOOL) playlistChanged; - (void) shuffleList; - (void) clearPlaylist; - (void) removeSong: (int)song; - (void) removeSongRange: (NSRange)songRange; - (void) addTrack: (NSString *)file; - (void) moveSongNr: (int)song1 to: (int)song2; - (void) moveSongWithID: (int)song1 to: (int)song2; - (NSArray *) getAllPlaylists; - (void) loadPlaylist: (NSString *)title; - (void) savePlaylist: (NSString *)title; - (void) removePlaylist: (NSString *)title; // Collection Commands - (BOOL) collectionChanged; - (NSArray *) getAllArtists; - (NSArray *) getAllAlbums; - (NSArray *) getAllTracksWithMetadata: (BOOL) withMetadata; - (NSArray *) getAlbumsForArtist: (NSString *)artist; - (NSArray *) getAllTracksForArtist: (NSString *)artist; - (NSArray *) getAllTracksForArtist: (NSString *)artist album: (NSString *)album; - (NSArray *) getAllTracksForAlbum: (NSString *)album; -(NSArray *) getAllFilesInDirectory: (NSString *) directory; - (void) updateCollection; - (NSArray *) getAllDirectories; @end #endif MPDCon-1.5.1/MPDController.m0000644000175000017500000006676312244155327015637 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:37:03 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "MPDController.h" /* --------------------- - Private Interface - ---------------------*/ @interface MPDController(Private) - (BOOL) _doConnect; - (BOOL) _checkConnection; - (PlaylistItem *) _getPlaylistItemForSong: (const struct mpd_song *)anSong; - (unsigned int) _getAllAlbumsCount; - (unsigned int) _getAllArtistsCount; int _stringSort(id string1, id string2, void *context); @end @implementation MPDController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedMPDController { static MPDController *_sharedMPDController = nil; if (! _sharedMPDController) { _sharedMPDController = [[MPDController allocWithZone: [self zone]] init]; } return _sharedMPDController; } - (id) init { numArtists = 0; numAlbums = 0; return self; } - (void) dealloc { mpd_connection_free(mpdConnection); [host release]; [port release]; [password release]; [timeout release]; [super dealloc]; } /* ---------------------- - Connection Methods - ----------------------*/ - (BOOL) connectToServer: (NSString *)hostName port: (NSString *)portNr password: (NSString *)pword timeout: (NSString *)tout { if ((hostName) && (portNr) && (tout)) { BOOL didConnect; if (host) { [host release]; } if (port) { [port release]; } if (password) { [password release]; } if (port) { [timeout release]; } host = [hostName copy]; port = [portNr copy]; password = [pword copy]; timeout = [tout copy]; didConnect = [self _doConnect]; return didConnect; } else { return NO; } } /* ---------------- - Play Methods - ----------------*/ - (void) play { [self playSong: -1]; } - (void) playSong: (int)theSong { struct mpd_status *mpdStatus; if (![self _checkConnection]) { return; } if (theSong != -1) { mpd_send_play_pos(mpdConnection, theSong); } else { mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if(mpd_status_get_state(mpdStatus) == MPD_STATE_STOP) { mpd_send_play(mpdConnection); } else { mpd_send_toggle_pause(mpdConnection); } mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } } } - (void) stop { struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if((mpd_status_get_state(mpdStatus) == MPD_STATE_PLAY) || (mpd_status_get_state(mpdStatus) == MPD_STATE_PAUSE)) { mpd_send_stop(mpdConnection); mpd_response_finish(mpdConnection); } mpd_status_free(mpdStatus); } } - (void) prev { struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if((mpd_status_get_state(mpdStatus) == MPD_STATE_PLAY) || (mpd_status_get_state(mpdStatus) == MPD_STATE_PAUSE)) { mpd_send_previous(mpdConnection); mpd_response_finish(mpdConnection); } mpd_status_free(mpdStatus); } } - (void) next { struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if((mpd_status_get_state(mpdStatus) == MPD_STATE_PLAY) || (mpd_status_get_state(mpdStatus) == MPD_STATE_PAUSE)) { mpd_send_next(mpdConnection); mpd_response_finish(mpdConnection); } mpd_status_free(mpdStatus); } } - (void) toggleShuffle { struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { mpd_send_random(mpdConnection, (mpd_status_get_random(mpdStatus) == 0) ? 1 : 0); mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } } - (void) toggleRepeat { struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { mpd_send_repeat(mpdConnection, (mpd_status_get_repeat(mpdStatus) == 0) ? 1 : 0); mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } } - (void) seekToTime: (int)time { struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if ((mpd_status_get_state(mpdStatus) == MPD_STATE_PLAY) || (mpd_status_get_state(mpdStatus) == MPD_STATE_PAUSE)) { mpd_send_seek_pos(mpdConnection, mpd_status_get_song_pos(mpdStatus), time); mpd_response_finish(mpdConnection); } mpd_status_free(mpdStatus); } } - (void) setVolume: (int)volume { if (! [self _checkConnection]) { return; } mpd_send_set_volume(mpdConnection, volume); mpd_response_finish(mpdConnection); } - (void) setCrossfade: (int)cfTime { if (! [self _checkConnection]) { return; } mpd_send_crossfade(mpdConnection, cfTime); mpd_response_finish(mpdConnection); } /* ----------------------- - Information Methods - -----------------------*/ - (int) getState { int state = state_NOCONN; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return state; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { switch (mpd_status_get_state(mpdStatus)) { case MPD_STATE_UNKNOWN: state = state_UNKNOWN; break; case MPD_STATE_STOP: state = state_STOP; break; case MPD_STATE_PLAY: state = state_PLAY; break; case MPD_STATE_PAUSE: state = state_PAUSE; break; } mpd_status_free(mpdStatus); } else { state = state_UNKNOWN; } mpd_response_finish(mpdConnection); return state; } - (BOOL) isRandom { BOOL random = NO; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return random; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if ((mpd_status_get_random(mpdStatus)) == 1) { random = YES; } else { random = NO; } mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } return random; } - (BOOL) isRepeat { BOOL repeat = NO; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return repeat; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { if (mpdStatus && (mpd_status_get_repeat(mpdStatus)) == 1) { repeat = YES; } else { repeat = NO; } mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } return repeat; } - (int) getVolume { int volume = 0; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return 0; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { volume = mpd_status_get_volume(mpdStatus); mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } return volume; } - (int) getCrossfade { int cfTime = 0; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return 0; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { cfTime = mpd_status_get_crossfade(mpdStatus); mpd_status_free(mpdStatus); } return cfTime; } - (StatisticsItem *) getStatistics { struct mpd_stats *mpdStats; StatisticsItem *statItem; if (! [self _checkConnection]) { return nil; } mpdStats = mpd_run_stats(mpdConnection); if (mpdStats != NULL) { statItem = [[StatisticsItem alloc] init]; [statItem setNumberOfArtists: mpd_stats_get_number_of_artists(mpdStats)]; [statItem setNumberOfAlbums: mpd_stats_get_number_of_albums(mpdStats)]; [statItem setNumberOfSongs: mpd_stats_get_number_of_songs(mpdStats)]; [statItem setUptime: mpd_stats_get_uptime(mpdStats)]; [statItem setDbUpdatetime: mpd_stats_get_db_update_time(mpdStats)]; [statItem setPlaytime: mpd_stats_get_play_time(mpdStats)]; [statItem setDbPlaytime: mpd_stats_get_db_play_time(mpdStats)]; mpd_stats_free(mpdStats); mpd_response_finish(mpdConnection); return [statItem autorelease]; } else { return nil; } } /* --------------------- - Playlist Commands - ---------------------*/ - (PlaylistItem *) getCurrentSong { struct mpd_status *mpdStatus; PlaylistItem *currSong = nil; if (! [self _checkConnection]) { return currSong; } if (!mpd_command_list_begin(mpdConnection, true) || !mpd_send_status(mpdConnection) || !mpd_send_current_song(mpdConnection) || !mpd_command_list_end(mpdConnection)) { return currSong; } mpdStatus = mpd_recv_status(mpdConnection); if (mpdStatus == NULL) { return currSong; } if(mpd_status_get_state(mpdStatus) == MPD_STATE_PLAY || mpd_status_get_state(mpdStatus) == MPD_STATE_PAUSE) { struct mpd_song *mpdSong; if (!mpd_response_next(mpdConnection)) { return nil; } mpdSong = mpd_recv_song(mpdConnection); currSong = [[self _getPlaylistItemForSong: mpdSong] retain]; [currSong setElapsedTime: mpd_status_get_elapsed_time(mpdStatus)]; [currSong setTotalTime: mpd_status_get_total_time(mpdStatus)]; mpd_song_free(mpdSong); mpd_response_finish(mpdConnection); } mpd_status_free(mpdStatus); if (currSong) { return [currSong autorelease]; } else { return currSong; } } - (int) getCurrentSongNr { int songNr = -1; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return songNr; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { songNr = mpd_status_get_song_pos(mpdStatus)+1; mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } return songNr; } - (int) getPlaylistLength { int length = 0; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return 0; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { length = mpd_status_get_queue_length(mpdStatus); mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } return length; } - (NSArray *) getPlaylist { NSMutableArray *playlist; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return nil; } if(!mpd_send_list_queue_meta(mpdConnection)) { return nil; } struct mpd_song *mpdSong; playlist = [[NSMutableArray alloc] init]; while((mpdSong = mpd_recv_song(mpdConnection)) != NULL) { PlaylistItem *tmpSong; tmpSong = [[self _getPlaylistItemForSong: mpdSong] retain]; [playlist addObject: tmpSong]; [tmpSong release]; mpd_song_free(mpdSong); } mpd_response_finish(mpdConnection); mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { currPlaylistVersion = mpd_status_get_queue_version(mpdStatus); mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); } else { currPlaylistVersion = 0; } return [playlist autorelease]; } - (BOOL) collectionChanged { BOOL retVal = NO; unsigned int tmpArtistsNum = [self _getAllArtistsCount]; unsigned int tmpAlbumsNum = [self _getAllAlbumsCount]; if (tmpArtistsNum != numArtists) { numArtists = tmpArtistsNum; retVal = YES; } if (tmpAlbumsNum != numAlbums) { numAlbums = tmpAlbumsNum; retVal = YES; } return retVal; } - (BOOL) playlistChanged { BOOL changed = NO; struct mpd_status *mpdStatus; if (! [self _checkConnection]) { return NO; } mpdStatus = mpd_run_status(mpdConnection); if (mpdStatus != NULL) { unsigned int version = 0; version = mpd_status_get_queue_version(mpdStatus); mpd_response_finish(mpdConnection); mpd_status_free(mpdStatus); if (version != currPlaylistVersion) { changed = YES; } else { changed = NO; } } return changed; } - (void) shuffleList { if (! [self _checkConnection]) { return; } mpd_run_shuffle(mpdConnection); } - (void) clearPlaylist { if (! [self _checkConnection]) { return; } mpd_run_clear(mpdConnection); } - (void) removeSong: (int)song { if (! [self _checkConnection]) { return; } mpd_run_delete(mpdConnection, song); } - (void) removeSongRange: (NSRange)songRange { if (! [self _checkConnection]) { return; } if (songRange.location != NSNotFound) { mpd_run_delete_range(mpdConnection, songRange.location, songRange.length); } } - (void) addTrack: (NSString *)file { if (! [self _checkConnection]) { return; } mpd_run_add(mpdConnection, [file UTF8String]); } - (void) moveSongNr: (int)song1 to: (int)song2 { if (! [self _checkConnection]) { return; } mpd_run_move(mpdConnection, song1, song2); } - (void) moveSongWithID: (int)song1 to: (int)song2 { if (! [self _checkConnection]) { return; } mpd_run_move_id(mpdConnection, song1, song2); } - (NSArray *) getAllPlaylists { NSMutableArray *tmpArray; struct mpd_entity *mpdInfoEntity; if (! [self _checkConnection]) { return nil; } mpd_send_list_playlists(mpdConnection); tmpArray = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_recv_entity(mpdConnection))) { if(mpd_entity_get_type(mpdInfoEntity) == MPD_ENTITY_TYPE_PLAYLIST) { const struct mpd_playlist *mpdPlaylist = mpd_entity_get_playlist(mpdInfoEntity); [tmpArray addObject: [NSString stringWithUTF8String: mpd_playlist_get_path(mpdPlaylist)]]; } mpd_entity_free(mpdInfoEntity); } mpd_response_finish(mpdConnection); return [tmpArray autorelease]; } - (void) loadPlaylist: (NSString *)title { if (! [self _checkConnection]) { return; } mpd_run_load(mpdConnection, [title cString]); } - (void) savePlaylist: (NSString *)title { if (! [self _checkConnection]) { return; } mpd_run_save(mpdConnection, [title cString]); } - (void) removePlaylist: (NSString *)title { if (! [self _checkConnection]) { return; } mpd_run_rm(mpdConnection, [title cString]); } /* ----------------------- - Collection Commands - -----------------------*/ - (NSArray *) getAllArtists { NSMutableArray *allArtists; struct mpd_pair *pair; if (! [self _checkConnection]) { return nil; } mpd_search_db_tags(mpdConnection, MPD_TAG_ARTIST); mpd_search_commit(mpdConnection); allArtists = [[NSMutableArray alloc] init]; while ((pair = mpd_recv_pair_tag(mpdConnection, MPD_TAG_ARTIST)) != NULL) { [allArtists addObject: pair->value ?[NSString stringWithUTF8String: pair->value]:@""]; mpd_return_pair(mpdConnection, pair); } mpd_response_finish(mpdConnection); return [[allArtists autorelease] sortedArrayUsingFunction: _stringSort context: NULL]; } - (NSArray *) getAllAlbums { NSMutableArray *allAlbums; struct mpd_pair *pair; if (! [self _checkConnection]) { return nil; } mpd_search_db_tags(mpdConnection, MPD_TAG_ALBUM); mpd_search_commit(mpdConnection); allAlbums = [[NSMutableArray alloc] init]; while ((pair = mpd_recv_pair_tag(mpdConnection, MPD_TAG_ALBUM)) != NULL) { [allAlbums addObject: [NSString stringWithUTF8String: pair->value]]; free(pair); } mpd_response_finish(mpdConnection); return [[allAlbums autorelease] sortedArrayUsingFunction: _stringSort context: NULL]; } - (NSArray *) getAllTracksWithMetadata: (BOOL) withMetadata { NSMutableArray *allTracks; struct mpd_entity *mpdEntity; if (! [self _checkConnection]) { return nil; } allTracks = [[NSMutableArray alloc] init]; if (withMetadata) { mpd_send_list_all_meta(mpdConnection, NULL); } else { mpd_send_list_all(mpdConnection, NULL); } while ((mpdEntity = mpd_recv_entity(mpdConnection)) != NULL) { if (mpd_entity_get_type(mpdEntity) == MPD_ENTITY_TYPE_SONG) { const struct mpd_song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpd_entity_get_song(mpdEntity); tmpSong = [[self _getPlaylistItemForSong: mpdSong] retain]; [allTracks addObject: tmpSong]; [tmpSong release]; } mpd_entity_free(mpdEntity); } mpd_response_finish(mpdConnection); return [allTracks autorelease]; } -(NSArray *) getAllFilesInDirectory: (NSString *) directory { NSMutableArray *allFiles; NSArray *allTracks; NSEnumerator *trackEnum; PlaylistItem *song; allFiles = [[NSMutableArray alloc] init]; allTracks = [self getAllTracksWithMetadata: NO]; trackEnum = [allTracks objectEnumerator]; while((song = [trackEnum nextObject]) != nil) { NSString *songDir = [NSString stringWithFormat:@"%@", [[song getPath] stringByDeletingLastPathComponent]]; if ([directory isEqual:songDir]) { [allFiles addObject:[[song getPath] lastPathComponent]]; } } return [allFiles autorelease]; } - (NSArray *) getAlbumsForArtist: (NSString *)artist { #warning FIXME getAllAlbumsForArtist return nil; /* NSMutableArray *allAlbums; char *albumName; if (! [self _doConnect]) { return nil; } mpd_sendListCommand(mpdConnection, MPD_TAG_ALBUM, [artist UTF8String]); if (! [self _checkConnection]) { return nil; } allAlbums = [[NSMutableArray alloc] init]; while ((albumName = mpd_getNextAlbum(mpdConnection)) != NULL) { [allAlbums addObject: [NSString stringWithUTF8String: albumName]]; free(albumName); } mpd_response_finish(mpdConnection); return [[allAlbums autorelease] sortedArrayUsingFunction: _stringSort context:NULL]; */ } - (NSArray *) getAllTracksForArtist: (NSString *)artist { #warning FIXME getAllTracksForArtist return nil; /* NSMutableArray *allTracks; struct mpd_entity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendFindCommand(mpdConnection, MPD_TAG_ARTIST, [artist UTF8String]); if (! [self _checkConnection]) { return nil; } allTracks = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_recv_entity(mpdConnection))) { if(mpd_entity_get_type(mpdInfoEntity) == MPD_ENTITY_TYPE_SONG) { const struct mpd_song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpd_entity_get_song(mpdInfoEntity); tmpSong = [[self _getPlaylistItemForSong: mpdSong] retain]; [allTracks addObject: tmpSong]; [tmpSong release]; } mpd_entity_free(mpdInfoEntity); } mpd_response_finish(mpdConnection); return [allTracks autorelease]; */ } - (NSArray *) getAllTracksForArtist: (NSString *)artist album: (NSString *)album { NSArray *tmpArray; NSMutableArray *allTracks; int i; tmpArray = [[self getAllTracksForArtist: artist] retain]; if (! tmpArray) { return nil; } allTracks = [[NSMutableArray alloc] init]; for (i = 0; i < [tmpArray count]; i++) { if ([[[tmpArray objectAtIndex: i] getAlbum] isEqual: album]) { [allTracks addObject: [tmpArray objectAtIndex: i]]; } } [tmpArray release]; return [allTracks autorelease]; } - (NSArray *) getAllTracksForAlbum: (NSString *)album { #warning FIXME getAllTracksForAlbum return nil; /* NSMutableArray *allTracks; struct mpd_entity *mpdInfoEntity; if (! [self _doConnect]) { return nil; } mpd_sendFindCommand(mpdConnection, MPD_TAG_ALBUM, [album UTF8String]); if (! [self _checkConnection]) { return nil; } allTracks = [[NSMutableArray alloc] init]; while((mpdInfoEntity = mpd_recv_entity(mpdConnection))) { if(mpd_entity_get_type(mpdInfoEntity) == MPD_ENTITY_TYPE_SONG) { const struct mpd_song *mpdSong; PlaylistItem *tmpSong; mpdSong = mpd_entity_get_song(mpdInfoEntity); tmpSong = [[self _getPlaylistItemForSong: mpdSong] retain]; [allTracks addObject: tmpSong]; [tmpSong release]; } mpd_entity_free(mpdInfoEntity); } mpd_response_finish(mpdConnection); return [allTracks autorelease]; */ } - (void) updateCollection { if (! [self _checkConnection]) { return; } mpd_send_update(mpdConnection, ""); mpd_response_finish(mpdConnection); if ([self collectionChanged]) { NSNotification *aNotif; aNotif = [NSNotification notificationWithName: ShownCollectionChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] postNotification: aNotif]; } } - (NSArray *) getAllDirectories { NSMutableArray *allDirs; struct mpd_directory *dir; if (! [self _checkConnection]) { return nil; } allDirs = [[NSMutableArray alloc] init]; mpd_send_list_all(mpdConnection, NULL); while ((dir = mpd_recv_directory(mpdConnection)) != NULL) { const char *tmpdir; tmpdir = mpd_directory_get_path(dir); [allDirs addObject:[NSString stringWithUTF8String:tmpdir]]; mpd_directory_free(dir); } mpd_response_finish(mpdConnection); return [allDirs autorelease]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation MPDController(Private) - (BOOL) _doConnect { char *mpdHost; int mpdPort; unsigned int mpdTimeout; mpdHost = (char *)[host cString]; mpdPort = (int) [port floatValue]; mpdTimeout = (unsigned int) [timeout intValue]; mpdConnection = mpd_connection_new(mpdHost, mpdPort, mpdTimeout); if (mpdConnection == NULL) { NSLog(@"Cannot connect to server: Out of memory"); return NO; } if (password) { mpd_send_password(mpdConnection, (char *)[password cString]); mpd_response_finish(mpdConnection); } if (mpd_connection_get_error(mpdConnection) != MPD_ERROR_SUCCESS) { [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: DidNotConnectNotification object: [NSString stringWithUTF8String: mpd_connection_get_error_message(mpdConnection)]]]; mpd_connection_clear_error(mpdConnection); return NO; } else { [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: DidConnectNotification object: nil]]; return YES; } } - (BOOL) _checkConnection { if (mpd_connection_get_error(mpdConnection) != MPD_ERROR_SUCCESS) { if (mpd_connection_get_error(mpdConnection) == MPD_ERROR_TIMEOUT) { // we are trying to reconnect here // _doConnect will send the notification if it also fails mpd_response_finish(mpdConnection); mpd_connection_clear_error(mpdConnection); mpd_connection_free(mpdConnection); if ([self _doConnect]) { return YES; } } else { mpd_response_finish(mpdConnection); [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: DidNotConnectNotification object: [NSString stringWithUTF8String: mpd_connection_get_error_message(mpdConnection)]]]; mpd_connection_clear_error(mpdConnection); mpd_response_finish(mpdConnection); } return NO; } else { mpd_response_finish(mpdConnection); return YES; } } - (PlaylistItem *) _getPlaylistItemForSong: (const struct mpd_song *)anSong { PlaylistItem *plItem; const char *songArtist = mpd_song_get_tag(anSong,MPD_TAG_ARTIST,0); const char *songTitle = mpd_song_get_tag(anSong,MPD_TAG_TITLE,0); const char *songAlbum = mpd_song_get_tag(anSong,MPD_TAG_ALBUM,0); const char *songTrackNr = mpd_song_get_tag(anSong,MPD_TAG_TRACK,0); const char *songGenre = mpd_song_get_tag(anSong,MPD_TAG_GENRE,0); const char *songDate = mpd_song_get_tag(anSong,MPD_TAG_DATE,0); const char *songComposer = mpd_song_get_tag(anSong,MPD_TAG_COMPOSER,0); const char *songPerformer = mpd_song_get_tag(anSong,MPD_TAG_PERFORMER,0); const char *songDisc = mpd_song_get_tag(anSong,MPD_TAG_DISC,0); const char *songComment = mpd_song_get_tag(anSong,MPD_TAG_COMMENT,0); plItem = [[PlaylistItem alloc] init]; if (songArtist == NULL) { [plItem setArtist: _(@"Unknown Artist")]; } else { [plItem setArtist: [NSString stringWithUTF8String: songArtist]]; } if (songTitle == NULL) { [plItem setTitle: _(@"Unknown Title")]; } else { [plItem setTitle: [NSString stringWithUTF8String: songTitle]]; } if (songAlbum == NULL) { [plItem setAlbum: _(@"Unknown Album")]; } else { [plItem setAlbum: [NSString stringWithUTF8String: songAlbum]]; } if (songGenre == NULL) { [plItem setGenre: _(@"Unknown Genre")]; } else { [plItem setGenre: [NSString stringWithUTF8String: songGenre]]; } if (songDate == NULL) { [plItem setDate: _(@"Unknown")]; } else { [plItem setDate: [NSString stringWithUTF8String: songDate]]; } if (songComposer == NULL) { [plItem setComposer: _(@"No composer info available")]; } else { [plItem setComposer: [NSString stringWithUTF8String: songComposer]]; } if (songPerformer == NULL) { [plItem setPerformer: _(@"No performer info available")]; } else { [plItem setPerformer: [NSString stringWithUTF8String: songPerformer]]; } if (songDisc == NULL) { // if we don't know, we just assume its the first disc [plItem setDisc: _(@"1")]; } else { [plItem setDisc: [NSString stringWithUTF8String: songDisc]]; } if (songComment == NULL) { [plItem setComment: _(@"No Comment")]; } else { [plItem setComment: [NSString stringWithUTF8String: songComment]]; } [plItem setPath: [NSString stringWithUTF8String: mpd_song_get_uri(anSong)]]; if (songTrackNr == NULL) { [plItem setTrackNr: @""]; } else { [plItem setTrackNr: [NSString stringWithUTF8String: songTrackNr]]; } [plItem setTotalTime: mpd_song_get_duration(anSong)]; [plItem setID: mpd_song_get_id(anSong)]; [plItem setPos: mpd_song_get_pos(anSong)]; return [plItem autorelease]; } int _stringSort(id string1, id string2, void *context) { NSString *str1, *str2; str1 = (NSString *) string1; str2 = (NSString *) string2; return [str1 caseInsensitiveCompare: str2]; } - (unsigned int) _getAllArtistsCount { struct mpd_stats *mpdStats; unsigned int artists = 0; if (! [self _checkConnection]) { return artists; } mpdStats = mpd_run_stats(mpdConnection); if (mpdStats != NULL) { artists = mpd_stats_get_number_of_artists(mpdStats); mpd_stats_free(mpdStats); mpd_response_finish(mpdConnection); return artists; } else { return artists; } } - (unsigned int) _getAllAlbumsCount { struct mpd_stats *mpdStats; unsigned int albums = 0; if (! [self _checkConnection]) { return albums; } mpdStats = mpd_run_stats(mpdConnection); if (mpdStats != NULL) { albums = mpd_stats_get_number_of_albums(mpdStats); mpd_stats_free(mpdStats); mpd_response_finish(mpdConnection); return albums; } return albums; } @end MPDCon-1.5.1/NormalFormatter.h0000644000175000017500000000203711716254171016242 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _NORMALFORMATTER_H_ #define _NORMALFORMATTER_H_ #include #include @interface NormalFormatter : NSFormatter { } @end #endif // _NORMALFORMATTER_H_ MPDCon-1.5.1/NormalFormatter.m0000644000175000017500000000354211717236141016247 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2006 Author: Daniel Luederwald Created: 2006-02-22 13:52:30 +0100 by mrsanders This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "NormalFormatter.h" @implementation NormalFormatter - (NSString *) stringForObjectValue: (id) anObject { return anObject; } - (NSAttributedString *)attributedStringForObjectValue: (id) anObject withDefaultAttributes: (NSDictionary *) attr { if (anObject != nil) { NSFont *theFont = [NSFont systemFontOfSize: [NSFont systemFontSize]]; NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString: anObject]; NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithDictionary: attr]; [attrs setObject: theFont forKey: NSFontAttributeName]; if ([aString length]) { [aString setAttributes: attrs range: NSMakeRange(0, [aString length])]; } return [aString autorelease]; } else { NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString: @""]; return [aString autorelease]; } } - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error { *obj = string; } @end MPDCon-1.5.1/OwnTableView.h0000644000175000017500000000177611716254171015505 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_OWNTABLEVIEW_H #define _PCAPPPROJ_OWNTABLEVIEW_H #include #include "Strings.h" @interface OwnTableView : NSTableView { } @end #endif MPDCon-1.5.1/OwnTableView.m0000644000175000017500000000546211716254171015506 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-17 23:17:38 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "OwnTableView.h" @implementation OwnTableView /* -------------------- - Delegate Methods - --------------------*/ - (NSImage*) dragImageForRows: (NSArray*)dragRows event: (NSEvent*)dragEvent dragImageOffset: (NSPoint*)dragImageOffset { return [NSImage imageNamed: @"MoveSong"]; } - (void) selectAll: (id) sender { [super selectAll: sender]; [self setNeedsDisplay: YES]; } - (void) keyDown: (NSEvent *) theEvent { NSString *characters = [theEvent characters]; unichar character = 0; if ([characters length] > 0) { character = [characters characterAtIndex: 0]; } switch (character) { case NSUpArrowFunctionKey: { int row = [self selectedRow]; if (row > 0) { [self selectRow: row-1 byExtendingSelection: NO]; [self scrollRowToVisible: row-1]; } break; } case NSDownArrowFunctionKey: { int row = [self selectedRow]; int maxRow = [self numberOfRows]; if (row < maxRow-1) { [self selectRow: row+1 byExtendingSelection: NO]; [self scrollRowToVisible: row+1]; } break; } case NSHomeFunctionKey: { if ([self numberOfRows] > 0) { [self selectRow: 0 byExtendingSelection: NO]; [self scrollRowToVisible: 0]; } break; } case NSEndFunctionKey: { int rows = [self numberOfRows]; if (rows > 0) { [self selectRow: rows-1 byExtendingSelection: NO]; [self scrollRowToVisible: rows-1]; } break; } case '\r': { [[self target] performSelector: [self doubleAction]]; break; } default: [super keyDown: theEvent]; break; } } @end MPDCon-1.5.1/PlayView.h0000644000175000017500000000324611716254171014671 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Custom View : Shows Trackinfos etc. This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYVIEW_H #define _PCAPPPROJ_PLAYVIEW_H #include #include "PlaylistItem.h" #include "Strings.h" @interface PlayView : NSView { PlaylistItem *dispSong; int currentSong, totalSongs; BOOL displayEnabled; int artistScroll, titleScroll, albumScroll; BOOL artistScrollForward, titleScrollForward, albumScrollForward; BOOL reversedTime; BOOL notificationAdded; } // Display Methods - (void) setDisplaySong: (PlaylistItem *)newSong; - (void) setCurrentSong: (int)newSong; - (void) setTotalSongs: (int)newSong; - (void) setElapsedTime: (int)newTime; - (void) setReversedTime: (BOOL)reversed; - (void) enableDisplay: (BOOL)enable; // Notification Methods - (void) songChanged: (NSNotification *)aNotif; //NSColor *colorFromDict(NSDictionary *dict); @end #endif MPDCon-1.5.1/PlayView.m0000644000175000017500000002265012241155375014676 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Custom View : Shows Trackinfos etc. This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlayView.h" /* --------------------- - Private Interface - ---------------------*/ @interface PlayView(Private) - (NSString *) _getTime; - (void) _drawTrack; - (void) _drawArtist; - (void) _drawAlbum; - (void) _drawTitle; - (void) _drawTime; @end @implementation PlayView /* -------------------------- - Initialization Methods - --------------------------*/ + (id) init { self = [super init]; return self; } - (void) dealloc { [dispSong release]; [super dealloc]; } /* ------------------- - Display Methods - -------------------*/ - (void) drawRect: (NSRect)rect { NSRect myBounds; NSData *colorData; NSColor *displayColor; if (! notificationAdded) { notificationAdded = YES; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(songChanged:) name: PreferencesChangedNotification object: nil]; } colorData = [[NSUserDefaults standardUserDefaults] dataForKey: @"displayColor"]; if (! colorData) { displayColor = [NSColor grayColor]; } else { displayColor = [NSUnarchiver unarchiveObjectWithData: colorData]; } [displayColor set]; myBounds = [self bounds]; [NSBezierPath fillRect: myBounds]; [[NSColor blackColor] set]; NSRect strokeRect = NSMakeRect(myBounds.origin.x, myBounds.origin.y+1, myBounds.size.width-1, myBounds.size.height-1); [NSBezierPath strokeRect: strokeRect]; if (displayEnabled) { [self _drawTrack]; [self _drawArtist]; [self _drawAlbum]; [self _drawTitle]; [self _drawTime]; } else { NSImage *gnustepImage; int bWidth, bHeight, iWidth, iHeight; bWidth = myBounds.size.width; bHeight = myBounds.size.height; gnustepImage = [NSImage imageNamed: @"GNUstep.tiff"]; iWidth = [gnustepImage size].width; iHeight = [gnustepImage size].height; [gnustepImage compositeToPoint: NSMakePoint((bWidth/2.0) - (iWidth/2.0), (bHeight/2.0) - (iHeight/2.0)) fromRect: myBounds operation: NSCompositeSourceOver]; } } - (void) setDisplaySong: (PlaylistItem *)newSong { [dispSong release]; dispSong = [newSong retain]; [self setNeedsDisplay: YES]; } - (void) setCurrentSong: (int)newSong { currentSong = newSong; } - (void) setTotalSongs: (int)newSong { totalSongs = newSong; } - (void) setElapsedTime: (int)newTime { if (dispSong) { [dispSong setElapsedTime: newTime]; } [self setNeedsDisplay: YES]; } - (void) setReversedTime: (BOOL)reversed { reversedTime = reversed; } - (void) enableDisplay: (BOOL)enabled { displayEnabled = enabled; [self setNeedsDisplay: YES]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) songChanged: (NSNotification *)aNotif { artistScroll = 0; titleScroll = 0; albumScroll = 0; artistScrollForward = YES; titleScrollForward = YES; albumScrollForward = YES; [self setNeedsDisplay: YES]; } /* -------------------- - Delegate Methods - --------------------*/ - (void) mouseUp: (NSEvent *)anEvent { if (reversedTime) { reversedTime = NO; } else { reversedTime = YES; } [[NSUserDefaults standardUserDefaults] setBool: reversedTime forKey: @"reversedTime"]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation PlayView(Private) - (NSString *) _getTime { int totalTime, elapsedTime; int tSecs, eSecs; int tMin, eMin; totalTime = [dispSong getTotalTime]; elapsedTime = [dispSong getElapsedTime]; tSecs = (totalTime % 60); tMin = (int)totalTime/60; if (! reversedTime) { eSecs = (elapsedTime % 60); eMin = (int)elapsedTime/60; return [NSString stringWithFormat: @"%d:%02d/%d:%02d" , eMin, eSecs, tMin, tSecs]; } else { eSecs = ((totalTime - elapsedTime) % 60); eMin = (int) (totalTime - elapsedTime) / 60; return [NSString stringWithFormat: @"- %d:%02d/%d:%02d" , eMin, eSecs, tMin, tSecs]; } } - (void) _drawTrack { [[NSString stringWithFormat: _(@"Playing Track %d of %d") , currentSong, totalSongs] drawAtPoint: NSMakePoint(5, 60) withAttributes: nil]; } - (void) _drawArtist { NSString *theArtist; NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; int enableScroll; theArtist = [dispSong getArtist]; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; enableScroll = [[NSUserDefaults standardUserDefaults] integerForKey: @"enableScroll"]; theFont = [NSFont boldSystemFontOfSize: 18]; [attributes setObject: theFont forKey: NSFontAttributeName]; if (([theArtist sizeWithAttributes: attributes].width > myBounds.size.width-10) && enableScroll) { if ([theArtist sizeWithAttributes: attributes].width-artistScroll < myBounds.size.width - 20) { artistScrollForward=NO; } if (artistScroll == 0) { artistScrollForward=YES; } if (artistScrollForward) { artistScroll+=5; } else { artistScroll-=5; } } [theArtist drawAtPoint: NSMakePoint(10-artistScroll, 37) withAttributes: attributes]; } - (void) _drawAlbum { NSString *theAlbum; NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; int enableScroll; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; enableScroll = [[NSUserDefaults standardUserDefaults] integerForKey: @"enableScroll"]; theAlbum = [dispSong getAlbum]; theFont = [NSFont systemFontOfSize: 11]; [attributes setObject: theFont forKey: NSFontAttributeName]; if (([theAlbum sizeWithAttributes: attributes].width > myBounds.size.width-3) && enableScroll) { if ([theAlbum sizeWithAttributes: attributes].width-albumScroll < myBounds.size.width - 10) { albumScrollForward=NO; } if (albumScroll == 0) { albumScrollForward=YES; } if (albumScrollForward) { albumScroll+=5; } else { albumScroll-=5; } } [theAlbum drawAtPoint: NSMakePoint(5-albumScroll, 2) withAttributes: attributes]; } - (void) _drawTitle { NSString *theTitle; NSString *theTrack; NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; int enableScroll; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; enableScroll = [[NSUserDefaults standardUserDefaults] integerForKey: @"enableScroll"]; theTrack = [dispSong getTrackNr]; if ([theTrack compare: @""] != NSOrderedSame) { theTitle = [theTrack stringByAppendingString: [@" - " stringByAppendingString: [dispSong getTitle]]]; } else { theTitle = [dispSong getTitle]; } theFont = [NSFont boldSystemFontOfSize: 13]; [attributes setObject: theFont forKey: NSFontAttributeName]; if (([theTitle sizeWithAttributes: attributes].width > myBounds.size.width-10) && enableScroll) { if ([theTitle sizeWithAttributes: attributes].width-titleScroll < myBounds.size.width - 10) { titleScrollForward=NO; } if (titleScroll == 0) { titleScrollForward=YES; } if (titleScrollForward) { titleScroll+=5; } else { titleScroll-=5; } } [theTitle drawAtPoint: NSMakePoint(10-titleScroll, 22) withAttributes: attributes]; } - (void) _drawTime { NSRect myBounds; NSMutableDictionary *attributes; NSFont *theFont; myBounds = [self bounds]; attributes = [NSMutableDictionary dictionary]; theFont = [NSFont boldSystemFontOfSize: 12]; [attributes setObject: theFont forKey: NSFontAttributeName]; NSString *timeString = [self _getTime]; NSSize timeSize = [timeString sizeWithAttributes: attributes]; [timeString drawAtPoint: NSMakePoint(myBounds.size.width-timeSize.width-2 , 60) withAttributes: attributes]; } /*NSColor *colorFromDict(NSDictionary *dict) { if(dict != nil) { return [NSColor colorWithCalibratedRed: [[dict objectForKey: @"red"] floatValue] green: [[dict objectForKey: @"green"] floatValue] blue: [[dict objectForKey: @"blue"] floatValue] alpha: [[dict objectForKey: @"alpha"] floatValue]]; } return nil; }*/ @end MPDCon-1.5.1/PlaylistController.h0000644000175000017500000000564712047511624017002 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Playlist Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYLISTCONTROLLER_H #define _PCAPPPROJ_PLAYLISTCONTROLLER_H #include #include "MPDController.h" #include "PlaylistItem.h" #include "CollectionController.h" #include "PlaylistsManagerController.h" #include "Strings.h" @interface PlaylistController : NSWindowController { IBOutlet NSTableView *playlistTable; IBOutlet NSTextField *lengthView; IBOutlet NSPopUpButton *playlistSelector; IBOutlet NSPopUpButton *removeSelector; IBOutlet NSWindow *window; IBOutlet NSTextField *filterField; MPDController *mpdController; NSArray *playlist; NSMutableArray *playlistTimes; NSTableColumn *ratingCol; int currentSong; } // Initialization Methods + (id) sharedPlaylistController; // GUI Methods - (void) removeSongs: (id)sender; - (void) managePlaylists: (id)sender; - (void) doubleClicked: (id)sender; - (void) showCurrentSong: (id)sender; - (void) shuffleList: (id)sender; - (void) browseCollection: (id)sender; - (void) filterList: (id)sender; - (void) clearFilter: (id)sender; // some convenience methods - (NSString *) playlistLength; // TableView dataSource Methods - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView; - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(NSInteger) row; // TableView dragging Methods - (NSDragOperation) tableView: (NSTableView *)tv validateDrop: (id )info proposedRow: (NSInteger)row proposedDropOperation: (NSTableViewDropOperation)dropOperation; - (BOOL) tableView: (NSTableView *)tv acceptDrop: (id )info row: (NSInteger)row dropOperation: (NSTableViewDropOperation)dropOperation; - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard; // Notification Methods - (void) songChanged: (NSNotification *)aNotif; - (void) playlistChanged: (NSNotification *)aNotif; - (void) didNotConnect: (NSNotification *)aNotif; @end #endif MPDCon-1.5.1/PlaylistController.m0000644000175000017500000003352712247152712017006 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Playlist Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlaylistController.h" #include "SongRatingCell.h" /* --------------------- - Private Interface - ---------------------*/ @interface PlaylistController(Private) - (void) _doRemove; - (void) _moveRows: (NSArray *)rows atRow: (NSInteger)row; - (void) _addSongs: (NSArray *)paths atRow: (NSInteger)row; - (NSString *) _playlistLength; - (void) _filterListByString: (NSString *)filterString; @end @implementation PlaylistController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedPlaylistController { static PlaylistController *_sharedPlaylistController = nil; if (! _sharedPlaylistController) { _sharedPlaylistController = [[PlaylistController allocWithZone: [self zone]] init]; } return _sharedPlaylistController; } - (id) init { if ((self = [self initWithWindowNibName: @"PlaylistViewer"]) != nil) { [self setWindowFrameAutosaveName: @"PlaylistViewer"]; mpdController = [MPDController sharedMPDController]; [playlist autorelease]; playlist = [[mpdController getPlaylist] retain]; } return self; } - (void) dealloc { [playlist release]; [playlistTimes release]; [ratingCol release]; [super dealloc]; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { NSNotificationCenter *defCenter; SongRatingCell *ratingCell; ASSIGN(ratingCol, [playlistTable tableColumnWithIdentifier: @"rating"]); [playlistTable setAutosaveName: @"PlaylistTable"]; [playlistTable setAutosaveTableColumns: YES]; [playlistTable setTarget: self]; [playlistTable setDoubleAction: @selector(doubleClicked:)]; [playlistTable registerForDraggedTypes: [NSArray arrayWithObjects: PlaylistDragType, CollectionDragType, nil]]; [lengthView setFont: [NSFont systemFontOfSize: 12]]; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [defCenter addObserver: self selector: @selector(playlistChanged:) name: PlaylistChangedNotification object: nil]; [defCenter addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; currentSong = [mpdController getCurrentSongNr]; ratingCell = [[SongRatingCell alloc] init]; [ratingCol setDataCell:ratingCell]; [self playlistChanged: nil]; RELEASE(ratingCell); } - (void) removeSongs: (id)sender { switch ([removeSelector indexOfSelectedItem]) { case 1: [mpdController clearPlaylist]; break; case 2: [self _doRemove]; break; } } - (void) managePlaylists: (id)sender { [[PlaylistsManagerController sharedPLManagerController] showWindow: self]; } - (void) doubleClicked: (id)sender { int row; if ([playlistTable clickedRow] == -1) { return; } row = [playlistTable selectedRow]; [mpdController playSong: [[playlist objectAtIndex: row] getPos]]; } - (void) showCurrentSong: (id)sender { int state; state = [mpdController getState]; if ((state == state_PAUSE) || (state == state_PLAY)) { if (([playlist count] >= currentSong) && ([[playlist objectAtIndex: currentSong -1] getPos] == currentSong -1)) { [playlistTable scrollRowToVisible: currentSong-1]; [playlistTable selectRow: currentSong-1 byExtendingSelection: NO]; } else { NSBeep(); } } } - (void) shuffleList: (id)sender { [mpdController shuffleList]; } - (void) browseCollection: (id)sender { [[CollectionController sharedCollectionController] showWindow: self]; } - (void) filterList: (id)sender { int selectedRow; int selectedPos = -1; selectedRow = [playlistTable selectedRow]; if (selectedRow != -1) { selectedPos = [[playlist objectAtIndex: selectedRow] getPos]; } [self playlistChanged: nil]; if (selectedPos != -1) { int i; for (i = 0; i < [playlist count]; i++) { if ([[playlist objectAtIndex: i] getPos] == selectedPos) { [playlistTable scrollRowToVisible: i]; [playlistTable selectRow: i byExtendingSelection: NO]; break; } } } } - (void) clearFilter: (id)sender { [filterField setStringValue: @""]; [self filterList: sender]; } /* ---------------------------- - some convenience Methods - ---------------------------- */ - (NSString *) playlistLength { return [self _playlistLength]; } /* -------------------------------- - TableView dataSource Methods - --------------------------------*/ - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView { return [playlist count]; } - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(NSInteger)row { NSString *identifier; identifier = [tableColumn identifier]; if ([identifier isEqual: @"pos"]) { return [NSString stringWithFormat: @"%d", [[playlist objectAtIndex: row] getPos]+1]; } else if ([identifier isEqual: @"time"]) { return [playlistTimes objectAtIndex: row]; } else if ([identifier isEqual: @"play"]) { if (([[playlist objectAtIndex: row] getPos] == currentSong-1)) { int mState = [mpdController getState]; if ((mState == state_PAUSE) || (mState == state_PLAY)) { return [NSImage imageNamed: @"Current.tiff"]; } else { return nil; } } else { return nil; } } else { return [[playlist objectAtIndex: row] valueForKey: identifier]; } } /* ------------------------------ - TableView dragging Methods - ------------------------------*/ - (NSDragOperation) tableView: (NSTableView *)tv validateDrop: (id )info proposedRow: (NSInteger)row proposedDropOperation: (NSTableViewDropOperation)dropOperation { NSArray *typeArray; NSString *availableType; NSPasteboard *pboard; NSDragOperation dragOperation; pboard = [info draggingPasteboard]; typeArray = [NSArray arrayWithObjects: PlaylistDragType, CollectionDragType, nil]; availableType = [pboard availableTypeFromArray: typeArray]; dragOperation = NSDragOperationNone; if (availableType) { [tv setDropRow: row dropOperation: NSTableViewDropAbove]; if ([[filterField stringValue] compare: @""] == NSOrderedSame) { if (([availableType isEqualToString: PlaylistDragType]) || ([availableType isEqualToString: CollectionDragType])) { dragOperation = NSDragOperationMove; } } } return dragOperation; } - (BOOL) tableView: (NSTableView *)tv acceptDrop: (id )info row: (NSInteger)row dropOperation: (NSTableViewDropOperation)dropOperation { NSPasteboard *pboard; NSArray *objectsList, *typeArray; NSString *availableType; BOOL accept; pboard = [info draggingPasteboard]; typeArray = [NSArray arrayWithObjects: PlaylistDragType, CollectionDragType, nil]; availableType = [pboard availableTypeFromArray: typeArray]; objectsList = [pboard propertyListForType: availableType]; if ([objectsList count]) { if ([availableType isEqualToString: PlaylistDragType]) { [self _moveRows: objectsList atRow: row]; [tv deselectAll: nil]; } else if ([availableType isEqualToString: CollectionDragType]) { [self _addSongs: objectsList atRow: row]; } accept = YES; } else { accept = NO; } return accept; } - (BOOL) tableView: (NSTableView *)tv writeRows: (NSArray *)rows toPasteboard: (NSPasteboard*)pboard { NSArray *typeArray; BOOL accept; unsigned int count; count = [rows count]; if (count > 0) { accept = YES; typeArray = [NSArray arrayWithObjects: PlaylistDragType, nil]; [pboard declareTypes: typeArray owner: self]; [pboard setPropertyList: rows forType: PlaylistDragType]; } else { accept = NO; } return accept; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) songChanged: (NSNotification *)aNotif { currentSong = [mpdController getCurrentSongNr]; [playlistTable reloadData]; } - (void) playlistChanged: (NSNotification *)aNotif { int j; [playlist release]; playlist = [[mpdController getPlaylist] retain]; if ([[filterField stringValue] compare: @""] != NSOrderedSame) { [self _filterListByString: [filterField stringValue]]; } [lengthView setStringValue: [NSString stringWithFormat: _(@"Playlist Length: %@"), [self _playlistLength]]]; [playlistTimes autorelease]; playlistTimes = [[NSMutableArray alloc] init]; for (j = 0; j < [playlist count]; j++) { int time; int tSecs, tMins; time = [[playlist objectAtIndex: j] getTotalTime]; tSecs = (time % 60); tMins = (int) time/60; [playlistTimes addObject: [NSString stringWithFormat: @"%d:%02d", tMins, tSecs]]; } [playlistTable reloadData]; [playlistTable deselectAll: nil]; currentSong = [mpdController getCurrentSongNr]; [self showCurrentSong: nil]; } - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end /* ------------------- - Private Methods - -------------------*/ @implementation PlaylistController(Private) - (NSString *)_playlistLength { int length = 0; if ([playlist count] != 0) { int i; int tSecs, tMins, tHours; for (i = 0; i < [playlist count]; i++) { length += [[playlist objectAtIndex: i] getTotalTime]; } tSecs = (length % 60); tMins = (int) (length/60) % 60; tHours = (int) length/3600; return [NSString stringWithFormat: _(@"%d:%02d:%02d"), tHours, tMins, tSecs]; } else { return @"0:00:00"; } } - (void) _doRemove { NSIndexSet *selectedRows; NSInteger i; if ([playlistTable numberOfSelectedRows] == [mpdController getPlaylistLength]) { [mpdController clearPlaylist]; return; } selectedRows = [playlistTable selectedRowIndexes]; for (i=[selectedRows lastIndex];i != NSNotFound;i = [selectedRows indexLessThanIndex: i]) { [mpdController removeSong: [[playlist objectAtIndex: i] getPos]]; } [playlistTable deselectAll: self]; } - (void) _moveRows: (NSArray *)rows atRow: (NSInteger)row { NSUInteger i; NSUInteger count = [rows count]; NSUInteger ids[count]; for (i = 0; i < count; i++) { ids[i] = [[playlist objectAtIndex: [[rows objectAtIndex: i] intValue]] getID]; } for (i = 0; i < count; i++) { if ([[rows objectAtIndex: 0] intValue] < row) [mpdController moveSongWithID: ids[i] to: row-1]; else [mpdController moveSongWithID: ids[i] to: row+i]; } [playlistTable reloadData]; } - (void) _addSongs: (NSArray *)songs atRow: (NSInteger)row { NSUInteger i; for (i = 0; i < [songs count]; i++) { [mpdController addTrack: [songs objectAtIndex: i]]; [mpdController moveSongNr: [mpdController getPlaylistLength]-1 to: (row+i)]; } } - (void) _filterListByString: (NSString *) fString { NSMutableArray *tmpArray; NSUInteger i; tmpArray = [[NSMutableArray alloc] init]; for (i = 0; i < [playlist count]; i++) { if ([[[playlist objectAtIndex: i] getArtist] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } else if ([[[playlist objectAtIndex: i] getTitle] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } else if ([[[playlist objectAtIndex: i] getAlbum] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } else if ([[[playlist objectAtIndex: i] getGenre] rangeOfString: fString options: NSCaseInsensitiveSearch].location != NSNotFound) { [tmpArray addObject: [playlist objectAtIndex: i]]; } } [playlist release]; playlist = tmpArray; } -(void) tableView: (NSTableView*) aTableView setObjectValue: (id) anObj forTableColumn: (NSTableColumn*) aTableColumn row: (NSInteger) rowIndex { if (aTableColumn == ratingCol) { id playlistItem; /* We can't keep that as an assertion now, as it can easily fail when * the broken GNUstep NSTableView lets you edit the string value for the cell. */ if ([anObj isKindOfClass: [NSNumber class]] == NO) { NSLog(@"Warning: %@ is not a number value.", anObj); } playlistItem = [playlist objectAtIndex: rowIndex]; [playlistItem setRating: [anObj integerValue]]; } } @end MPDCon-1.5.1/PlaylistInspector.h0000644000175000017500000000375412063140575016623 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: Sebastian Reitenbach Created: 2012-10-31 Playlist Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "MPDController.h" #include "PlaylistController.h" @interface PlaylistInspector : NSWindowController { IBOutlet NSTableView *maxRatingStars; IBOutlet NSTableView *minRatingStars; id currentSongNr; id nrOfSongsInPlaylist; id nrNewSongs; id nrPlayedSongs; id nrOfNewSongsText; id nrOfPlayedSongsText; id playlistPlayingTime; id randomPlaylistFeed; id ratingBasedFeed; id includeUnratedSongs; id maxRatingText; id minRatingText; MPDController *mpdController; PlaylistController *playlistController; NSTableColumn *minRatingCol; NSTableColumn *maxRatingCol; NSUserDefaults *defaults; NSLock *threadlock; } + (id) sharedPlaylistInspector; - (void) updateCurrentSongNr; - (void) updatePlaylistInfo; - (void) updatePlaylistInspector; - (void) songChanged:(NSNotification *)aNotif; // Gui Methods - (void) includeUnratedSongsChanged: (id)sender; - (void) nrOfFutureSongsChanged: (id)sender; - (void) nrOfOldSongsToKeepChanged: (id)sender; - (void) randomPlaylistFeedStateChanged: (id)sender; - (void) ratingBasedFeedStateChanged: (id)sender; - (void) sendRandomPlaylistFeedDefaultsChangedNotification; @end MPDCon-1.5.1/PlaylistInspector.m0000644000175000017500000002502012241155376016621 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: Sebastian Reitenbach Created: 2012-10-31 Playlist Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlaylistInspector.h" #include "SongRatingCell.h" #include "Strings.h" #include "CollectionController.h" @implementation PlaylistInspector + (id) sharedPlaylistInspector { static PlaylistInspector *_sharedPlaylistInspector = nil; if (! _sharedPlaylistInspector) { _sharedPlaylistInspector = [[PlaylistInspector allocWithZone: [self zone]] init]; } return _sharedPlaylistInspector; } - (id) init { if ((self = [self initWithWindowNibName: @"PlaylistInspector"]) != nil) { [self setWindowFrameAutosaveName: @"PlaylistInspector"]; defaults = [NSUserDefaults standardUserDefaults]; mpdController = [MPDController sharedMPDController]; playlistController = [PlaylistController sharedPlaylistController]; threadlock = [NSLock new]; } return self; } - (void) dealloc { [minRatingCol release]; [maxRatingCol release]; [defaults release]; [threadlock release]; [super dealloc]; } /* GUI methods */ - (void) awakeFromNib { NSNotificationCenter *defCenter; SongRatingCell *minRatingCell; SongRatingCell *maxRatingCell; ASSIGN(minRatingCol, [minRatingStars tableColumnWithIdentifier: @"minrating"]); ASSIGN(maxRatingCol, [maxRatingStars tableColumnWithIdentifier: @"maxrating"]); [minRatingStars setAutosaveName: @"MinRatingStarsTable"]; [minRatingStars setAutosaveTableColumns: YES]; [minRatingStars setHeaderView: nil]; [minRatingStars setTarget:self]; [maxRatingStars setAutosaveName: @"MaxRatingStarsTable"]; [maxRatingStars setAutosaveTableColumns: YES]; [maxRatingStars setHeaderView: nil]; [maxRatingStars setTarget:self]; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [defCenter addObserver: self selector: @selector(playlistChanged:) name: PlaylistChangedNotification object: nil]; minRatingCell = [[SongRatingCell alloc] init]; maxRatingCell = [[SongRatingCell alloc] init]; [minRatingCol setDataCell:minRatingCell]; [maxRatingCol setDataCell:maxRatingCell]; [randomPlaylistFeed setState: [defaults integerForKey: @"RandomPlaylistFeed"]]; [ratingBasedFeed setState: [defaults integerForKey: @"RatingBasedFeed"]]; [includeUnratedSongs setState: [defaults integerForKey: @"IncludeUnratedSongs"]]; [nrNewSongs setStringValue: [NSString stringWithFormat:@"%"PRIiPTR, [defaults integerForKey: @"NrOfFutureSongs"]? [defaults integerForKey: @"NrOfFutureSongs"]:20]]; [nrPlayedSongs setStringValue: [NSString stringWithFormat:@"%"PRIiPTR, [defaults integerForKey: @"NrOfOldSongsToKeep"]? [defaults integerForKey: @"NrOfOldSongsToKeep"]:20]]; if (![randomPlaylistFeed state]) { [nrNewSongs setEditable: NO]; [nrPlayedSongs setEditable: NO]; [nrOfNewSongsText setEnabled: NO]; [nrOfPlayedSongsText setEnabled: NO]; [ratingBasedFeed setEnabled:NO]; [minRatingText setEnabled: NO]; [maxRatingText setEnabled: NO]; [includeUnratedSongs setEnabled:NO]; // the stuff below doesn't work like expected, also setEnabled: NO doesn't seem to work either [minRatingCell setEditable: NO]; [maxRatingCell setEditable: NO]; } else { if (![ratingBasedFeed state]) { // the stuff below doesn't work like expected // also setEnabled: NO doesn't seem to work either [minRatingText setEnabled: NO]; [maxRatingText setEnabled: NO]; [minRatingCell setEditable: NO]; [maxRatingCell setEditable: NO]; [includeUnratedSongs setEnabled:NO]; } } [self updatePlaylistInspector]; RELEASE(minRatingCell); RELEASE(maxRatingCell); } - (void) nrOfFutureSongsChanged: (id) sender { [defaults setInteger: [nrNewSongs integerValue] forKey:@"NrOfFutureSongs"]; [defaults synchronize]; [self sendRandomPlaylistFeedDefaultsChangedNotification]; } - (void) nrOfOldSongsToKeepChanged: (id) sender { [defaults setInteger: [nrPlayedSongs integerValue] forKey:@"NrOfOldSongsToKeep"]; [defaults synchronize]; [self sendRandomPlaylistFeedDefaultsChangedNotification]; } - (void) randomPlaylistFeedStateChanged: (id) sender { [defaults setInteger: [randomPlaylistFeed state] forKey:@"RandomPlaylistFeed"]; [defaults synchronize]; [self sendRandomPlaylistFeedDefaultsChangedNotification]; if ([randomPlaylistFeed state]) { [nrNewSongs setEditable: YES]; [nrPlayedSongs setEditable: YES]; [nrOfNewSongsText setEnabled: YES]; [nrOfPlayedSongsText setEnabled: YES]; [ratingBasedFeed setEnabled:YES]; if ([ratingBasedFeed state]) { [minRatingStars setEnabled: YES]; [maxRatingStars setEnabled: YES]; [minRatingText setEnabled: YES]; [maxRatingText setEnabled: YES]; [includeUnratedSongs setEnabled:YES]; } } else { [nrNewSongs setEditable: NO]; [nrPlayedSongs setEditable: NO]; [nrOfNewSongsText setEnabled: NO]; [nrOfPlayedSongsText setEnabled: NO]; [ratingBasedFeed setEnabled:NO]; // the stuff below doesn't work like expected, also setEnabled: NO doesn't seem to work either [maxRatingStars setEnabled: NO]; [minRatingStars setEnabled: NO]; [minRatingText setEnabled: NO]; [maxRatingText setEnabled: NO]; [includeUnratedSongs setEnabled:NO]; } } - (void) ratingBasedFeedStateChanged: (id) sender { [defaults setInteger: [ratingBasedFeed state] forKey:@"RatingBasedFeed"]; [defaults synchronize]; [self sendRandomPlaylistFeedDefaultsChangedNotification]; // the disabling is not working, they seem to be always enabled if ([ratingBasedFeed state]) { [maxRatingStars setEnabled: YES]; [minRatingStars setEnabled: YES]; [minRatingText setEnabled: YES]; [maxRatingText setEnabled: YES]; [includeUnratedSongs setEnabled:YES]; } else { [maxRatingStars setEnabled: NO]; [minRatingStars setEnabled: NO]; [minRatingText setEnabled: NO]; [maxRatingText setEnabled: NO]; [includeUnratedSongs setEnabled:NO]; } } - (void) includeUnratedSongsChanged: (id) sender { [defaults setInteger: [includeUnratedSongs state] forKey:@"IncludeUnratedSongs"]; [defaults synchronize]; [self sendRandomPlaylistFeedDefaultsChangedNotification]; } /* the delegate methods */ - (void) songChanged:(NSNotification *)aNotif { [self updateCurrentSongNr]; } - (void) playlistChanged:(NSNotification *)aNotif { [self updatePlaylistInfo]; } - (void) updateCurrentSongNr { [currentSongNr setStringValue:[NSString stringWithFormat:@"%i", [mpdController getCurrentSongNr]]]; } - (void) updatePlaylistInfo { [playlistPlayingTime setStringValue: [playlistController playlistLength]]; [nrOfSongsInPlaylist setStringValue: [NSString stringWithFormat:@"%i", [mpdController getPlaylistLength]]]; [self updateCurrentSongNr]; } - (void) updatePlaylistInspector { [minRatingStars reloadData]; [maxRatingStars reloadData]; [playlistPlayingTime setStringValue: [playlistController playlistLength]]; [currentSongNr setStringValue:[NSString stringWithFormat:@"%i", [mpdController getCurrentSongNr]]]; [nrOfSongsInPlaylist setStringValue: [NSString stringWithFormat:@"%i", [mpdController getPlaylistLength]]]; return; } - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView { return 1; } - (id) tableView: (NSTableView *) tableView objectValueForTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { NSString *identifier; identifier = [tableColumn identifier]; if ([identifier isEqual:@"minrating"]) { return [NSNumber numberWithInteger: [defaults integerForKey: @"RandomPlaylistMinRating"]]; } else { return [NSNumber numberWithInteger: [defaults integerForKey: @"RandomPlaylistMaxRating"]?[defaults integerForKey: @"RandomPlaylistMaxRating"]:5]; } } // method below doesn't get called, its actually intended // to disable the editing of the rating stars... - (BOOL) tableView: (NSTableView *) tableView shouldEditTableColumn: (NSTableColumn *)aTableColumn row:(NSInteger)rowIndex { if ([randomPlaylistFeed state] && [ratingBasedFeed state]) { return YES; } else { return NO; } } -(void) tableView: (NSTableView *) aTableView setObjectValue: (id) anObj forTableColumn: (NSTableColumn *) aTableColumn row: (NSInteger) rowIndex { if (aTableColumn == minRatingCol) { /* We can't keep that as an assertion now, as it can easily fail when * the broken GNUstep NSTableView lets you edit the string value for the cell. */ if ([anObj isKindOfClass: [NSNumber class]] == NO) { NSLog(@"Warning: %@ is not a number value.", anObj); } [defaults setInteger: [anObj intValue] forKey:@"RandomPlaylistMinRating"]; } else if (aTableColumn == maxRatingCol) { /* We can't keep that as an assertion now, as it can easily fail when * the broken GNUstep NSTableView lets you edit the string value for the cell. */ if ([anObj isKindOfClass: [NSNumber class]] == NO) { NSLog(@"Warning: %@ is not a number value.", anObj); } [defaults setInteger: [anObj intValue] forKey:@"RandomPlaylistMaxRating"]; } [defaults synchronize]; [self sendRandomPlaylistFeedDefaultsChangedNotification]; } - (void) sendRandomPlaylistFeedDefaultsChangedNotification { NSNotification *aNotif; aNotif = [NSNotification notificationWithName: RandomPlaylistFeedDefaultsChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] postNotification: aNotif]; } @end MPDCon-1.5.1/PlaylistItem.h0000644000175000017500000000503412062146661015545 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:53:40 +0200 by flip PlaylistItem This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYLISTITEM_H_ #define _PCAPPPROJ_PLAYLISTITEM_H_ #import #import "SQLiteAdaptor.h" @interface PlaylistItem : NSObject { NSString *artist; NSString *title; NSString *album; NSString *genre; NSString *trackNr; NSString *path; NSString *comment; NSString *date; NSString *composer; NSString *performer; NSString *disc; NSString *lyricsURL; NSString *lyricsText; int elapsedTime; int totalTime; int ID; int pos; SQLiteAdaptor *MPDConDB; NSMutableString *element; } // Accessor Methods - (NSString *) getArtist; - (void) setArtist: (NSString *)newArtist; - (NSString *) getTitle; - (void) setTitle: (NSString *)newTitle; - (NSString *) getAlbum; - (void) setAlbum: (NSString *)newAlbum; - (NSString *) getGenre; - (void) setGenre: (NSString *)newGenre; - (NSString *) getComment; - (void) setComment: (NSString *)newComment; - (NSString *) getDate; - (void) setDate: (NSString *) newDate; - (NSString *) getComposer; - (void) setComposer: (NSString *) newComposer; - (NSString *) getPerformer; - (void) setPerformer: (NSString *) newPerformer; - (NSString *) getDisc; - (void) setDisc: (NSString *) newDisc; - (NSString *) getTrackNr; - (void) setTrackNr: (NSString *)newNr; - (int) getElapsedTime; - (void) setElapsedTime: (int)newTime; - (int) getTotalTime; - (void) setTotalTime: (int)newTime; - (NSString *) getPath; - (void) setPath: (NSString *)newPath; - (int) getID; - (void) setID: (int) newID; - (int) getPos; - (void) setPos: (int) newPos; - (NSInteger) getRating; - (void) setRating: (NSInteger)newRating; - (NSDictionary *) getLyrics; - (void) setLyrics: (NSString *) _lyricsText withURL: (NSString *)_lyricsURL; @end #endif MPDCon-1.5.1/PlaylistItem.m0000644000175000017500000002406612241155376015562 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-14 11:53:40 +0200 by flip PlaylistItem This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "PlaylistItem.h" /* ---------------------- - Private Categories - ----------------------*/ // inspired/stolen from SOPE @interface NSObject(StringBindings) - (NSString *)valueForStringBinding:(NSString *)_key; @end @interface NSString(misc) - (NSString *)stringByReplacingVariablesWithBindings:(id)_bindings; @end @implementation PlaylistItem // MPD itself doesn't provide the ability to retrieve lyrics via the server // have to use external services to provide that ability static NSString *LyricsAPIURL=@"http://lyrics.wikia.com/api.php?func=getSong&artist=$ARTIST$&song=$TITLE$&fmt=xml"; /* -------------------------- - Initialization Methods - --------------------------*/ - (id) init { MPDConDB = [SQLiteAdaptor sharedSQLiteAdaptor]; return self; } - (void) dealloc { [artist release]; [title release]; [album release]; [genre release]; [trackNr release]; [path release]; [comment release]; [composer release]; [date release]; [performer release]; [disc release]; [lyricsText release]; [lyricsURL release]; [super dealloc]; } /* -------------------- - Accessor Methods - --------------------*/ - (NSString *) getArtist { return artist; } - (void) setArtist: (NSString *)newArtist { [artist autorelease]; artist = [newArtist copy]; } - (NSString *) getAlbum { return album; } - (void) setAlbum: (NSString *)newAlbum { [album autorelease]; album = [newAlbum copy]; } - (NSString *) getGenre { return genre; } - (void) setGenre: (NSString *)newGenre { [genre autorelease]; genre = [newGenre copy]; } - (NSString *) getTitle { return title; } - (void) setTitle: (NSString *)newTitle { [title autorelease]; title = [newTitle copy]; } - (NSString *) getTrackNr { return trackNr; } - (void) setTrackNr: (NSString *)newNr { [trackNr autorelease]; trackNr = [newNr copy]; } - (NSString *) getComment { return comment; } - (void) setComment: (NSString *)newComment { [comment autorelease]; comment = [newComment copy]; } - (NSString *) getComposer { return composer; } - (void) setComposer: (NSString *)newComposer { [composer autorelease]; composer = [newComposer copy]; } - (NSString *) getDate { return date; } - (void) setDate: (NSString *)newDate { [date autorelease]; date = [newDate copy]; } - (NSString *) getPerformer { return performer; } - (void) setPerformer: (NSString *)newPerformer { [performer autorelease]; performer = [newPerformer copy]; } - (NSString *) getDisc { return disc; } - (void) setDisc: (NSString *)newDisc { [disc autorelease]; disc = [newDisc copy]; } - (int) getElapsedTime { return elapsedTime; } - (void) setElapsedTime: (int)newTime { elapsedTime = newTime; } - (int) getTotalTime { return totalTime; } - (void) setTotalTime: (int)newTime { totalTime = newTime; } - (NSString *) getPath { return path; } - (void) setPath: (NSString *)newPath { [path autorelease]; path = [newPath copy]; } - (NSInteger) getRating { return [MPDConDB getRatingForFile:path]; } - (void) setRating: (NSInteger)newRating { [MPDConDB setRating: newRating forFile: path]; } - (NSDictionary *) getLyrics { NSDictionary *lyricsDict; NSDictionary *bindings; NSString *requestURL; NSData *result; NSURL *url; NSXMLParser *parser; if ([[self getArtist] isEqual:@"Unknown Artist"] || [[self getTitle] isEqual:@"Unknown Title"]) { lyricsText = [@"No lyrics retrieved for unknown artist or song." copy]; lyricsURL = [@"http://lyrics.wikia.com" copy]; lyricsDict = [[NSDictionary alloc] initWithObjectsAndKeys: lyricsText, @"lyricsText", lyricsURL, @"lyricsURL", nil]; return [lyricsDict autorelease]; } lyricsDict = [MPDConDB getLyricsForFile:path]; if (lyricsDict) return lyricsDict; bindings = [[NSDictionary alloc] initWithObjectsAndKeys: [[self getArtist] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], @"ARTIST", [[self getTitle] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], @"TITLE", nil]; requestURL = [LyricsAPIURL stringByReplacingVariablesWithBindings:bindings]; RELEASE(bindings); url = [NSURL URLWithString:requestURL]; result = [NSData dataWithContentsOfURL:url]; if (result) { parser = [[[NSXMLParser alloc] initWithData:result] autorelease]; [parser setShouldProcessNamespaces:NO]; [parser setShouldReportNamespacePrefixes:NO]; [parser setShouldResolveExternalEntities:NO]; [parser setDelegate:self]; [parser parse]; // if we got something from the web, we save it in the DB if (![lyricsText isEqual:@"Not found"]) { [self setLyrics: lyricsText withURL: lyricsURL]; } } else { lyricsText = [@"unable to connect to lyrics.wikia.com" copy]; lyricsURL = [@"http://lyrics.wikia.com" copy]; } lyricsDict = [[NSDictionary alloc] initWithObjectsAndKeys: lyricsText, @"lyricsText", lyricsURL, @"lyricsURL", nil]; return [lyricsDict autorelease]; } - (void) setLyrics: (NSString *) _lyricsText withURL: (NSString *) _lyricsURL { [MPDConDB setLyrics: _lyricsText withURL: _lyricsURL forFile: path]; } - (void) setID: (int) newID { ID = newID; } - (int) getID { return ID; } - (void) setPos: (int) newPos { pos = newPos; } - (int) getPos { return pos; } /* getLyrics NSXMLParser delegate methods */ - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { element = [NSMutableString string]; } - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"lyrics"]) { lyricsText = [element copy]; } else if ([elementName isEqualToString:@"url"]) { lyricsURL = [element copy]; } } - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(element == nil) { element = [[NSMutableString alloc] init]; } [element appendString:string]; } @end /* ---------------------- - Private Categories - ---------------------*/ @implementation NSObject(StringBindings) - (NSString *)valueForStringBinding:(NSString *)_key { if (_key == nil) return nil; return [self valueForKeyPath:_key]; } @end @implementation NSString(misc) - (NSString *)stringByReplacingVariablesWithBindings:(id)_bindings { NSUInteger len, pos = 0; unichar *wbuf = NULL; NSMutableString *str = nil; str = [self mutableCopy]; len = [str length]; wbuf = malloc(sizeof(unichar) * (len + 4)); [self getCharacters:wbuf]; while (pos < len) { if (pos + 1 == len) /* last entry */ { if (wbuf[pos] == '$') /* found $ without end-char */ { [NSException raise:@"NSStringVariableBindingException" format:@"did not find end of variable for string %@", self]; } break; } if (wbuf[pos] == '$') { if (wbuf[pos + 1] == '$')/* found $$ --> $ */ { [str deleteCharactersInRange:NSMakeRange(pos, 1)]; if (wbuf != NULL) { free(wbuf); wbuf = NULL; } len = [str length]; wbuf = malloc(sizeof(unichar) * (len + 4)); [str getCharacters:wbuf]; } else { NSUInteger startPos = pos; pos += 2; /* wbuf[pos + 1] != '$' */ while (pos < len) { if (wbuf[pos] != '$') pos++; else break; } if (pos == len) /* end of string was reached */ { [NSException raise:@"NSStringVariableBindingException" format:@"did not find end of variable for string %@", self]; } else { NSString *key; NSString *value; key = [[NSString alloc] initWithCharacters:(wbuf + startPos + 1) length:(pos - startPos - 1)]; if ((value = [_bindings valueForStringBinding:key]) == nil) { value = @""; } [key release]; key = nil; [str replaceCharactersInRange: NSMakeRange(startPos, pos - startPos + 1) withString:value]; if (wbuf != NULL) { free(wbuf); wbuf = NULL; } len = [str length]; wbuf = malloc(sizeof(unichar) * (len + 4)); [str getCharacters:wbuf]; pos = startPos - 1 + [value length]; } } } pos++; } if (wbuf != NULL) { free(wbuf); wbuf = NULL; } { id tmp = str; str = [str copy]; [tmp release]; tmp = nil; } return [str autorelease]; } @end /* NSString(misc) */ MPDCon-1.5.1/PlaylistsManagerController.h0000644000175000017500000000354012105450041020434 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip PlaylistsManager Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PLAYLISTSMANAGERCONTROLLER_H #define _PCAPPPROJ_PLAYLISTSMANAGERCONTROLLER_H #include #include "MPDController.h" #include "Strings.h" @interface PlaylistsManagerController : NSWindowController { IBOutlet NSTableView *listView; IBOutlet NSTextField *saveField; IBOutlet NSWindow *window; MPDController *mpdController; NSArray *playlists; } // Initialization Methods + (id) sharedPLManagerController; // Gui Methods - (void) updateLists: (id)sender; - (void) loadList: (id)sender; - (void) saveList: (id)sender; - (void) removeList: (id)sender; // TableView dataSource Methods - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView; - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(NSInteger)row; // Notification Methods - (void) tableViewSelectionDidChange: (NSNotification *)aNotif; - (void) didNotConnect: (NSNotification *)aNotif; @end #endif MPDCon-1.5.1/SQLiteAdaptor.h0000644000175000017500000000300112062146661015571 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Free Software Foundation Author: Sebastian Reitenbach Created: 2012-11-11 11:11:38 +0100 by sebastia This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _SQLITEADAPTOR_H_ #define _SQLITEADAPTOR_H_ #import #import @interface SQLiteAdaptor : NSObject { SQLClient *MPDConDB; } + (id) sharedSQLiteAdaptor; // Song ratings related methods - (void) setRating: (NSInteger) rating forFile: (NSString *) fileName; - (NSInteger) getRatingForFile: (NSString *) fileName; - (NSArray *) getFilesForRatingsInRange: (NSRange) range; // Lyrics related methods - (void) setLyrics: (NSString *) lyricsText withURL: (NSString *) lyricsURL forFile: (NSString *) fileName; - (NSDictionary *) getLyricsForFile: (NSString *) fileName; @end #endif // _SQLITEADAPTOR_H_ MPDCon-1.5.1/PlaylistsManagerController.m0000644000175000017500000000755512241155376020471 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip PlaylistsManager Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PlaylistsManagerController.h" @implementation PlaylistsManagerController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedPLManagerController { static PlaylistsManagerController *_sharedPLManagerController = nil; if (! _sharedPLManagerController) { _sharedPLManagerController = [[PlaylistsManagerController allocWithZone: [self zone]] init]; } return _sharedPLManagerController; } - (id) init { if ((self = [self initWithWindowNibName: @"PlaylistsManager"]) != nil) { [self setWindowFrameAutosaveName: @"PlaylistsManager"]; mpdController = [MPDController sharedMPDController]; } return self; } - (void) dealloc { [playlists release]; [super dealloc]; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [listView setTarget: self]; [listView setDoubleAction: @selector(loadList:)]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; [self updateLists: self]; } - (void) updateLists: (id)sender { [playlists release]; playlists = [[mpdController getAllPlaylists] retain]; [listView deselectAll: self]; [listView reloadData]; } - (void) loadList: (id)sender { if ([listView selectedRow] >= 0) { [mpdController loadPlaylist: [playlists objectAtIndex: [listView selectedRow]]]; } } - (void) saveList: (id)sender { NSString *name; name = [saveField stringValue]; if ([name isEqual: @""]) { return; } if ([playlists containsObject: name]) { NSInteger answer; answer = NSRunAlertPanel(_(@"Playlist exists"), _(@"Overwrite it?"), _(@"Ok"), _(@"Cancel"), nil); if (answer != NSAlertDefaultReturn) { return; } else { [mpdController removePlaylist: name]; } } [mpdController savePlaylist: name]; [saveField setStringValue: @""]; [self updateLists: self]; } - (void) removeList: (id)sender { if ([listView selectedRow] >= 0) { [mpdController removePlaylist: [playlists objectAtIndex: [listView selectedRow]]]; } [self updateLists: self]; } /* -------------------------------- - TableView dataSource Methods - --------------------------------*/ - (NSInteger) numberOfRowsInTableView: (NSTableView *)tableView { return [playlists count]; } - (id) tableView: (NSTableView *)tableView objectValueForTableColumn: (NSTableColumn *)tableColumn row:(NSInteger)row { return [playlists objectAtIndex: row]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) tableViewSelectionDidChange: (NSNotification *)aNotif { if ([listView selectedRow] == -1) { [saveField setStringValue: @""]; } else { [saveField setStringValue: [playlists objectAtIndex: [listView selectedRow]]]; } } - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end MPDCon-1.5.1/PreferencesController.h0000644000175000017500000000300311717236141017423 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Preferences Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_PREFERENCESCONTROLLER_H #define _PCAPPPROJ_PREFERENCESCONTROLLER_H #include #include "Strings.h" @interface PreferencesController : NSWindowController { IBOutlet NSTextField *mpdHost; IBOutlet NSTextField *mpdPort; IBOutlet NSTextField *mpdTimeout; IBOutlet NSSecureTextField *password; IBOutlet NSButton *scrollSwitch; IBOutlet NSButton *usePassword; IBOutlet NSColorWell *colorWell; NSUserDefaults *defaults; } // Initialization Methods + (id) sharedPreferencesController; // Gui Methods - (void) apply: (id)sender; - (void) revert: (id)sender; - (void) usePasswordChanged: (id)sender; @end #endif MPDCon-1.5.1/PreferencesController.m0000644000175000017500000001016512047772253017445 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Preferences Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "PreferencesController.h" @implementation PreferencesController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedPreferencesController { static PreferencesController *_sharedPrefsController = nil; if (! _sharedPrefsController) { _sharedPrefsController = [[PreferencesController allocWithZone: [self zone]] init]; } return _sharedPrefsController; } - (id) init { self = [self initWithWindowNibName: @"Preferences"]; if (self) { [self setWindowFrameAutosaveName: @"Preferences"]; defaults = [NSUserDefaults standardUserDefaults]; } return self; } /* --------------- - Gui Methods - ---------------*/ - (void) awakeFromNib { [self revert: nil]; } - (void) apply: (id)sender { NSNotification *aNotif; if ([mpdHost stringValue] != nil) { [defaults setObject: [mpdHost stringValue] forKey: @"mpdHost"]; } if ([mpdPort stringValue] != nil) { [defaults setObject: [mpdPort stringValue] forKey: @"mpdPort"]; } if ([mpdTimeout stringValue] != nil) { [defaults setObject: [mpdTimeout stringValue] forKey: @"mpdTimeout"]; } if (([password stringValue] != nil) && ([usePassword state] != 0)) { [defaults setObject: [password stringValue] forKey: @"mpdPassword"]; } else { [defaults removeObjectForKey: @"mpdPassword"]; } [defaults setInteger: [usePassword state] forKey: @"usePassword"]; [defaults setInteger: [scrollSwitch state] forKey: @"enableScroll"]; [defaults setObject: [NSArchiver archivedDataWithRootObject: [colorWell color]] forKey: @"displayColor"]; [defaults synchronize]; [[self window] close]; aNotif = [NSNotification notificationWithName: PreferencesChangedNotification object: nil]; [[NSNotificationCenter defaultCenter] postNotification: aNotif]; } - (void) revert: (id)sender { NSData *colorData; [mpdHost setStringValue: [defaults objectForKey: @"mpdHost"]?[defaults objectForKey: @"mpdHost"]:@"localhost"]; [mpdPort setStringValue: [defaults objectForKey: @"mpdPort"]?[defaults objectForKey: @"mpdPort"]:@"6600"]; [mpdTimeout setStringValue: [defaults objectForKey: @"mpdTimeout"]?[defaults objectForKey: @"mpdTimeout"]:@"1500"]; if ([defaults objectForKey: @"mpdPassword"] != nil) { [password setStringValue: [defaults objectForKey: @"mpdPassword"]]; } else { [defaults removeObjectForKey: @"mpdPassword"]; } [scrollSwitch setState: [defaults integerForKey: @"enableScroll"]]; [usePassword setState: [defaults integerForKey: @"usePassword"]]; colorData = [defaults dataForKey: @"displayColor"]; if (colorData != nil) { [colorWell setColor: [NSUnarchiver unarchiveObjectWithData: colorData]]; } [self usePasswordChanged: sender]; } - (void) usePasswordChanged: (id)sender { if ([usePassword state] != 0) { [password setEditable: YES]; [password setEnabled: YES]; [password setBackgroundColor: [NSColor whiteColor]]; [password setSelectable: YES]; } else { [password setEditable: NO]; [password setEnabled: NO]; [password setBackgroundColor: [NSColor lightGrayColor]]; [password setSelectable: NO]; } } @end MPDCon-1.5.1/RandomPlaylistFeed.h0000644000175000017500000000271512063140575016655 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: Sebastian Reitenbach Created: 2012-10-31 Random playlist feeder This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #import "MPDController.h" @interface RandomPlaylistFeed: NSObject { NSUserDefaults *defaults; BOOL randomPlaylistFeed; BOOL ratingBasedFeed; BOOL includeUnratedSongs; NSInteger nrNewSongs; NSInteger nrPlayedSongs; NSInteger maxRating; NSInteger minRating; NSLock *threadLock; // stuff needed for the thread to connect to the MPD Server MPDController *threadMPDController; NSString *host; NSString *port; NSString *pword; NSString *tout; } - (void) updateDefaults:(NSNotification *)aNotif; - (void) songChanged:(NSNotification *)aNotif; - (void) playlistUpdateThread; @end MPDCon-1.5.1/RandomPlaylistFeed.m0000644000175000017500000001462212251634443016663 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: Sebastian Reitenbach Created: 2012-10-31 Playlist Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import "RandomPlaylistFeed.h" #import "MPDController.h" #import "Strings.h" #if defined(NEED_BSD_H) #include #endif @implementation RandomPlaylistFeed - (id) init { NSNotificationCenter *defCenter; if ((self = [super init]) != nil) { defaults = [NSUserDefaults standardUserDefaults]; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [defCenter addObserver: self selector: @selector(updateDefaults:) name: RandomPlaylistFeedDefaultsChangedNotification object: nil]; threadLock = [NSLock new]; [self updateDefaults: nil]; // setup the connection to MPD for the thread threadMPDController = [[MPDController alloc] init]; host = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdHost"]; port = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdPort"]; tout = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdTimeout"]; pword = nil; if ([[NSUserDefaults standardUserDefaults] integerForKey: @"usePassword"] != 0) { pword = [[NSUserDefaults standardUserDefaults] objectForKey: @"mpdPassword"]; } [threadMPDController connectToServer:host port:port password:pword timeout:tout]; [self songChanged:nil]; } return self; } - (void) dealloc { [defaults release]; [threadLock release]; [threadMPDController release]; [host release]; [port release]; [pword release]; [tout release]; [super dealloc]; } // Notification methods - (void) updateDefaults:(NSNotification *)aNotif { randomPlaylistFeed = [defaults boolForKey: @"RandomPlaylistFeed"]; ratingBasedFeed = [defaults boolForKey: @"RatingBasedFeed"]; includeUnratedSongs = [defaults boolForKey: @"IncludeUnratedSongs"]; nrNewSongs = [defaults integerForKey: @"NrOfFutureSongs"] ? [defaults integerForKey: @"NrOfFutureSongs"]:20; nrPlayedSongs = [defaults integerForKey: @"NrOfOldSongsToKeep"] ? [defaults integerForKey: @"NrOfOldSongsToKeep"]:20; maxRating = [defaults integerForKey: @"RandomPlaylistMaxRating"] ? [defaults integerForKey: @"RandomPlaylistMaxRating"]:5; minRating = [defaults integerForKey: @"RandomPlaylistMinRating"]; } - (void) songChanged:(NSNotification *)aNotif { if ([defaults integerForKey: @"RandomPlaylistFeed"]) { [NSThread detachNewThreadSelector: @selector (playlistUpdateThread) toTarget: self withObject: nil]; } } - (void) playlistUpdateThread { NSAutoreleasePool *pool; NSArray *allSongs; NSArray *currentPlaylist; int diffOldSongs, diffFutureSongs; int nrOfSongsInPlaylist, currentSongNr; if (![threadLock tryLock]) { return; } pool = [NSAutoreleasePool new]; currentPlaylist = [[threadMPDController getPlaylist] copy]; allSongs = [[threadMPDController getAllTracksWithMetadata: NO] copy]; nrOfSongsInPlaylist = [threadMPDController getPlaylistLength]; currentSongNr = [threadMPDController getCurrentSongNr]; if (!allSongs) { NSLog(@"unable to get allSongs from the Collection!!!"); [threadLock unlock]; [allSongs release]; [currentPlaylist release]; [pool release]; return; } diffFutureSongs = nrOfSongsInPlaylist - currentSongNr; if (diffFutureSongs < nrNewSongs) { int i; for (i=0;i maxRating) { if (rating == 0 && includeUnratedSongs == YES) { addThisTrack = YES; } else { addThisTrack = NO; } } [newItem release]; } if (addThisTrack == NO) { continue; } [threadMPDController addTrack:trackFilename]; RELEASE(trackFilename); newAdded = YES; } } } diffOldSongs = currentSongNr - nrPlayedSongs; if (diffOldSongs > 0) { NSRange songRange = NSMakeRange(0, diffOldSongs - 1); [threadMPDController removeSongRange:songRange]; } [allSongs autorelease]; [currentPlaylist autorelease]; [pool release]; [threadLock unlock]; } @end MPDCon-1.5.1/SQLiteAdaptor.m0000644000175000017500000001356212241155377015616 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Free Software Foundation Author: Sebastian Reitenbach Created: 2012-11-11 11:11:38 +0100 by sebastia This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import "SQLiteAdaptor.h" static NSString* SongRatingStorageDirectory = nil; @interface SQLiteAdaptor(Private) -(NSString *)_getMPDConDBName; @end @implementation SQLiteAdaptor(Private) -(NSString *)_getMPDConDBName { if (SongRatingStorageDirectory == nil) { NSFileManager* manager; BOOL isDir, exists; NSString *storagePath; storagePath = [NSSearchPathForDirectoriesInDomains (NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; storagePath = [storagePath stringByAppendingPathComponent: [[NSProcessInfo processInfo] processName]]; storagePath = [NSString stringWithFormat:@"%@", storagePath]; ASSIGN(SongRatingStorageDirectory, storagePath); manager = [NSFileManager defaultManager]; exists = [manager fileExistsAtPath: SongRatingStorageDirectory isDirectory: &isDir]; if (exists) { if (isDir == NO) { [[NSException exceptionWithName: @"SongRatingStorageDirectoryIsNotADirectory" reason: @"The storage directory for song ratings is not a directory." userInfo: nil] raise]; } } else { if ([manager createDirectoryAtPath: SongRatingStorageDirectory attributes: nil] == NO) { [[NSException exceptionWithName: @"SongRatingsStorageDirectoryCreationFailed" reason: @"Creation of the storage directory for song ratings failed." userInfo: nil] raise]; } } } return [NSString stringWithFormat:@"%@/MPDCon.sqlite3", SongRatingStorageDirectory]; } @end @implementation SQLiteAdaptor + (id) sharedSQLiteAdaptor { static SQLiteAdaptor *_sharedSQLiteAdaptor = nil; if (! _sharedSQLiteAdaptor) { _sharedSQLiteAdaptor = [[SQLiteAdaptor allocWithZone: [self zone]] init]; } return _sharedSQLiteAdaptor; } - (id) init { NSUserDefaults *defs; defs = [NSUserDefaults standardUserDefaults]; [defs registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys: [NSDictionary dictionaryWithObjectsAndKeys: [NSDictionary dictionaryWithObjectsAndKeys: [self _getMPDConDBName], @"Database", @"", @"User", @"", @"Password", @"SQLite", @"ServerType", nil], @"MPDCon", nil], @"SQLClientReferences", nil] ]; MPDConDB = [[SQLClient clientWithConfiguration: nil name: @"MPDCon"] retain]; //[MPDConDB setDurationLogging: 0]; [MPDConDB execute: @"CREATE TABLE IF NOT EXISTS SongRatings ( " @"fileName CHAR(1024) PRIMARY KEY, " @"rating INTEGER)", nil]; [MPDConDB execute: @"CREATE TABLE IF NOT EXISTS SongLyrics ( " @"fileName CHAR(1024) PRIMARY KEY, " @"lyricsText CHAR(1024), ", @"lyricsURL CHAR(1024) )", nil]; return self; } - (void) dealloc { [MPDConDB disconnect]; [MPDConDB release]; [super dealloc]; } - (void) setRating: (NSInteger) rating forFile: (NSString *) fileName { NSString *query; query = [NSString stringWithFormat:@"INSERT OR REPLACE INTO \ SongRatings(fileName, rating) values(%@, %"PRIiPTR")", [MPDConDB quoteString:fileName], rating]; [MPDConDB execute: query, nil]; } - (NSInteger) getRatingForFile: (NSString *) fileName { NSString *query; NSMutableArray *records; SQLRecord *record; NSInteger rating = 0; query = [NSString stringWithFormat:@"SELECT rating FROM SongRatings WHERE fileName=%@", [MPDConDB quoteString:fileName]]; records = [MPDConDB query: query, nil]; // we search for the primary key, so we should find exactly one if ([records count] == 1) { record = [records objectAtIndex:0]; rating = [[record objectAtIndex:0] integerValue]; } return rating; } - (NSArray *) getFilesForRatingsInRange: (NSRange) range { NSArray * ratingsArray; ratingsArray = [[NSArray alloc] init]; return AUTORELEASE(ratingsArray); } - (void) setLyrics: (NSString *) lyricsText withURL: (NSString *) lyricsURL forFile: (NSString *) fileName { NSString *query; query = [NSString stringWithFormat:@"INSERT OR REPLACE INTO \ SongLyrics(fileName, lyricsText, lyricsURL) values(%@, %@, %@)", [MPDConDB quoteString: fileName], [MPDConDB quoteString: lyricsText], [MPDConDB quoteString: lyricsURL]]; [MPDConDB execute: query, nil]; } - (NSDictionary *) getLyricsForFile: (NSString *) fileName { NSString *query; NSMutableArray *records; SQLRecord *record; NSString *lyricsText, *lyricsURL; NSDictionary *result = nil; query = [NSString stringWithFormat:@"SELECT lyricsText, lyricsURL FROM SongLyrics \ WHERE fileName=%@", [MPDConDB quoteString: fileName]]; records = [MPDConDB query: query, nil]; // we search for the primary key, so we should find exactly one if ([records count] == 1) { record = [records objectAtIndex:0]; lyricsText = [record objectAtIndex:0]; lyricsURL = [record objectAtIndex:1]; result = [NSDictionary dictionaryWithObjectsAndKeys: lyricsText, @"lyricsText", lyricsURL, @"lyricsURL", nil]; } return result; } @end MPDCon-1.5.1/SongInspector.h0000644000175000017500000000224312056712002015710 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: sebastian Reitenbach Created: 2012-09-02 Lyrics Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "MPDController.h" @interface SongInspector : NSWindowController { id album; id artist; id composer; id date; id disc; id genre; id filename; id comment; id performer; id title; id track; MPDController *mpdController; } + (id) sharedSongInspector; - (void) updateSongInfo; @end MPDCon-1.5.1/SongInspector.m0000644000175000017500000000472712241155377015742 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2012 Author: sebastian Reitenbach Created: 2012-09-02 Lyrics Inspector This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "SongInspector.h" #include "PlaylistItem.h" @implementation SongInspector + (id) sharedSongInspector { static SongInspector *_sharedSongInspector = nil; if (! _sharedSongInspector) { _sharedSongInspector = [[SongInspector allocWithZone: [self zone]] init]; } return _sharedSongInspector; } - (id) init { if ((self = [self initWithWindowNibName: @"SongInspector"]) != nil) { [self setWindowFrameAutosaveName: @"SongInspector"]; mpdController = [MPDController sharedMPDController]; } return self; } /* GUI methods */ - (void) awakeFromNib { NSNotificationCenter *defCenter; defCenter = [NSNotificationCenter defaultCenter]; [defCenter addObserver: self selector: @selector(songChanged:) name: SongChangedNotification object: nil]; [self updateSongInfo]; } /* the delegate methods */ - (void) songChanged:(NSNotification *)aNotif { [self updateSongInfo]; } - (void) updateSongInfo { PlaylistItem *currentSong; currentSong = [mpdController getCurrentSong]; [artist setStringValue:[currentSong getArtist]]; [title setStringValue:[currentSong getTitle]]; [album setStringValue:[currentSong getAlbum]]; [genre setStringValue:[currentSong getGenre]]; [track setStringValue:[currentSong getTrackNr]]; [filename setStringValue:[currentSong getPath]]; [date setStringValue:[currentSong getDate]]; [composer setStringValue:[currentSong getComposer]]; [performer setStringValue:[currentSong getPerformer]]; [disc setStringValue:[currentSong getDisc]]; [comment setStringValue:[currentSong getComment]]; } @end MPDCon-1.5.1/SongRatingCell.h0000644000175000017500000000216612043454773016010 0ustar sebastiasebastia/* MPDCon Copyright (C) 2006, 2007 Guenther Noack Copyright (C) 2009 GNUstep Application Team Riccardo Mottola Adapted from Grr GNRatingCell.h This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import #import @interface SongRatingCell : NSCell { double rating; NSRect _currentTrackingRect; NSImage* star; NSButton* button; } @end MPDCon-1.5.1/SongRatingCell.m0000644000175000017500000001213612043454773016013 0ustar sebastiasebastia/* MPDCon Copyright (C) 2006, 2007 Guenther Noack Copyright (C) 2009 GNUstep Application Team Riccardo Mottola Adapted from Grr GNRatingCell.m This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #import "SongRatingCell.h" #ifdef __APPLE__ #import "GNUstep.h" #endif /** * This cell shows a rating displayed as 0 to 5 horizontally aligned stars. You can * modify the rating by clicking the desired position of the rightmost star. A click * left or right beyond the borders of the rectangle that would surround five stars * sets the number of stars to the maximum 5 or the minimum 0. * */ @implementation SongRatingCell // ---------------------------------------------------------------- // initializers // ---------------------------------------------------------------- -(id) initTextCell: (NSString*) text { return [self initImageCell: [NSImage imageNamed: @"Star"]]; } -(id) initImageCell: (NSImage*) image { if ((self = [super initImageCell: image]) != nil) { ASSIGN(star, image); } return self; } // ---------------------------------------------------------------- // mouse tracking // ---------------------------------------------------------------- -(BOOL) trackMouse: (NSEvent*) theEvent inRect: (NSRect) cellFrame ofView: (NSView*) controlView untilMouseUp: (BOOL) flag { // Just remember the rect of the cell, then go on with tracking // and wait for the call to stopTracking:at:inView:mouseIsUp: _currentTrackingRect = cellFrame; return [super trackMouse: theEvent inRect: cellFrame ofView: controlView untilMouseUp: flag]; } - (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView { return YES; } -(void) stopTracking: (NSPoint)lastPoint at: (NSPoint)stopPoint inView: (NSView*)aView mouseIsUp: (BOOL)isUpFlag { if (isUpFlag) { NSSize size = [star size]; // The field _currentTrackingRect is set by the trackMouse:inRect:ofView:untilMouseUp: // method before it calls the stopTracking:at:inView:mouseIsUp: (this) method. At the // moment I just trust nobody will call stopTracking:... manually. float leftestStarX = NSMidX(_currentTrackingRect) - size.width * 2.5; float rightestStarX = leftestStarX + size.width * 5.0; if (stopPoint.x <= leftestStarX) { [self setIntValue: 0]; } else if (stopPoint.x <= rightestStarX) { float res = ((stopPoint.x - leftestStarX) / size.width) + 1.0; [self setFloatValue: res]; } else { [self setIntValue: 5]; } } } // ---------------------------------------------------------------- // GNUstep workaround for buggy NSTableView behaviour // ---------------------------------------------------------------- #ifdef GNUSTEP /* * According to Matt Rice, switching off editability for a cell * lets the mouse tracking still work. As long as the table column * is still editable, updating changed table cells works, too. * This is undefined behaviour, though, and may not work in future * releases of GNUstep. * * This doesn't work for me on GNUstep stable in Nov 2006. It's * probably different for the SVN version. */ -(BOOL) isEditable { return NO; } #endif // ---------------------------------------------------------------- // drawing // ---------------------------------------------------------------- -(void) drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView*)controlView { NSSize size; NSPoint position; int i; int num; if (star == nil) { // init didn't take place, let's do something about it fast! ASSIGN(star, [NSImage imageNamed: @"Star"]); } size = [star size]; position.x = MAX(NSMidX(cellFrame) - (size.width * 2.5), 0.0); position.y = MAX(NSMidY(cellFrame) - (size.height / 2.0), 0.0); if ([controlView isFlipped]) { position.y += size.height; } num = [self intValue]; for (i=0; i #include "StatisticsItem.h" #include "MPDController.h" #include "Strings.h" @interface StatisticsController : NSWindowController { IBOutlet NSTextField *songs; IBOutlet NSTextField *artists; IBOutlet NSTextField *albums; IBOutlet NSTextField *uptime; IBOutlet NSTextField *playtime; IBOutlet NSTextField *dbPlaytime; IBOutlet NSTextField *dbUpdatetime; IBOutlet NSTextField *window; } // Initialization Methods + (id) sharedStatisticsController; // Gui Methods - (void) closeWindow: (id)sender; - (void) updateStatistics: (id)sender; // Notification Methods - (void) didNotConnect: (NSNotification *)aNotif; @end #endif MPDCon-1.5.1/StatisticsController.m0000644000175000017500000000630112061576030017322 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip Statistics Controller This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include "StatisticsController.h" @implementation StatisticsController /* -------------------------- - Initialization Methods - --------------------------*/ + (id) sharedStatisticsController { static StatisticsController *_sharedStatisticsController = nil; if (! _sharedStatisticsController) { _sharedStatisticsController = [[StatisticsController allocWithZone: [self zone]] init]; } return _sharedStatisticsController; } - (id) init { self = [self initWithWindowNibName: @"StatisticsViewer"]; if (self) { [self setWindowFrameAutosaveName: @"StatisticsViewer"]; } return self; } /* --------------- - Gui Methods - ---------------*/ - (void) closeWindow: (id)sender { [[self window] performClose: self]; } - (void) updateStatistics: (id)sender { StatisticsItem *statItem; int secs, mins, hours; statItem = [[[MPDController sharedMPDController] getStatistics] retain]; [songs setIntValue: [statItem getNumberOfSongs]]; [artists setIntValue: [statItem getNumberOfArtists]]; [albums setIntValue: [statItem getNumberOfAlbums]]; secs = [statItem getUptime] % 60; mins = ((int) [statItem getUptime] / 60) % 60; hours = (int) [statItem getUptime] / 3600; [uptime setStringValue: [NSString stringWithFormat: @"%d:%02d:%02d", hours, mins, secs]]; [dbUpdatetime setStringValue: [[NSDate dateWithTimeIntervalSince1970: [statItem getDbUpdatetime]] description]]; secs = [statItem getPlaytime] % 60; mins = ((int) [statItem getPlaytime] / 60) % 60; hours = (int) [statItem getPlaytime] / 3600; [playtime setStringValue: [NSString stringWithFormat: @"%d:%02d:%02d", hours, mins, secs]]; secs = [statItem getDbPlaytime] % 60; mins = ((int) [statItem getDbPlaytime] / 60) % 60; hours = (int) [statItem getDbPlaytime] / 3600; [dbPlaytime setStringValue: [NSString stringWithFormat: @"%d:%02d:%02d", hours, mins, secs]]; [statItem release]; } - (void) awakeFromNib { [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(didNotConnect:) name: DidNotConnectNotification object: nil]; [self updateStatistics: self]; } /* ------------------------ - Notification Methods - ------------------------*/ - (void) didNotConnect: (NSNotification *)aNotif { [[self window] performClose: self]; } @end MPDCon-1.5.1/StatisticsItem.h0000644000175000017500000000314611716254175016105 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-17 23:17:38 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _PCAPPPROJ_STATISTICSITEM_H_ #define _PCAPPPROJ_STATISTICSITEM_H_ #include @interface StatisticsItem : NSObject { int numberOfSongs; int numberOfArtists; int numberOfAlbums; int uptime; int playtime; int dbUpdatetime; int dbPlaytime; } // Accessor Methods - (int) getNumberOfSongs; - (void) setNumberOfSongs: (int)newSongs; - (int) getNumberOfArtists; - (void) setNumberOfArtists: (int)newArtists; - (int) getNumberOfAlbums; - (void) setNumberOfAlbums: (int)newAlbums; - (int) getUptime; - (void) setUptime: (int)newUptime; - (int) getPlaytime; - (void) setPlaytime: (int)newPlaytime; - (int) getDbUpdatetime; - (void) setDbUpdatetime: (int)newDbUpdatetime; - (int) getDbPlaytime; - (void) setDbPlaytime: (int)newDbPlaytime; @end #endif MPDCon-1.5.1/StatisticsItem.m0000644000175000017500000000351611716254175016113 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-17 23:17:38 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include "StatisticsItem.h" @implementation StatisticsItem /* -------------------- - Accessor Methods - --------------------*/ - (int) getNumberOfSongs { return numberOfSongs; } - (void) setNumberOfSongs: (int)newSongs { numberOfSongs = newSongs; } - (int) getNumberOfArtists { return numberOfArtists; } - (void) setNumberOfArtists: (int)newArtists; { numberOfArtists = newArtists; } - (int) getNumberOfAlbums { return numberOfAlbums; } - (void) setNumberOfAlbums: (int)newAlbums { numberOfAlbums = newAlbums; } - (int) getUptime { return uptime; } - (void) setUptime: (int)newUptime { uptime = newUptime; } - (int) getPlaytime { return playtime; } - (void) setPlaytime: (int)newPlaytime { playtime = newPlaytime; } - (int) getDbUpdatetime { return dbUpdatetime; } - (void) setDbUpdatetime: (int)newDbUpdatetime { dbUpdatetime = newDbUpdatetime; } - (int) getDbPlaytime { return dbPlaytime; } - (void) setDbPlaytime: (int)newDbPlaytime { dbPlaytime = newDbPlaytime; } @end MPDCon-1.5.1/Strings.h0000644000175000017500000000344212061433265014555 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-06-03 12:54:16 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #ifndef _OWNSTRINGS_H_ #define _OWNSTRINGS_H_ static NSString *PlaylistDragType = @"PlaylistDragType"; static NSString *CollectionDragType = @"CollectionDragType"; static NSString *PlaylistChangedNotification = @"PlaylistChangedNotification"; static NSString *SongChangedNotification = @"SongChangedNotification"; static NSString *ShownCollectionChangedNotification = @"ShownCollectionChangedNotification"; static NSString *DidNotConnectNotification = @"DidNotConnectNotification"; static NSString *DidConnectNotification = @"DidConnectNotification"; static NSString *PreferencesChangedNotification = @"PreferencesChangedNotification"; static NSString *GetTracksNotification = @"GetTracksNotification"; static NSString *TracksSendNotification = @"TracksSendNotification"; static NSString *KeyEventNotification = @"KeyEventNotification"; static NSString *RandomPlaylistFeedDefaultsChangedNotification = @"RandomPlaylistFeedDefaultsChangedNotification"; #endif // _OWNSTRINGS_H_ MPDCon-1.5.1/main.m0000644000175000017500000000170311716254200014047 0ustar sebastiasebastia/* Project: MPDCon Copyright (C) 2004 Author: Daniel Luederwald Created: 2004-05-12 17:59:14 +0200 by flip This application is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include int main(int argc, const char *argv[]) { return NSApplicationMain (argc, argv); } MPDCon-1.5.1/MPDCon.pcproj/0000755000175000017500000000000012247130444015323 5ustar sebastiasebastiaMPDCon-1.5.1/MPDCon.pcproj/PC.project0000644000175000017500000000674412251635000017221 0ustar sebastiasebastia{ APPLICATIONICON = "MPDCon.tiff"; "APP_DOCUMENT_BASED" = NO; "APP_TYPE" = GORM; "BUILDER_TARGETS" = ( all, install, uninstall, clean, distclean, dist ); "BUILDER_VERBOSE" = YES; BUILDTOOL = "/usr/local/bin/gmake"; "CLASS_FILES" = ( "AppController.m", "PreferencesController.m", "PlayView.m", "PlaylistController.m", "MPDController.m", "PlaylistItem.m", "CollectionController.m", "PlaylistsManagerController.m", "StatisticsController.m", "StatisticsItem.m", "CrossfadeController.m", "OwnTableView.m", "BoldCell.m", "BoldFormatter.m", "NormalFormatter.m", "LyricsInspector.m", "SongInspector.m", "SongRatingCell.m", "PlaylistInspector.m", "SQLiteAdaptor.m", "RandomPlaylistFeed.m", "CollectionBrowser.m" ); COMPILEROPTIONS = ""; CPPOPTIONS = ""; "CREATION_DATE" = "2004-05-12 17:59:14 +0200"; "DOCU_FILES" = ( Install, COPYING ); FRAMEWORKS = ( ); "HEADER_FILES" = ( "AppController.h", "PreferencesController.h", "PlayView.h", "PlaylistController.h", "MPDController.h", "PlaylistItem.h", "CollectionController.h", "PlaylistsManagerController.h", "StatisticsController.h", "StatisticsItem.h", "CrossfadeController.h", "OwnTableView.h", "Strings.h", "BoldCell.h", "BoldFormatter.h", "NormalFormatter.h", "LyricsInspector.h", "SongInspector.h", "SongRatingCell.h", "PlaylistInspector.h", "RatingStarView.h", "RatingStarViewController.h", "SQLiteAdaptor.h", "RandomPlaylistFeed.h", "CollectionBrowser.h" ); IMAGES = ( "Play.tiff", "Pause.tiff", "Next.tiff", "Prev.tiff", "Stop.tiff", "GNUstep.tiff", "Repeat.tiff", "Shuffle.tiff", "Playlist.tiff", "Crossfade.tiff", "MPDCon.tiff", "MoveSong.tiff", "Current.tiff", "Star.tiff" ); INSTALLDIR = "$(HOME)"; INTERFACES = ( "Player.gorm", "Preferences.gorm", "PlaylistViewer.gorm", "Collection.gorm", "PlaylistsManager.gorm", "StatisticsViewer.gorm", "CrossfadeView.gorm", "LyricsInspector.gorm", "SongInspector.gorm", "PlaylistInspector.gorm", "CollectionBrowser.gorm" ); LANGUAGE = English; LIBRARIES = ( "gnustep-base", "gnustep-gui" ); LINKEROPTIONS = "-L/usr/local/lib -lmpdclient -lSQLClient"; "LOCALIZED_RESOURCES" = ( ); MAININTERFACE = "Player.gorm"; MAKEFILEDIR = "$(GNUSTEP_MAKEFILES)"; "OBJC_COMPILEROPTIONS" = ""; "OTHER_FILES" = ( ); "OTHER_RESOURCES" = ( ); "OTHER_SOURCES" = ( "main.m" ); "PRINCIPAL_CLASS" = NSApplication; "PROJECT_AUTHORS" = ( "The GAP Team", "Daniel Luederwald " ); "PROJECT_COPYRIGHT" = "Copyright (C) 2013 GAP Team, 2004-06 Daniel Luederwald"; "PROJECT_COPYRIGHT_DESC" = "Released under the GNU General Public License 2.0 or later"; "PROJECT_CREATOR" = "Daniel Luederwald"; "PROJECT_DESCRIPTION" = "GNUstep Client for MPD"; "PROJECT_DOCUMENTEXTENSIONS" = ( ); "PROJECT_DOCUMENTTYPES" = ( ); "PROJECT_GROUP" = "No group avaliable!"; "PROJECT_MAINTAINER" = "Daniel Luederwald"; "PROJECT_NAME" = MPDCon; "PROJECT_RELEASE" = "1.5.1"; "PROJECT_SOURCE" = "%{gs_name}-%{gs_version}.tar.gz"; "PROJECT_SUMMARY" = "No summary avaliable!"; "PROJECT_TYPE" = Application; "PROJECT_URL" = "http://gap.nongnu.org/mpdcon"; "PROJECT_VERSION" = "0.1"; "SEARCH_HEADER_DIRS" = ( ); "SEARCH_LIB_DIRS" = ( ); SUBPROJECTS = ( ); "SUPPORTING_FILES" = ( "MPDConInfo.plist" ); "USER_LANGUAGES" = ( AmericanEnglish, English ); } MPDCon-1.5.1/Resources/0000755000175000017500000000000012244352107014720 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/Collection.gorm/0000755000175000017500000000000012244352107017756 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/Collection.gorm/data.classes0000644000175000017500000000134311716254203022250 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; BoldCell = { Actions = ( ); Outlets = ( ); Super = NSTextFieldCell; }; CollectionController = { Actions = ( "addSelected:", "updateCollection:", "selectionChanged:", "doubleClicked:", "filterCollection:", "clearFilter:" ); Outlets = ( collectionView, trackView, filterField ); Super = NSWindowController; }; FirstResponder = { Actions = ( "addSelected:", "doubleClicked:", "filterCollection:", "clearFilter:", "selectionChanged:", "updateCollection:" ); Super = NSObject; }; OwnTableView = { Actions = ( ); Outlets = ( ); Super = NSTableView; }; }MPDCon-1.5.1/Resources/Collection.gorm/data.info0000644000175000017500000000027011717240345021547 0ustar sebastiasebastiaGNUstep archive00009c40:00000003:00000003:00000000:01GormFilePrefsManager1NSObject% 01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/Collection.gorm/objects.gorm0000644000175000017500000002517111747210172022305 0ustar sebastiasebastiaGNUstep archive00003070:0000002d:000000ff:00000003:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A D@ CÑ& % C‡ D701 NSView% ?€ A D@ CÑ  D@ CÑ&01 NSMutableArray1 NSArray&01NSButton1 NSControl% Cò€ @@ B` AÀ  B` AÀ&!0± &%0 1 NSButtonCell1 NSActionCell1NSCell0 ±&%Add0 1NSFont%° &&&&&&&&&&&&&&%’0 ±&0 ±&&&& &&0±% @@ B` AÀ  B` AÀ&0± &%0±0±&%Update° &&&&&&&&&&&&&&%’0±&0±&&&& &&01 NSSplitView% Bˆ D@ C¯  D@ C¯&0± &01 NSBrowser%  D@ C  D@ C&0± &01 NSScroller% @ ?€ D@ A  D@ A&0± &%0±0±&° &&&&&&&&&&&&&&&’01 NSScrollView% A¸ C† Bþ  C† Bþ&0± &01 NSClipView% A¨ @ Cu Bö  Cu Bö&0± &0 1NSMatrix%  Cu BÈ  Cu BÈ&0!± &%0"±0#±&° &&&&&&&&&&&&&&%’% Cu BÈ 0$1NSColor0%±&% NSNamedColorSpace0&±&% System0'±& %  controlColor°$0(±& % NSBrowserCell0)1 NSBrowserCell°0*±%&&&&&&&&&&&&&&%%0+± &°2doClick:2doDoubleClick:’°$0,±% @ @ A Bö  A Bö&0-± &%0.±°° &&&&&&&&&&&&&&&°2 _doScroll:v12@0:4@8°% A A A A °,0/±% Cˆ A¸ C†€ Bþ  C†€ Bþ&00± &01±% A¨ @ Cv Bö  Cv Bö&02± &°$03±% @ @ A Bö  A Bö&04± &%05±06±&° &&&&&&&&&&&&&&&’°1% A A A A °3%07±°°*&&&&&&&&&&&&&&°)08±&%NSMatrix09±&%/% BȰ @ ?€ D@ A C† Bþ’’0:± &0;1NSBrowserColumn°° %°90<±°/%%%0=±% C D@ CB  D@ CB&0>± &0?±% A˜ A° D€ C  D€ C&0@± &0A1GSControlTemplate0B±& % OwnTableView1 NSTableView%  D€ C!  D€ C!&0C± &%0D±0E±&° &&&&&&&&&&&&&&0F± &0G1 NSTableColumn0H±&%artist C! A  GÃP0I1 NSTableHeaderCell1!NSTextFieldCell0J±&%Artist0K±% °J&&&&&&&& &&&&&&%’0L±°%°&0M±&% controlShadowColor0N±°%°&0O±&% windowFrameTextColor0P1"GSObjectTemplate0Q±&%BoldCell±!0R±&%nine° °R&&&&&&&& &&&&&&%’0S±°%0T±&%System0U±&%textBackgroundColor0V±°%°T0W±& % textColor0X±0Y±&%album C A  GÃP0Z± 0[±&%Album°K°[&&&&&&&& &&&&&&%’°L°N0\±!°R° °R&&&&&&&& &&&&&&%’°S°V0]±0^±&%trackNr Bd A  GÃP0_± 0`±&%Track°K°`&&&&&&&& &&&&&&%’°L°N0a±!°R° °R&&&&&&&& &&&&&&%’°S°V0b±0c±&%title C/ A  GÃP0d± 0e±&%Title°K°e&&&&&&&& &&&&&&%’°L°N0f±"°Q±!°R° °R&&&&&&&& &&&&&&%’°S°V0g±°%°&0h±& %  gridColor0i±°%°&0j±&% controlBackgroundColor0k1#NSTableHeaderView%  D€ A°  D€ A°&0l± &0m1$GSTableCornerView%  A˜ A°  A˜ A°&0n± &%% A€’ @  @0o± &°i0p±% A° A C,  A C,&0q± &%0r±°E° &&&&&&&&&&&&&&&°=²0s±% A˜  D€ A°  D€ A°&0t± &°k°$0u±% A˜ C0 D€ A  D€ A&0v± &%0w±0x±&° &&&&&&&&&&&&&&&°=²°m°?% A A A A °u°p°s0y1%NSImage0z±&%common_Dimple.tiff°i°L%A0{1&NSBox% À AØ D@ B$  D@ B$&"0|± &0}± % @à @à DÀ AØ  DÀ AØ&0~± &01' NSTextField% @@ B8 A  B8 A&$0€± &%0±!0‚±&%Filter:0ƒ±% A@°‚&&&&&&&& &&&&&&%’°S°V’0„±'% B8 @@ Cß A¨  Cß A¨&"0…± &%0†±!0‡±&° °‡&&&&&&&& &&&&&&%’°S°V’0ˆ±% Cø€ @@ B AÀ  B AÀ&!0‰± &%0б0‹±&%Clear° °‹&&&&&&&&&&&&&&%’0Œ±&0±&&&& &&0ޱ0±&%Title° &&&&&&&&&&&&&& @  @ %%0±°%°&0‘±&% windowBackgroundColor0’±&%Window0“±& % Collection°“ ?€ B F@ F@%0”±%0•±&% NSApplicationIcon&   D€ D@0–± &0—± &0˜1(NSMutableDictionary1) NSDictionary&0™±&% NSOwner0š±&%CollectionController0›±& % TextField°„0œ±& % GormNSBrowser°0±&%TextFieldCell1°P0ž±&%TextFieldCell20Ÿ±"°Q±!0 ±&%nine° ° &&&&&&&& &&&&&&%’°S°V0¡±&%Button°0¢±& % Scroller1°30£±&%CollectionWindow°0¤±&%TextFieldCell3°f0¥±& % SplitView°0¦±&%ClipView°10§±&%Scroller°0¨±& % ScrollView°0©±& % ScrollView1°=0ª±& % ScrollView2°/0«±& % TableColumn10¬±0­±&%column2 BT A  GÃP0®± 0¯±&% °K&&&&&&&& &&&&&&%’°L°N0°±!0±±&%three° °±&&&&&&&& &&&&&&%’°S°V0²±&%Box°{0³±& % TextField1°0´±& % TableColumn°G0µ±& % TableColumn2°X0¶±& % TextFieldCell0·±"°Q±!° ° ° &&&&&&&& &&&&&&%’°S°V0¸±&%GormNSTableView°A0¹±&%Button1°0º±& % TableColumn3°]0»±& % TableColumn4°b0¼±&%Button2°ˆ0½±&%View°}0¾± &++0¿1*NSNibConnector°£0À±&% NSOwner0Á±*°«0±*°¡0Ã1+NSNibOutletConnector°À°£0ı&%window0ű*°¹0Ʊ*°œ°¥0DZ*°§°œ0È1,NSNibControlConnector°§°œ0ɱ&%scrollViaScroller:0ʱ*°¨°œ0˱+°œ°À0Ì1-NSMutableString&%delegate0ͱ,°œ°À0α&%selectionChanged:0ϱ*°©°¥0б*°¸°©0ѱ*°´°¸0Ò±*°µ°¸0Ó±+°¸°À0Ô±-&%delegate0Õ±+°¸°À0Ö±-& % dataSource0×±+°À°¸0ر& % trackView0Ù±+°À°œ0Ú±-&%collectionView0Û±+°£°œ0ܱ-&%initialFirstResponder0ݱ+°œ°¸0Þ±-& % nextKeyView0ß±+°¸°œ°Þ0à±,°¡°À0á±-& % addSelected:0â±,°¹°À0ã±-&%updateCollection:0ä±*°¶°´0å±*°°´0æ±*°ž0ç±*°¤0è±*°¥0é±*°ª°œ0ê±*°¦°ª0ë±*°¢°ª0ì±,°¢°ª0í±& % _doScroll:0î±*°º°¸0ï±*°»°¸0ð±*°¼°²0ñ±*°›°²0ò±*°³°²0ó±*°²0ô±*°½°²0õ±+°À°›0ö±& % filterField0÷±,°›°À0ø±&%filterCollection:0ù±,°¼°À0ú±& % clearFilter:0û±(&0ü±& % TextFieldCell°Q°°Q°ž°Q°¤°Q°¸°BMPDCon-1.5.1/Resources/COPYING0000644000175000017500000004307611716254201015764 0ustar sebastiasebastia GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. MPDCon-1.5.1/Resources/Crossfade.tiff0000644000175000017500000000356011716254201017506 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿþ& .J@@`h(R/Users/flip/Crossfade.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Current.tiff0000644000175000017500000000210211716254201017206 0ustar sebastiasebastiaII*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþö þ@2:(R/Users/mrsanders/Current.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/GNUstep.tiff0000644000175000017500000000161211716254202017117 0ustar sebastiasebastiaII*x $h°à!B† &l¸ð"FŠ%jXf1üsíŸ&M†qã'L/I¢¤‰S¦ˆÁÌ´ô2FKã?KŠÓÊ O¾œrÌ[8_ꘙJ– Ÿ%6÷”E+ª\¤Jþj•ªÖʇ§nžÒ 2eKT³zí¦-j´jÞºN½†–kÖ¥e›î]ÛvëÙ#GÇýzôÜkè a}Úá©ß?ÒÀ‘C†Oš0bâȺ£³'Ÿln…È3¦Lž¶djÛWÆYU¾lœ¥Ý;­_¶xË¢í½;ûß½gï¾ý²l¼óáãÛNôØuàì¹ã'†ÙqòêÖë#Ïœ¿}gþõ ¯]¹qjû­»/ö›ý8Äã÷O?¶}þò뾇|xôéÉgq| Ð>¯™·H¿ý 2ˆ } (8 Õ Üß Cv8Øàô˯Pý 7(9CÃ×@t !¼P"GÞ#ò"’¨¢?J#¢‰ÖWÇbŽ)®= ¶hãˆ;†„=Š5~wŒ'‘„"O,q·“LÚ{+ıÎZ1uNMÖ4¬N5å­á?’äÃH1Îx’Ë$«¬Ë,™ìÅŠ/›œsq>»¤’Í)×¼óI2²BË+Ÿ‚³Q4ìÌí,¨¢1¥"•/¦¤l¶±øXŠ*¹,w ¨Ü<œ.³ìŠíÞ0ïJW;ËJJÊ_4)¢Œ«©µ2÷…®ÀÍŠj-¦|…E¨KѪëͪ~­EiHîF-Eù*uɰ¥t3h%#ošÍ¥ö¦Ü¢Íöh»Ó2î âÆ È¼™Î|‹¤‹vzèº{rï¸&7tî´ÑHzí½‡Z®%Àûﯷ.‡4n--2  ::t-pR/home/dan/GNUstep/Library/WindowMaker/Pixmaps/GNUstep.tifcreated with The GIMPMPDCon-1.5.1/Resources/Install0000644000175000017500000000043211716254202016250 0ustar sebastiasebastiaInstallation Instructions: Make sure you first have MPD installed (See http://www.musicpd.org). Tested with MPD 0.10.3 Second, you need GNUstep installed (See http://www.gnustep.org). Tested with CVS as of 24 May 2004. Then, just type make make install as root to install it. MPDCon-1.5.1/Resources/MPDCon.tiff0000644000175000017500000002251211716254202016654 0ustar sebastiasebastiaII*$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿÿÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿ²²²ÿÿ²²²ÿÿ²²²ÿÿU*ÿÿÿÿÿÿÿÿÿÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿÿÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿU*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ00æ$ 6î$$%@$:%B%(R/Users/flip/Projects/deploy/MPDCon/Images/MPDCon.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/MoveSong.tiff0000644000175000017500000002253011716254202017331 0ustar sebastiasebastiaII*$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ<<<ÿÿÿ888ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ[[[ÿ&&&ÿÿÿÿÿÿÿÿ///ÿ‘‘‘ÿâââÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ[[[ÿ&&&ÿÿÿÿÿÿÿÿ///ÿ‘‘‘ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµµµÿ[[[ÿ&&&ÿÿÿÿÿÿÿÿ///ÿ‘‘‘ÿâââÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%%%ÿZZZÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%%%ÿZZZÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´´´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡¡¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿaaaÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ___ÿÿÿÿÿÿÿÿÿÿÿTTTÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿaaaÿÿÿÿÿÿÿaaaÿûûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊÊÊÿ___ÿÿÿ___ÿÊÊÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ00æ$ Cî$2%@$H%P%(R/Users/mrsanders/Dokumente/Projects/MPDCon/Resources/MoveSong.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Next.tiff0000644000175000017500000000355211716254203016516 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Next.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Pause.tiff0000644000175000017500000000355411716254203016657 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .F@@\d(R/Users/flip/Pause.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Play.tiff0000644000175000017500000000355211716254203016505 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Play.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Playlist.tiff0000644000175000017500000000355611716254203017405 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .H@@^f(R/Users/flip/Playlist.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Prev.tiff0000644000175000017500000000355211716254203016514 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Prev.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Repeat.tiff0000644000175000017500000000360411716254203017016 0ustar sebastiasebastiaII*HüÅÐ@ðýþúÙ—3–ÿÿÿÿ”®ëÿ—¸þƒÐÜJݸ–ÿ] ¹!Ö—1ÿ} "û8—Ø—ÙoTÙú&/úú9úÙ+XÙ—g°—8Þ*þ7—ƒä—¸‹R踗ç|A2C|Üÿ—8—ÙúúÙ—1þ& /.^@@t|(R/Users/flip/Projects/MPDCon/Images/Repeat.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Shuffle.tiff0000644000175000017500000000360411716254203017172 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& 0.^@@t|(R/Users/flip/Projects/MPDCon/Images/Shuffle.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Star.tiff0000644000175000017500000003634412043454773016526 0ustar sebastiasebastiaII*þ  þv: @(12*R¼)>I†'hi‡¸<€ü '€ü 'Adobe Photoshop 7.02011:07:02 00:18:21 adobe:docid:photoshop:0c2ddeac-a5d3-11e0-9af0-8bbb25d13976 8BIM%8BIMê¦ com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 824 577 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 783 559 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 824 577 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2011-07-01T22:18:14Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName A4 com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMéxHH/ÿîÿî8Ag{àHHØ(dÿh 8BIMíHH8BIM&?€8BIMî Transparency8BIM Transparency8BIMïÿÿd8BIM8BIM 8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM8BIM8BIM@@8BIM8BIMG Star.tiff nullboundsObjcRct1Top longLeftlongBtomlong Rghtlong slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong Rghtlong urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM Æ $°ªÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ "ÿÝÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?/øÃúÿ×úGU§¦ÑŒ0†=¬ÉmÞ¦ñ‘P.ØÒÖ¶¯N›ëWü…ÓÎî¯ÿ4¿ç'ìcÇ«ö__ÝöxÝöÍÞÐüÿOgó?¥Uþ´ÿã}ûeÿóŸoÛ~ÈÝž·©·ÐÝgôGü/©¿þýÕÿ"ÿÌÏð¿±~Ãçêý—gý¹ýþ¸’ŸÿÙ8BIM!UAdobe PhotoshopAdobe Photoshop 7.0 €žíí,'¯úÿθíë÷ÿÿôëìÁXïÿÿÿÿÿÿñ~fðÿÿÿÿóžîÿÿÿÿñîÿõ÷ÿë"øçrêø/&gZ2 ÿÿ    MPDCon-1.5.1/Resources/Stop.tiff0000644000175000017500000000355211716254203016525 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Stop.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/CollectionBrowser.gorm/0000755000175000017500000000000012244352107021322 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/CollectionBrowser.gorm/data.classes0000644000175000017500000000051712243715316023621 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; CollectionBrowser = { Actions = ( "addSelected:", "updateCollection:" ); Outlets = ( browser ); Super = NSWindowController; }; FirstResponder = { Actions = ( "addSelected:", "updateCollection:" ); Super = NSObject; }; }MPDCon-1.5.1/Resources/CollectionBrowser.gorm/data.info0000644000175000017500000000027012243715316023113 0ustar sebastiasebastiaGNUstep archive000f4240:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/CollectionBrowser.gorm/objects.gorm0000644000175000017500000001620712244074412023647 0ustar sebastiasebastiaGNUstep archive000f4240:00000021:00000094:00000003:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSWindow1NSWindow1 NSResponder% ?ð @" @ @uJI @„È @~Ð01 NSView% ?ð @" @ @u  @ @uJ01 NSMutableArray1 NSArray&01 NSBox% À @ @A€  @ @A€J"0± % @ @ @~@ @5  @~@ @5J°0 ± &0 ± &°0 1NSCell0 ±&0 1NSFont%° &&&&&&JJ&&&&&& @ @%%01NSButton1 NSControl%  @M @8  @M @8J$0± &%01 NSButtonCell1 NSActionCell0±&%Update° &&&&&&JJ&&&&&&I’0±&0±&&&& &&0±% @{   @L @8  @L @8J!0± &%0±0±&%Add° &&&&&&JJ&&&&&&I’0±&0±&&&& &&01 NSBrowser% @= @ @sÀ  @ @sÀJ0± &01 NSScroller% @ ?ð @~à @2  @~à @2J0± &%0±0±&° &&&&&&JJ&&&&&&J’0 1 NSScrollView% @7 @d` @pà  @d` @pàJ0!± &0"1 NSClipView% @5 @ @a€ @p   @a€ @p J0#1NSMatrix%  @a€ @Y  @a€ @YJ°"0$± &%0%±0&±&° &&&&&&JJ&&&&&&I’% @a€ @Y 0'1NSColor0(±&% NSNamedColorSpace0)±&% System0*±& %  controlColor°'0+±& % NSBrowserCell0,1 NSBrowserCell°° &&&&&&JJ&&&&&&%%0-± &°2doClick:2doDoubleClick:’0.± &°#°'0/±% @ @ @2 @p   @2 @p J00± &%01±°° &&&&&&JJ&&&&&&J° 2 _doScroll:°"I A A A A °/021 NSRulerView%    J03± &04±% @dà @7 @d` @pà  @d` @pàJ05± &06±% @5 @ @a€ @p   @a€ @p J07± &08±°(°)09±&% controlBackgroundColor0:±% @ @ @2 @p   @2 @p J0;± &%0<±0=±&° &&&&&&JJ&&&&&&J°4²°6I A A A A °:0>±%    J0?± &0@±% @tà @7 @d€ @pà  @d€ @pàJ0A± &0B±% @5 @ @a  @p   @a  @p J0C± &°80D±% @ @ @2 @p   @2 @p J0E± &%0F±°=° &&&&&&JJ&&&&&&J°@²°BI A A A A °D0G±%    J0H± &%0I±°° &&&&&&JJ&&&&&&°,0J±&% NSMatrix0K±&%/% @Y° @ ?ð @~à @2 @d` @pà’’0L± &0M1NSBrowserColumn° °#%°K0N±°4%0O±°@%%%0P±°(°)0Q±&% windowBackgroundColor0R±&%Window0S±&%MPD collection browser°S @ @A @È @ÈI&  @–€ @Œ 0T± &0U± &0V1NSMutableDictionary1 NSDictionary&0W±& % Window(0)°0X±&%BrowserCell(0)°I0Y±& % ActionCell(0)0Z±°° &&&&&&JJ&&&&&&I’0[±&%View(1)°0\±& % ScrollView(0)° 0]±& % Matrix(0)0^±%  @Y@ @Y  @Y@ @YJ°^°^0_± &%°Z% @Y@ @Y °'°'0`±& % NSBrowserCell°,%%0a± &’²’0b±&%Box(0)°0c±& % ButtonCell(0)°0d±& % Browser(0)°0e±&% NSOwner0f±&%CollectionBrowser0g±& % Button(0)°0h±& % Scroller(0)°0i±&%View(0)°0j±& % ButtonCell(1)°0k±& % Button(1)°0l±&%Cell(0)°0m± &0n1NSNibConnector°W0o±&% NSOwner0p±°i°W0q1 NSNibOutletConnector°o°W0r±&%window0s± °W°o0t±&%delegate0u±°g°i0v±°c°g0w±°k°i0x±°j°k0y1!NSNibControlConnector°g°o0z±&%updateCollection:0{±!°k°o0|±& % addSelected:0}±°b°i0~±°[°b0±°d°i0€±°h°d0±°l°h0‚±!°h°d0ƒ±&%scrollViaScroller:0„±°\°d0…±°]°\0†±°Y°]0‡±!°]°d0ˆ±&%doClick:0‰±°X°d0б °d°o0‹±&%delegate0Œ± °W°d0±&%initialFirstResponder0ޱ °o°d0±&%browser0±&MPDCon-1.5.1/Resources/CrossfadeView.gorm/0000755000175000017500000000000012244352107020427 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/CrossfadeView.gorm/data.classes0000644000175000017500000000056311716254203022724 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; CrossfadeController = { Actions = ( "valueChanged:", "apply:", "revert:" ); Outlets = ( valueField, valueStepper ); Super = NSWindowController; }; FirstResponder = { Actions = ( "valueChanged:", "apply:", "revert:" ); Super = NSObject; }; }MPDCon-1.5.1/Resources/CrossfadeView.gorm/data.info0000644000175000017500000000027011716254203022215 0ustar sebastiasebastiaGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/CrossfadeView.gorm/objects.gorm0000644000175000017500000000644011716254203022753 0ustar sebastiasebastiaGNUstep archive00002b5e:00000022:00000051:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%NSOwner0±&% CrossfadeController0±&% GSCustomClassMap0±&0±&% Button101NSButton1 NSControl1NSView1 NSResponder% A A  B` AÀ  B` AÀ&0 1 NSMutableArray1 NSArray&%0 1 NSButtonCell1 NSActionCell1NSCell0 ±&% Revert0 1NSFont%&&&&&&&&%’0 ±&0±&&&&0±& %  GormNSPanel01GSWindowTemplate1GSClassSwapper0±&%NSPanel1NSPanel1NSWindow%  C B&% C“€ D@0±%  C B  C B&0± &01 NSStepper% BÞ B A€ A¸  A€ A¸&0± &%01 NSStepperCell0±&% 001NSNumber1NSValued &&&&&&&&%’ @Y ?ð%%01 NSTextField% A B$ B` A¨  B` A¨&0± &%01NSTextFieldCell0±&° &&&&&&&&0%’01NSColor0±&%NSNamedColorSpace0±&% System0 ±&% textBackgroundColor0!±°°0"±& %  textColor’0#±% BŽ A  B` AÀ  B` AÀ&0$± &%0%± 0&±&% Apply° &&&&&&&&%’0'±&0(±&&&&0)±% Bš B0 Aè A  Aè A&0*± &%0+±0,±&% secs0-±% A`&&&&&&&&0%’0.±°0/±&% System00±&% textBackgroundColor01±°°/02±& %  textColor’°03±°04±&% System05±&% windowBackgroundColor06±&% Window07±& %  Crossfade°7 ?€ B F@ F@%081NSImage09±&%NSApplicationIcon&   D  D€0:±&% Button°#0;±&% Stepper°0<±& %  TextField°0=±& %  TextField1°)0>± &  0?1NSNibConnector°°0@±°;0A±°<0B±°:0C1NSNibOutletConnector°°0D±&% window0E±°=0F±°0G±°°<0H1NSMutableString& %  valueField0I±°°;0J±& %  valueStepper0K1NSNibControlConnector°;°0L±& %  valueChanged:0M±°°0N±&% revert:0O±°:°0P±&% apply:0Q1 GSMutableSet1! NSMutableSet1"NSSet&°MPDCon-1.5.1/Resources/FindPanel.gorm/0000755000175000017500000000000012244352107017523 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/FindPanel.gorm/data.classes0000644000175000017500000000711211716254204022016 0ustar sebastiasebastia{ FindController = { Actions = ( "findNext:", "findPrevious:", "optionsChanged:" ); Outlets = ( findField, scopeMatrix, optionsMatrix, targetMatrix, notFoundField ); Super = NSWindowController; }; FirstResponder = { Actions = ( "activateContextHelpMode:", "alignCenter:", "alignJustified:", "alignLeft:", "alignRight:", "arrangeInFront:", "cancel:", "capitalizeWord:", "changeColor:", "checkSpelling:", "close:", "complete:", "copy:", "copyFont:", "copyRuler:", "cut:", "delete:", "deleteBackward:", "deleteForward:", "deleteToBeginningOfLine:", "deleteToBeginningOfParagraph:", "deleteToEndOfLine:", "deleteToEndOfParagraph:", "deleteToMark:", "deleteWordBackward:", "deleteWordForward:", "deminiaturize:", "deselectAll:", "fax:", "hide:", "hideOtherApplications:", "indent:", "loosenKerning:", "lowerBaseline:", "lowercaseWord:", "makeKeyAndOrderFront:", "miniaturize:", "miniaturizeAll:", "moveBackward:", "moveBackwardAndModifySelection:", "moveDown:", "moveDownAndModifySelection:", "moveForward:", "moveForwardAndModifySelection:", "moveLeft:", "moveRight:", "moveToBeginningOfDocument:", "moveToBeginningOfLine:", "moveToBeginningOfParagraph:", "moveToEndOfDocument:", "moveToEndOfLine:", "moveToEndOfParagraph:", "moveUp:", "moveUpAndModifySelection:", "moveWordBackward:", "moveWordBackwardAndModifySelection:", "moveWordForward:", "moveWordForwardAndModifySelection:", "newDocument:", "ok:", "open:", "openDocument:", "orderBack:", "orderFront:", "orderFrontColorPanel:", "orderFrontDataLinkPanel:", "orderFrontHelpPanel:", "orderFrontStandardAboutPanel:", "orderFrontStandardInfoPanel:", "orderOut:", "pageDown:", "pageUp:", "paste:", "pasteAsPlainText:", "pasteAsRichText:", "pasteFont:", "pasteRuler:", "performClose:", "performMiniaturize:", "performZoom:", "print:", "raiseBaseline:", "revertDocumentToSaved:", "runPageLayout:", "runToolbarCustomizationPalette:", "saveAllDocuments:", "saveDocument:", "saveDocumentAs:", "saveDocumentTo:", "scrollLineDown:", "scrollLineUp:", "scrollPageDown:", "scrollPageUp:", "scrollViaScroller:", "selectAll:", "selectLine:", "selectNextKeyView:", "selectParagraph:", "selectPreviousKeyView:", "selectText:", "selectToMark:", "selectWord:", "showContextHelp:", "showGuessPanel:", "showHelp:", "showWindow:", "stop:", "subscript:", "superscript:", "swapWithMark:", "takeDoubleValueFrom:", "takeFloatValueFrom:", "takeIntValueFrom:", "takeObjectValueFrom:", "takeStringValueFrom:", "terminate:", "tightenKerning:", "toggle:", "toggleContinuousSpellChecking:", "toggleRuler:", "toggleToolbarShown:", "toggleTraditionalCharacterShape:", "transpose:", "transposeWords:", "turnOffKerning:", "turnOffLigatures:", "underline:", "unhide:", "unhideAllApplications:", "unscript:", "uppercaseWord:", "useAllLigatures:", "useStandardKerning:", "useStandardLigatures:", "yank:", "zoom:", "findNext:", "findPrevious:", "optionsChanged:" ); Super = NSObject; }; }MPDCon-1.5.1/Resources/FindPanel.gorm/objects.gorm0000644000175000017500000001623211716254204022050 0ustar sebastiasebastiaGNUstep archive00002a95:0000001b:000000cb:00000000:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary&01NSString&%?NSOwner0±&%?FindController0±&% Box101NSBox1NSView1 NSResponder% C€ B, C Bœ  C Bœ&01 NSMutableArray1 NSArray&0±% @à @à Bø BH  Bø BH&0 ± &0 1 NSMatrix1 NSControl%  Bø BH  Bø BH&0 ± &%0 1 NSActionCell1NSCell0 ±&01NSFont%&&&&&&&&%’% Bø AÈ 01NSColor0±&%?NSNamedColorSpace0±&%?System0±&%?controlBackgroundColor°0±& %? NSButtonCell01 NSButtonCell0±&%?Switch01NSImage0±&%?common_SwitchOff°&&&&&&&&%’0±&0±&0±0±&%?common_SwitchOn&&&%%0± &0±0±& %? Ignore Case°°&&&&&&&&%’°0±&°&&&0 ±0!±& %? Whole String°°&&&&&&&&%’°0"±&°&&&’’’° 0#±0$±& %? Find Options°&&&&&&&& @  @ %%0%±& %  TextField10&1 NSTextField% B– Bò CŸ€ A¨  CŸ€ A¨&0'± &%0(1NSTextFieldCell0)±&°&&&&&&&&%’0*±°0+±&%?System0,±&%?textBackgroundColor0-±°°+0.±& %? textColor’0/±&% Box200±% A B, BÄ Bœ  BÄ Bœ&01± &02±% @à @à B¨ BH  B¨ BH&03± &04± %  B¨ BH  B¨ BH&05± &%06± 07±&°&&&&&&&&%’% B¨ AÈ 08±°09±&%?System0:±&%?controlBackgroundColor°80;±& %? NSButtonCell0<±0=±&%?Radio0>±0?±&%?common_RadioOff°&&&&&&&&%’0@±&0A±&0B±0C±&%?common_RadioOn&&&%%0D± &0E±0F±& %? Collection°>°&&&&&&&&%’°@0G±&°B&&&0H±0I±&%?Playlist°>°&&&&&&&&%’°@0J±&°B&&&’’’°E0K±0L±& %? Find Target°&&&&&&&& @  @ %%°0M1 GSNibItem°  &0N±& %  TextField20O±% A Ap C A  C A&0P± &%0Q±0R±&0S±% A`&&&&&&&&%’0T±°0U±&%?System0V±&%?textBackgroundColor0W±°0X±&%?System0Y±&%?controlShadowColor’0Z±& %? TextField0[±% B Bø B A  B A&0\± &%0]±0^±&%?Find:°S&&&&&&&&%’0_±°0`±&%?System0a±&%?textBackgroundColor0b±°°`0c±& %? textColor’0d±&%?GSCustomClassMap0e±&0f±&%?Button0g1NSButton% C¤ A B„ AÀ  B„ AÀ&0h± &%0i±0j±&%?Next°&&&&&&&&%’0k±&0l±&&&&0m±&% Matrix1° 0n±&% Matrix2°40o±&%?Box0p±% Bâ B, C Bœ  C Bœ&0q± &0r±% @à @à Bø BH  Bø BH&0s± &0t± %  Bø BH  Bø BH&0u± &%0v± ° °&&&&&&&&%’% Bx AÈ °°0w±& %? NSButtonCell0x±0y±&%?Radio°>°&&&&&&&&%’0z±&0{±&°B&&&%%0|± &0}±0~±&%?All°>°&&&&&&&&%’°z0±&°B&&&0€±0±&%?Artist°>°&&&&&&&&%’°z0‚±&°B&&&0ƒ±0„±&%?Album°>°&&&&&&&&%’°z0…±&°B&&&0†±0‡±&%?Title°>°&&&&&&&&%’°z0ˆ±&°B&&&’’’°}0‰±0б& %? Find Scope°&&&&&&&& @  @ %%0‹±& %? GormNSPanel0Œ1NSPanel1NSWindow%  CÊ C&% Cª Dh@0±%  CÊ C  CÊ C&0ޱ &°[°&°g0±% C€ A B„ AÀ  B„ AÀ&0± &%0‘±0’±&%?Previous°&&&&&&&&%’0“±&0”±&&&&°p°°0°O0•±°°0–±&%?windowBackgroundColor0—±&%?Window0˜±&%?Find°˜ ?€ B F@ F@%0™±0š±&%?NSApplicationIcon0›±&%?Matrix°t0œ±&% Button1°0± &0ž1NSNibConnector°‹0Ÿ±&%?NSOwner0 ±°Z0¡±°%0¢±°f0£±°œ0¤±°›0¥±°o0¦±°m0§±°0¨±°°Ÿ0©1NSNibControlConnector°œ°0ª±& %  findPrevious:0«±°f°0¬±& %  findNext:0­±°%°°¬0®1NSNibOutletConnector°Ÿ°‹0¯±&%?window0°±°°‹°¯0±±°°›0²±& %? scopeMatrix0³±°°m0´±& %? optionsMatrix0µ±°n0¶±°/0·±°°n0¸±& %? targetMatrix0¹±°N0º±°°N0»±& %? notFoundField0¼±°°%0½±& %? findField0¾±°n°0¿±&% optionsChanged:0À±°›°°¿0Á±°m°°¿0±°‹°%0ñ&%?initialFirstResponder0ı°%°0ű&%?delegateMPDCon-1.5.1/Resources/LyricsInspector.gorm/0000755000175000017500000000000012244352107021017 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/LyricsInspector.gorm/data.classes0000644000175000017500000000047512020637377023324 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "openURL:" ); Super = NSObject; }; LyricsInspector = { Actions = ( "openURL:" ); Outlets = ( artist, lyricsURL, lyricsText, title ); Super = NSWindowController; }; }MPDCon-1.5.1/Resources/LyricsInspector.gorm/data.info0000644000175000017500000000027012020637377022613 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/LyricsInspector.gorm/objects.gorm0000644000175000017500000000622212030336420023331 0ustar sebastiasebastiaGNUstep archive00003070:0000001d:0000004d:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A Cˆ CÂ&% D € D%@01 NSView% ?€ A Cˆ C  Cˆ CÂ&01 NSMutableArray1 NSArray&01 NSTextField1 NSControl% A C´ C| A  C| A&0± &%0 1NSTextFieldCell1 NSActionCell1NSCell0 ±&%Artist0 1NSFont% A@° &&&&&&&& &&&&&&%’0 1NSColor0 ±&% NSNamedColorSpace0±&%System0±&%textBackgroundColor0±° °0±& % textColor’0±% A C¡ C| B  C| B&0± &%0±0±&%Title° °&&&&&&&& &&&&&&%’° °’01NSBox% A B C| C€  C| C€&0± &0± % @à @à Cn C  Cn C&0± &0±% Á` Cn Cˆ  Cn Cˆ&0± &%0±0±& % Lyrics text0±% A@°&&&&&&&& &&&&&&%’° °’0±0 ±&%Lyrics0!±%° &&&&&&&&&&&&&& @  @ %%0"1NSButton% A A  Bæ AÀ  Bæ AÀ&0#± &%0$1 NSButtonCell0%±& % Open Website°!&&&&&&&&&&&&&&%’0&±&&&& &&0'±° 0(±&% System0)±&% windowBackgroundColor0*±&%Window0+±&%Lyrics Inspector°+ @@ B F@ F@%&   D€ D@0,± &0-± &0.1NSMutableDictionary1 NSDictionary& 0/±& % Button(0)°"00±& % TextField(3)°01±& % TextField(0)°02±&% NSOwner03±&%LyricsInspector04±&%View(1)°05±& % TextField(1)°06±& % InspectorWin°07±&%Box(0)°08±&%View(0)°09± &  0:1NSNibConnector°60;±&% NSOwner0<±°8°60=±°1°80>±°5°80?±°7°80@±°4°70A±°0°40B1NSNibOutletConnector°;°10C±&%artist0D±°;°50E±&%title0F±°;°00G±& % lyricsText0H±°;°60I±&%window0J±°/°80K1NSNibControlConnector°/°;0L1NSMutableString&%openURL:0M±&MPDCon-1.5.1/Resources/Player.gorm/0000755000175000017500000000000012244352107017117 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/Player.gorm/CD.tiff0000644000175000017500000000355011716254204020264 0ustar sebastiasebastiaII*H Y¹õõ¹Y YÿÿÿÿÿÿÿÿY…ÿÿÿÿÿÿÿÿÿÿ…YÿÿÿÿÿÿÿÿÿÿÿÿY ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ YÿÿÿÿÿÿÿÿÿÿÿÿÿÿY¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹õÿÿÿÿÿÿÿÿÿÿÿÿõõÿÿÿÿÿÿÿÿÿÿÿÿõ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹YÿÿÿÿÿÿÿÿÿÿÿÿÿÿY ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ YÿÿÿÿÿÿÿÿÿÿÿÿY…ÿÿÿÿÿÿÿÿÿÿ…YÿÿÿÿÿÿÿÿY Y¹õõ¹Y þ& .B@@X`(R/Users/flip/CD.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Crossfade.tiff0000644000175000017500000000356011716254204021710 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿþ& .J@@`h(R/Users/flip/Crossfade.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Next.tiff0000644000175000017500000000355211716254204020716 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Next.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Pause.tiff0000644000175000017500000000355411716254204021057 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .F@@\d(R/Users/flip/Pause.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Play.tiff0000644000175000017500000000355211716254204020705 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Play.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Playlist.tiff0000644000175000017500000000355611716254204021605 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .H@@^f(R/Users/flip/Playlist.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Prev.tiff0000644000175000017500000000355211716254204020714 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Prev.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Repeat.tiff0000644000175000017500000000355411716254204021222 0ustar sebastiasebastiaII*HÿÿÿÿˆÓúÿÿÿdúÿÿúÿÿÿúddÿþyÿÿßÿdúÿiÿ Ôúˆÿ´3ÿˆÓüÑÓúǯúúª¶úÓÞòÓˆÿSmÿˆúï*-øúdÿúƒ`ôÿddúÿÿÛÜöÿúdˆÓúúÓˆþ& .F@@\d(R/Users/flip/Repeat.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Shuffle.tiff0000644000175000017500000000360411716254204021372 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& 0.^@@t|(R/Users/flip/Projects/MPDCon/Images/Shuffle.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/Stop.tiff0000644000175000017500000000355211716254204020725 0ustar sebastiasebastiaII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ& .D@@Zb(R/Users/flip/Stop.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/Player.gorm/data.classes0000644000175000017500000000222512072317524021413 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; AppController = { Actions = ( "play:", "stop:", "prev:", "next:", "shuffle:", "repeat:", "percentChanged:", "volumeChanged:", "showPrefPanel:", "managePlaylists:", "connect:", "browseCollection:", "serverStatistics:", "showPlaylist:", "updateCollection:", "showCrossfade:", "showLyricsInspector:", "showSongInspector:", "showPlaylistInspector:", "browseCollectionByDirectory:" ); Outlets = ( playButton, stopButton, prevButton, nextButton, shuffleButton, repeatButton, playView, percentSlider, volumeSlider, playerButton, window, statisticsItem, browseItem, updateItem, showItem, manageItem ); Super = NSObject; }; FirstResponder = { Actions = ( "browseCollectionByDirectory:", "setText:", "showLyricsInspector:", "showPlaylistInspector:", "showSongInspector:" ); Super = NSObject; }; PlayView = { Actions = ( "setText:" ); Outlets = ( ); Super = NSView; }; }MPDCon-1.5.1/Resources/Player.gorm/data.info0000644000175000017500000000027012072317524020707 0ustar sebastiasebastiaGNUstep archive000f4240:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/Player.gorm/objects.gorm0000644000175000017500000006620312072317524021450 0ustar sebastiasebastiaGNUstep archive000f4240:00000026:000001d9:00000001:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01 GSNibItem01NSString& % AppController  &01NSMenu0±& % Main Menu01NSMutableArray1 NSArray&01 NSMenuItem0 ±&%Info0 ±&&&ÿ%0 1 NSImage0 1 NSMutableString&%common_2DCheckMark2submenuAction:%0 ±° 0±&0± 0±& % Info Panel...0±&&&ÿ%° ’%0± 0±&%Preferences...0±&&&ÿ%° ’%0± 0±&%Help...0±&%?&&ÿ%° ’% °0± 0±&%Edit0±&&&ÿ%° 0± 0± & % common_2DDash²%0±°0±&0± 0 ±&%Cut0!±&%x&&ÿ%° °’%0"± 0#±&%Copy0$±&%c&&ÿ%° °’%0%± 0&±&%Paste0'±&%v&&ÿ%° °’%0(± 0)±& % Select All0*±&%a&&ÿ%° °’%°0+± 0,±&%Server0-±&&&ÿ%° ²%0.±°,0/±&00± 01±&%Connect02±&%C&&ÿ%° ’% 03± 04±& % Statistics05±&%s&&ÿ%° ’%°06± 07±& % Playlists08±&&&ÿ%° ²%09±°70:±&0;± 0<±& % Show Current0=±&%p&&ÿ%° ’%0>± 0?±&%Manage0@±&%m&&ÿ%° ’%°0A± 0B±& % Collection0C±&&&ÿ%° ²%0D±°B0E±&0F± 0G±& % Browse by tag0H±&%t&&ÿ%° ’%0I± 0J±&%Browse by directory0K±&%d&&ÿ%0L± 0M±&%NSMenuCheckmark0N± 0O±&%NSMenuMixedState’%0P± 0Q±&%Update0R±&%u&&ÿ%° ’%°0S± 0T±& % Inspectors0U±&&&ÿ%°L°N’%0V±0W±&%Tools0X±&0Y± 0Z±&%Lyrics0[±&%L&&ÿ%°L°N’%0\± 0]±&%Song0^±&%S&&ÿ%°L°N’%0_± 0`±&%Playlist0a±&%P&&ÿ%°L°N’%°0b± 0c±&%Hide0d±&%h&&ÿ%° ’%0e± 0f±&%Quit0g±&%q&&ÿ%° ’%0h1 GSWindowTemplate1GSClassSwapper0i±&% NSWindow1NSWindow1 NSResponder% ?€ A CŠ€ C&% C߀ Cn0j1NSView% ?€ A CŠ€ C  CŠ€ C&0k±&  0l1 GSCustomView0m±&%PlayView A Bd Cn B–&0n1NSButton1 NSControl% A @à AÀ AÀ  AÀ AÀ&0o±&%0p1 NSButtonCell1 NSActionCell1NSCell0q±&%Play0r±  A  A 0s1NSColor0t±&% NSCalibratedWhiteColorSpace 0u±&0v1NSBitmapImageRep1 NSImageRep0w±&% NSDeviceRGBColorSpace A  A %%%0x1NSData&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R0y1NSFont%&&&&&&&&&&&&&&%’0z±&&&& &&0{±% B @à AÀ AÀ  AÀ AÀ&0|±&%0}±0~±&%Stop0±  A  A °s0€±&0±°w A  A %%%0‚±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°y&&&&&&&&&&&&&&%’0ƒ±&0„±&&&& &&0…±% B| @à AÀ AÀ  AÀ AÀ&0†±&%0‡±0ˆ±&%Prev0‰±  A  A 0б°t 0‹±&0Œ±°w A  A %%%0±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°y&&&&&&&&&&&&&&%’0ޱ&0±&&&& &&0±% B¸ @à AÀ AÀ  AÀ AÀ&0‘±&%0’±0“±&%Next0”±  A  A °Š0•±&0–±°w A  A %%%0—±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°y&&&&&&&&&&&&&&%’0˜±&0™±&&&& &&0š±% C] @à AÀ AÀ  AÀ AÀ&0›±&%0œ±0±&%S0ž±  A  A 0Ÿ±°t 0 ±&0¡±°w A  A %%%0¢±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°y&&&&&&&&&&&&&&%’0£±&0¤±&&&& &&0¥±% Cu @à AÀ AÀ  AÀ AÀ&0¦±&%0§±0¨±&%R0©±  A  A °Š0ª±&0«±°w A  A %%%0¬±&ÚÚII*HÿÿÿÿˆÓúÿÿÿdúÿÿúÿÿÿúddÿþyÿÿßÿdúÿiÿ Ôúˆÿ´3ÿˆÓüÑÓúǯúúª¶úÓÞòÓˆÿSmÿˆúï*-øúdÿúƒ`ôÿddúÿÿÛÜöÿúdˆÓúúÓˆ þÿÒ@R°y&&&&&&&&&&&&&&%’0­±&0®±&&&& &&0¯1NSSlider% A B C€ A€  C€ A€&0°±&%0±1 NSSliderCell0²±&%0°y0³1NSNumber1 NSValued &&&&&&&&&&&&&&%’ BÈ ¿€%0´1!NSTextFieldCell0µ±&°y&&&&&&&& &&&&&&%’0¶±0·±&% NSNamedColorSpace0¸±&%System0¹±&%textBackgroundColor0º±°·0»±&% System0¼±&% controlTextColor0½±0¾±&0¿± 0À±&%common_SliderHoriz°y&&&&&&&&&&&&&&%%0Á±% C} Bd A€ B–  A€ B–&0±&%0ñ0ı&%0°y0űd &&&&&&&&&&&&&&%’ BÈ ¿€%0Ʊ!0DZ&°y&&&&&&&& &&&&&&%’°¶°º0ȱ0ɱ&0ʱ 0˱&%common_SliderVert°y&&&&&&&&&&&&&&%%0̱% C* @à AÀ AÀ  AÀ AÀ&0ͱ&%0α0ϱ&%PL0б  A  A °Š0ѱ&0Ò±°w A  A %%%0Ó±&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿÒ@R°y&&&&&&&&&&&&&&%’0Ô±&0Õ±&&&& &&0Ö±% C @à AÀ AÀ  AÀ AÀ&0×±&%0ر0Ù±&%CF0Ú±  A  A °Š0Û±&0ܱ°w A  A %%%0ݱ&ÚÚII*Hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿÿÿÿÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ}}}ÿ þÿÒ@R°y&&&&&&&&&&&&&&%’0Þ±&0ß±&&&& &&0à±°·°»0á±&% windowBackgroundColor0â±&%Window0ã±&%Player°ã ?€ B F@ F@%0ä± 0å±&% NSApplicationIcon&   Dð D–0æ±&°h0ç±&0è1"NSMutableDictionary1# NSDictionary&?0é±& % MenuItem19°F0ê±&%Button1°{0ë±&%GormCustomView°l0ì±&%Button2°…0í±&%Button3°0î±&%Button4°š0ï±& % MenuItem1°e0ð±& % MenuItem2°b0ñ±&%Button5°¥0ò±& % MenuItem33°0ó±& % MenuItem3°e0ô±&%Button6°Ö0õ±& % MenuItem34°0ö±& % MenuItem4°b0÷±&%Button7°Ì0ø±& % MenuItem35°"0ù±& % MenuItem5°e0ú±& % MenuItem36°%0û±& % MenuItem6°0ü±& % MenuItem37°(0ý±&%MenuItem°b0þ±& % MenuItem(0)°S0ÿ±& % MenuItem(5)°IP±& % MenuItem7°°°P±& % MenuItem8°P±&%Slider°¯P±& % MenuItem9°P±& % My Window°hP±&%Button°nP±& % MenuItem(2)°\P±& % GormNSMenu° P±& % MenuItem20°+P ±& % MenuItem21°0P ±& % MenuItem22°3P ±& % MenuItem23°+P ±& % MenuItem24°6P ±& % MenuItem25°;P±& % MenuItem26°>P±&%Menu(0)°VP±& % MenuItem27°PP±& % MenuItem(4)°_P±& % MenuItem28°AP±&%Slider1°ÁP±& % GormNSMenu1° P±& % GormNSMenu2°DP±& % GormNSMenu3°.P±& % GormNSMenu4°9P±& % MenuItem(1)°YP±& % GormNSMenu6P±P±&%WindowsP±&P± P±&%Arrange In FrontP±&&&ÿ%° °’%P ± P!±&%Miniaturize WindowP"±&%m&&ÿ%° °’%P#± P$±& % Close WindowP%±&%w&&ÿ%° °’%P&±& % GormNSMenu7°P'±& % MenuItem10°P(±& % MenuItem11°P)±& % MenuItem12°P*±& % MenuItem13°P+±& % MenuItem14°bP,±&%NSMenu°P-±& % MenuItem15°eP.±& % MenuItem16°AP/±& % MenuItem17°PP0±&% NSOwnerP1±& % NSApplicationP2±& % MenuItem(3)°_P3±& % MenuItem18°AP4±&``P51$NSNibConnectorÐÐ0P6±$Ð,Ð0P7±$Ð+Ð,P81%NSNibControlConnectorÐ+P9±&% NSFirstP:±&%hide:P;±$Ð-Ð,P<±%Ð-Ð9P=±& % terminate:P>±$°ëP?±$ÐP@±$°êPA±$°ìPB±$°íPC±$°îPD±$°ñPE±$°Ð0PF1&NSNibOutletConnector°ÐPG±& % playButtonPH±&°°êPI±& % stopButtonPJ±&°°ìPK±& % prevButtonPL±&°°íPM±& % nextButtonPN±&°°îPO±& % shuffleButtonPP±&°°ñPQ±& % repeatButtonPR±%аPS±&%play:PT±%°ê°PU±&%stop:PV±%°ì°PW±&%prev:PX±%°í°PY±&%next:PZ±%°î°P[±&%shuffle:P\±%°ñ°P]±&%repeat:P^±&°°ëP_±&%playViewP`±&Ð0°Pa±&%delegatePb±$ÐPc±&°ÐPd±& % percentSliderPe±%аPf±&%percentChanged:Pg±$Ð*Ð,Ph±%Ð*Ð,Pi±&%submenuAction:Pj±$ÐÐ*Pk±$Ð'ÐPl±%Ð'Ð9Pm±&%orderFrontStandardInfoPanel:Pn±$Ð(ÐPo±$Ð)ÐPp±%Ð)Ð9Pq±&%orderFrontHelpPanel:Pr±$ÐPs±&°ÐPt±& % volumeSliderPu±%аPv±&%volumeChanged:Pw±%Ð(°Px±&%showPrefPanel:Py±$Ð3Ð,Pz±%Ð3Ð,P{±&%submenuAction:P|±$ÐÐ3P}±$°÷Ð0P~±$°éÐP±%°é°P€±&%browseCollection:P±$Ð Ð,P‚±%Ð Ð,Pƒ±&%submenuAction:P„±$ÐÐ P…±$Ð ÐP†±$Ð ÐP‡±%Ð °Pˆ±&%connect:P‰±%Ð °Pб&%serverStatistics:P‹±%°÷°PŒ±& % showPlaylist:P±$Ð Ð,Pޱ%Ð Ð,P±&%submenuAction:P±$ÐÐ P‘±$Ð ÐP’±$ÐÐP“±%Ð °P”±& % showPlaylist:P•±$Ð/ÐP–±%Ð/°P—±&%updateCollection:P˜±$°ôÐ0P™±%°ô°Pš±&%showCrossfade:P›±&°ÐPœ±&%windowP±&°Ð Pž±&%showItemPŸ±&°ÐP ±& % manageItemP¡±&°°éP¢±& % browseItemP£±&°Ð/P¤±& % updateItemP¥±&°Ð P¦±&%statisticsItemP§±%аP¨±&%managePlaylists:P©±$°òÐ,Pª±$Ð&°òP«±$°õÐ&P¬±%°õÐ9P­±&%cut:P®±$°øÐ&P¯±%°øÐ9P°±&%copy:P±±$°úÐ&P²±%°úÐ9P³±&%paste:P´±$°üÐ&Pµ±%°üÐ9P¶±& % selectAll:P·±%°òÐ,P¸±&%submenuAction:P¹±$°þÐ,Pº±$аþP»±$ÐÐP¼±%°þÐ,P½±&%submenuAction:P¾±%аP¿±&%showLyricsInspector:PÀ±$ÐÐPÁ±%аP±&%showSongInspector:Pñ$Ð2ÐPı%Ð2°Pű&%showPlaylistInspector:PƱ$°ÿÐPDZ%°ÿ°Pȱ&%browseCollectionByDirectory:Pɱ"&MPDCon-1.5.1/Resources/PlaylistInspector.gorm/0000755000175000017500000000000012244352107021353 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/PlaylistInspector.gorm/data.classes0000644000175000017500000000173012063140575023647 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "includeUnratedSongsChanged:", "nrOfFutureSongsChanged:", "nrOfOldSongsToKeepChanged:", "randomPlaylistFeedStateChanged:", "ratingBasedFeedStateChanged:" ); Super = NSObject; }; PlaylistInspector = { Actions = ( "nrOfFutureSongsChanged:", "nrOfOldSongsToKeepChanged:", "randomPlaylistFeedStateChanged:", "ratingBasedFeedStateChanged:", "includeUnratedSongsChanged:" ); Outlets = ( currentSongNr, maxRatingStars, minRatingStars, nrNewSongs, nrOfSongsInPlaylist, nrPlayedSongs, playlistPlayingTime, randomPlaylistFeed, ratingBasedFeed, includeUnratedSongs, maxRatingText, minRatingText, nrOfNewSongsText, nrOfPlayedSongsText ); Super = NSWindowController; }; RatingStarView = { Actions = ( ); Outlets = ( ); Super = NSControl; }; }MPDCon-1.5.1/Resources/PlaylistInspector.gorm/data.info0000644000175000017500000000027012044241750023137 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/PlaylistInspector.gorm/objects.gorm0000644000175000017500000002522312063140575023701 0ustar sebastiasebastiaGNUstep archive00003070:00000024:00000106:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A Cˆ CÂ&% CØ CÝ€01 NSView% ?€ A Cˆ C  Cˆ CÂ&01 NSMutableArray1 NSArray&01 NSScrollView% C3 CD B¦ A  B¦ A&0± &0 1 NSClipView% ?€ Aˆ B¢   B¢ &0 ± &0 1 NSTableView1 NSControl%  B¢ C!  B¢ C!&0 ± &%0 1NSCell0±&01NSFont%&&&&&&&&&&&&&&0± &01 NSTableColumn0±& % minrating B¢ A  GÃP01NSTableHeaderCell1NSTextFieldCell1 NSActionCell0±& % MinRating0±% °&&&&&&&& &&&&&&%’01NSColor0±&% NSNamedColorSpace0±&% System0±&% controlShadowColor0±°°0±&% windowFrameTextColor0±0±&°&&&&&&&& &&&&&&%’0±°0±&%System0 ±&%textBackgroundColor0!±°°0"±& % textColor0#±°°0$±& %  gridColor0%±°°0&±&% controlBackgroundColor0'1NSTableHeaderView%  B¢ A°  B¢ A°&0(± &0)1GSTableCornerView% ?€ ?€ A˜ A°  A˜ A°&0*± &%% A€’ @  @0+± &°%0,±% ?€ ?€ B¢ A€  B¢ A€&0-± &°'°%° % A A A A °,0.1 NSTextField% A C´ C A  C A&0/± &%00±01±&%Nr. of songs in playlist:02±% A@°1&&&&&&&& &&&&&&%’°°!’03±% C# C´ BÆ A  BÆ A&04± &%05±06±&%12345°2°6&&&&&&&& &&&&&&%’°°!’07±% A C¨€ C A  C A&08± &%09±0:±&%Current song Nr.°2°:&&&&&&&& &&&&&&%’°°!’0;±% C# C¨€ BÆ A  BÆ A&0<± &%0=±0>±&%345°2°>&&&&&&&& &&&&&&%’°°!’0?±% A C C A  C A&0@± &%0A±0B±&%Playlist playing time:°2°B&&&&&&&& &&&&&&%’°°!’0C±% C3 C B¦ A  B¦ A&0D± &%0E±0F±&%00:00°2°F&&&&&&&& &&&&&&%’°°!’0G1NSButton% A C’€ C| A€  C| A€&0H± &%0I1 NSButtonCell0J±&%Random playlist feed:0K1NSImage0L1NSMutableString&%common_SwitchOff°&&&&&&&&&&&&&&%’0M±&0N±&0O±0P±&%common_SwitchOn&&& &&0Q±% A C‡ C A  C A&0R± &%0S±0T±&%Nr. of old songs to keep:°2°T&&&&&&&& &&&&&&%’°°!’0U±% C3 C‡ B¦ A¨  B¦ A¨&0V± &%0W±0X±&%1234°°X&&&&&&&& &&&&&&%’°°!’0Y±% A Cw C A  C A&0Z± &%0[±0\±&%Nr. of future songs:°2°\&&&&&&&& &&&&&&%’°°!’0]±% C3 Cw B¦ A¨  B¦ A¨&0^± &%0_±0`±&%1234°°`&&&&&&&& &&&&&&%’°°!’0a±% A C[ C| A¸  C| A¸&0b± &%0c±0d±&%Rating based feed:°K°&&&&&&&&&&&&&&%’0e±&0f±&°O&&& &&0g±% A CD C A  C A&0h± &%0i±0j±&%Minimum rating:°2°j&&&&&&&& &&&&&&%’°°!’0k±% A C- C A  C A&0l± &%0m±0n±&%Maximum rating:°2°n&&&&&&&& &&&&&&%’°°!’0o±% C3 C- B¦ A  B¦ A&0p± &0q±% ?€ Aˆ B¢   B¢ &0r± &0s±%  B¢ C!  B¢ C!&0t± &%0u±0v±&°&&&&&&&&&&&&&&0w± &0x±0y±& % maxrating B¢ A  GÃP0z±0{±& % MaxRating°°{&&&&&&&& &&&&&&%’°°0|±°v°&&&&&&&& &&&&&&%’°°!°#°%0}±%  B¢ A°  B¢ A°&0~± &0±% @ @ A˜ A°  A˜ A°&0€± &%% A€’ @  @0± &°%0‚±% ?€ ?€ B¢ A€  B¢ A€&0ƒ± &°}°%°q% A A A A °‚0„±% A C C| A€  C| A€&0…± &%0†±0‡±&%Include unrated songs:°K°&&&&&&&&&&&&&&%’0ˆ±&0‰±&°O&&& &&0б°°0‹±&% windowBackgroundColor0Œ±&%Window0±&%Playlist Inspector° @@ B F@ F@%&   D€ D@0ޱ &0± &01 NSMutableDictionary1! NSDictionary&0‘±& % TextField(0)°.0’±&%TableColumn(3)0“±0”±&%column2 BT A  GÃP0•±0–±&% °°–&&&&&&&& &&&&&&%’°°0—±°v°&&&&&&&& &&&&&&%’°°!0˜±& % TextField(7)°U0™±&% NSOwner0š±&%PlaylistInspector0›±& % TextField(10)°g0œ±& % TextField(2)°70±& % TextField(9)°]0ž±& % ScrollView(0)°0Ÿ±&%TableColumn(0)°0 ±& % TextField(4)°?0¡±& % TableView(1)°s0¢±& % Button(1)°a0£±& % InspectorWin°0¤±&%TableColumn(2)°x0¥±& % TextField(6)°Q0¦±&%View(0)°0§±& % TextField(1)°30¨±& % TextField(8)°Y0©±& % TextField(11)°k0ª±& % TableView(0)° 0«±& % TextField(3)°;0¬±& % Button(0)°G0­±& % ScrollView(1)°o0®±& % Button(2)°„0¯±& % TextField(5)°C0°±&%TableColumn(1)0±±0²±&%column2 BT A  GÃP0³±0´±&% °°´&&&&&&&& &&&&&&%’0µ±°0¶±&%System0·±&%controlHighlightColor0¸±°°0¹±&% controlTextColor0º±°°&&&&&&&& &&&&&&%’°°!0»± &110¼1"NSNibConnector°£0½±&% NSOwner0¾±"°¦°£0¿1#NSNibOutletConnector°½°£0À±&%window0Á±"°ž°¦0±"°ª°ž0ñ"°Ÿ°ª0ı"°°°ª0ű#°ª°½0Ʊ& % dataSource0DZ#°ª°½0ȱ&%delegate0ɱ"°‘°¦0ʱ"°§°¦0˱"°œ°¦0̱"°«°¦0ͱ"° °¦0α"°¯°¦0ϱ"°¬°¦0б"°¥°¦0ѱ"°˜°¦0Ò±"°¨°¦0Ó±"°°¦0Ô±"°¢°¦0Õ±"°›°¦0Ö±"°©°¦0×±"°­°¦0ر"°¡°­0Ù±"°¤°¡0Ú±"°’°¡0Û±#°½°§0ܱ&%nrOfSongsInPlaylist0ݱ#°½°«0Þ±& % currentSongNr0ß±#°½°¯0à±&%playlistPlayingTime0á±#°½°¬0â±&%randomPlaylistFeed0ã±#°½°˜0ä±& % nrPlayedSongs0å±#°½°0æ±& % nrNewSongs0ç±#°½°¢0è±&%ratingBasedFeed0é±#°¡°½0ê±& % dataSource0ë±#°¡°½0ì±&%delegate0í±#°½°¡0î±&%maxRatingStars0ï±#°½°ª0ð±&%minRatingStars0ñ1$NSNibControlConnector°¢°½0ò±&%ratingBasedFeedStateChanged:0ó±$°˜°½0ô±&%nrOfOldSongsToKeepChanged:0õ±$°°½0ö±&%nrOfFutureSongsChanged:0÷±$°¬°½0ø±&%randomPlaylistFeedStateChanged:0ù±"°®°¦0ú±#°½°›0û±& % minRatingText0ü±#°½°©0ý±& % maxRatingText0þ±#°½°®0ÿ±&%includeUnratedSongsP±$°®°½P±&%includeUnratedSongsChanged:P±#°½°¥P±&%nrOfPlayedSongsTextP±#°½°¨P±&%nrOfNewSongsTextP± &MPDCon-1.5.1/Resources/PlaylistViewer.gorm/0000755000175000017500000000000012244352107020646 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/PlaylistViewer.gorm/Current.tiff0000644000175000017500000000210211716254206023141 0ustar sebastiasebastiaII*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþö þ@2:(R/Users/mrsanders/Current.tiffCreated with The GIMPHHMPDCon-1.5.1/Resources/PlaylistViewer.gorm/data.classes0000644000175000017500000000152711716254206023147 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; BoldCell = { Actions = ( ); Outlets = ( ); Super = NSTextFieldCell; }; FirstResponder = { Actions = ( "browseCollection:", "doubleClick:", "filterList:", "managePlaylists:", "clearFilter:", "removeSongs:", "showCurrentSong:", "shuffleList:" ); Super = NSObject; }; OwnTableView = { Actions = ( ); Outlets = ( ); Super = NSTableView; }; PlaylistController = { Actions = ( "doubleClick:", "showCurrentSong:", "managePlaylists:", "removeSongs:", "browseCollection:", "shuffleList:", "filterList:", "clearFilter:" ); Outlets = ( playlistTable, lengthView, playlistSelector, removeSelector, filterField ); Super = NSWindowController; }; }MPDCon-1.5.1/Resources/PlaylistViewer.gorm/data.info0000644000175000017500000000027012030336304022425 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/PlaylistViewer.gorm/objects.gorm0000644000175000017500000003463412043454774023211 0ustar sebastiasebastiaGNUstep archive00003070:0000002f:0000014b:00000003:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A D! D€& % D@ DuÀ01 NSView% ?€ A D! D€  D! D€&01 NSMutableArray1 NSArray&01 NSScrollView% BŽ D! Cá  D! Cá&0± &0 1 NSClipView% A˜ A° D@ CÌ€  D@ CÌ€&0 ± &0 1GSControlTemplate0 ±& % OwnTableView1 NSTableView1 NSControl%  D@ CÌ€  D@ CÌ€&0 ± &%01NSCell0±&01NSFont%&&&&&&&&&&&&&&0± &01 NSTableColumn0±&%play A¸ A  GÃP01NSTableHeaderCell1NSTextFieldCell1 NSActionCell0±&0±% °&&&&&&&& &&&&&&%’01NSColor0±&% NSNamedColorSpace0±&% System0±&% controlShadowColor0±°°0±&% windowFrameTextColor01 NSImageCell0±&%nine°°&&&&&&&&&&&&&&%%% 0±0 ±&%pos B¬ A  GÃP0!±0"±&%#°°"&&&&&&&& &&&&&&%’°°0#±°°°&&&&&&&& &&&&&&%’0$±°0%±&%System0&±&%textBackgroundColor0'±°°%0(±& % textColor0)±0*±&%artist B¬ A  GÃP0+±0,±&%Artist°°,&&&&&&&& &&&&&&%’°°0-1GSObjectTemplate0.±&%BoldCell±°°°&&&&&&&& &&&&&&%’°$°'0/±00±&%title B¬ A  GÃP01±02±&%Title°&&&&&&&& &&&&&&%’°°03±°°°&&&&&&&& &&&&&&%’°$°'04±05±&%album B® A  GÃP06±07±&%Album°&&&&&&&& &&&&&&%’°°08±°°°&&&&&&&& &&&&&&%’°$°'09±0:±&%time B® A  GÃP0;±0<±&%Time°°<&&&&&&&& &&&&&&%’°°0=±0>±&%BoldCell±0?±&°&&&&&&&& &&&&&&%’°$°'0@±0A±&%genre B® A  GÃP0B±0C±&%Genre°°C&&&&&&&& &&&&&&%’0D±°°0E±&% controlHighlightColor0F±°°0G±&% controlTextColor0H±0I±&%BoldCell±0J±&°&&&&&&&& &&&&&&%’°$°'0K1NSSortDescriptor0L±&2compare:0M±0N±&%rating B® A  GÃP0O±0P±&%Rating°°P&&&&&&&& &&&&&&%’°°0Q±0R±&°&&&&&&&& &&&&&&%’°$°'0S±°°0T±& %  gridColor0U±°°0V±&% controlBackgroundColor0W1NSTableHeaderView%  D@ A°  D@ A°&0X± &0Y1GSTableCornerView%  A˜ A°  A˜ A°&0Z± &%% A€’ @ @@0[± &0\±0]±&²0^±0_±&%a2dfsdsf°U0`1 NSScroller% A° A CÖ  A CÖ&0a± &%0b±°°&&&&&&&&&&&&&&&°2 _doScroll:v12@0:4@80c±% A˜  D@ A°  D@ A°&0d± &°W0e±°°0f±& %  controlColor0g±% A˜ CØ D@ A  D@ A&0h± &%0i±0j±&°&&&&&&&&&&&&&&&°²°Y° % A A A A °g°`°c0k1 NSTextField% C¶ @  C‡ A˜  C‡ A˜&!0l± &%0m±0n±&%Playlist Length:0o±% A`&&&&&&&& &&&&&&%’°$°'’0p1!NSButton% A @  C AÀ  C AÀ&$0q± &%0r1" NSButtonCell0s±&%Show current Song°&&&&&&&&&&&&&&%’0t±&0u±&&&& &&0v1# NSPopUpButton% Cà€ D€ CC A   CC A & 0w± &%0x1$NSPopUpButtonCell1%NSMenuItemCell0y±&°&&&&&&&&0z1&NSMenu0{±&0|± &0}1' NSMenuItem0~±&%Remove0±&&&ÿ%0€1(NSImage0±&% common_3DArrowDown’%0‚±'0ƒ±&%All°&&ÿ%’%0„±'0…±& % Selection0†±&&&ÿ%’%&&&&&&%’0‡±&0ˆ±&&&& &&°}°z%%%%%0‰±!% C D€ BÞ A   BÞ A & 0б &%0‹±"0Œ±&%Browse Collection°&&&&&&&&&&&&&&%’0±&0ޱ&&&& &&0±!% A DÀ Bè A˜  Bè A˜& 0± &%0‘±"0’±&%Manage playlists°&&&&&&&&&&&&&&%’0“±&0”±&&&& &&0•±!% C @  B¨ AÀ  B¨ AÀ&$0–± &%0—±"0˜±& % Shuffle List°&&&&&&&&&&&&&&%’0™±&0š±&&&& &&0›1)NSBox% B D! B  D! B&"0œ± &0± % @à @à D€ A¸  D€ A¸&0ž± &0Ÿ± % @ B A  B A&$0 ± &%0¡±0¢±&%Filter:0£±% A@°¢&&&&&&&& &&&&&&%’°$°'’0¤± % B4 @ D€ A¨  D€ A¨&"0¥± &%0¦±0§±&°°§&&&&&&&& &&&&&&%’°$°'’0¨±!% D ¿€ B( AÀ  B( AÀ&!0©± &%0ª±"0«±&%Clear°0¬±&%Clear&&&&&&&&&&&&&&%’0­±&0®±&&&& &&0¯±0°±&%Title°&&&&&&&&&&&&&& @  @ %%0±±°°0²±&% windowBackgroundColor0³±&%Window0´±&%Current Playlist°´ C〠CH F@ F@%0µ±(0¶±&% NSApplicationIcon&   Dð D–0·± &0¸± &0¹1*NSMutableDictionary1+ NSDictionary&,0º±& % TableColumn°0»±&%Button°p0¼±& % TextField°k0½±&%TextFieldCell(9)0¾±°>±°?°&&&&&&&& &&&&&&%’°$°'0¿±&%TextFieldCell(8)0À±°>±°?°&&&&&&&& &&&&&&%’°$°'0Á±&%TextFieldCell(7)°=0±&%TextFieldCell(16)°H0ñ&%TextFieldCell(15)0ı°I±°J°&&&&&&&& &&&&&&%’°$°'0ű&%TextFieldCell(6)0Ʊ°>±°?°&&&&&&&& &&&&&&%’°$°'0DZ&%TextFieldCell(5)0ȱ°>±°?°&&&&&&&& &&&&&&%’°$°'0ɱ&%TextFieldCell(14)0ʱ°>±°?°&&&&&&&& &&&&&&%’°$°'0˱& % TextFieldCell0̱°.±0ͱ&%nine°°Í&&&&&&&& &&&&&&%’°$°'0α&%TextFieldCell1°-0ϱ&%TextFieldCell(13)0б°>±°?°&&&&&&&& &&&&&&%’°$°'0ѱ&%TextFieldCell(4)0Ò±°>±°?°&&&&&&&& &&&&&&%’°$°'0Ó±&%TextFieldCell20Ô±°.±°Í°°Í&&&&&&&& &&&&&&%’°$°'0Õ±& % ScrollView°0Ö±&%PlaylistWindow°0×±&%TextFieldCell30ر°.±°°°&&&&&&&& &&&&&&%’°$°'0Ù±&%TextFieldCell(12)0Ú±°>±°?°&&&&&&&& &&&&&&%’°$°'0Û±&%TextFieldCell(3)0ܱ°>±°?°&&&&&&&& &&&&&&%’°$°'0ݱ&%Box°›0Þ±& % TextField1°Ÿ0ß±&%TextFieldCell(11)0à±°>±°?°&&&&&&&& &&&&&&%’°$°'0á±&%TextFieldCell(2)0â±°>±°?°&&&&&&&& &&&&&&%’°$°'0ã±& % TextField2°¤0ä±&%TextFieldCell(1)0å±°>±°?°&&&&&&&& &&&&&&%’°$°'0æ±&%GormNSTableView° 0ç±&%TextFieldCell(10)0è±°>±°?°&&&&&&&& &&&&&&%’°$°'0é±& % MenuItem(0)°„0ê±&%TextFieldCell(0)0ë±°>±°?°&&&&&&&& &&&&&&%’°$°'0ì±&% NSOwner0í±&%PlaylistController0î±&%GormNSPopUpButton1°v0ï±& % TableColumn1°)0ð±& % MenuItem10ñ±'0ò±&%Item 20ó±&&&ÿ%’%0ô±&%MenuItem0õ±'0ö±& % Playlists°ó&&ÿ%°€’%0÷±& % MenuItem20ø±'0ù±&%Item 3°ó&&ÿ%’%0ú±&%Button1°‰0û±& % MenuItem3°}0ü±&%Button2°0ý±& % MenuItem4°‚0þ±&%Button3°•0ÿ±&%View°P±&%Button4°¨P± &99P1,NSNibConnector°ÖP±&% NSOwnerP±,°ÕP±,°æP±,°ºP±,°ïP±,°¼P ±,°»P ±,°ôP ±,°ðP ±,°÷P ±,°îÐP±,°ûP±,°ýP±,°úP±,°üP±,°þÐP1-NSNibOutletConnectorаÖP±&%windowP±,°Ë°ïP±,°Î°ïP±,°ÓP±,°×P±-аîP1.NSMutableString&%removeSelectorP±-а¼P±.& % lengthViewP1/NSNibControlConnector°üÐP±.&%managePlaylists:P±/°úÐP ±.&%browseCollection:P!±/°»ÐP"±.&%showCurrentSong:P#±/°þÐP$±.& % shuffleList:P%±/°îÐP&±.& % removeSongs:P'±-аæP(±.& % playlistTableP)±-°æÐP*±.&%delegateP+±-°æÐP,±.& % dataSourceP-±,°ã°ÝP.±-аãP/±& % filterFieldP0±/°ãÐP1±& % filterList:P2±,аÝP3±/ÐÐP4±& % clearFilter:P5±,°Þ°ÝP6±,°ÝP7±,°ÿ°ÝP8±,°éP9±,°êP:±,°äP;±,°áP<±,°ÛP=±,°ÑP>±,°ÇP?±,°ÅP@±,°ÁPA±,°¿PB±,°½PC±,°çPD±,°ßPE±,°ÙPF±,°ÏPG±,°ÉPH±,°ÃPI±,°ÂPJ±*&°½°>°á°>°É°>°Î°.°Ó°.°Ñ°>°×°.°Â°I°Å°>°ß°>°ä°>°¿°>°Ï°>°Û°>°Ã°I°Ç°>PK±& % TextFieldCell°.°æ° °ç°>°ê°>°Á°>°Ù°>MPDCon-1.5.1/Resources/PlaylistsManager.gorm/0000755000175000017500000000000012244352107021142 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/PlaylistsManager.gorm/data.classes0000644000175000017500000000077111716254207023444 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "updateLists:", "loadList:", "saveList:", "removeList:" ); Super = NSObject; }; OwnTableView = { Actions = ( ); Outlets = ( ); Super = NSTableView; }; PlaylistsManagerController = { Actions = ( "updateLists:", "loadList:", "saveList:", "removeList:" ); Outlets = ( listView, saveField ); Super = NSWindowController; }; }MPDCon-1.5.1/Resources/PlaylistsManager.gorm/data.info0000644000175000017500000000027011716254207022734 0ustar sebastiasebastiaGNUstep archive00002b5e:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/PlaylistsManager.gorm/objects.gorm0000644000175000017500000001363411716254207023475 0ustar sebastiasebastiaGNUstep archive00002b5e:00000027:00000096:00000001:01GSNibContainer1NSObject01NSMutableDictionary1 NSDictionary& 01NSString&% Button201NSButton1 NSControl1NSView1 NSResponder% C’€ A  B` AÀ  B` AÀ&!01 NSMutableArray1 NSArray&%01 NSButtonCell1 NSActionCell1NSCell0±&% Save01NSFont%&&&&&&&&%’0 ±&0 ±&&&&0 ±&% Button30 ±% Cc B Bt AÀ  Bt AÀ&!0 ± &%0± 0±&% Remove°&&&&&&&&%’0±&0±&&&&0±&%NSOwner0±&% PlaylistsManagerController0±& %  ScrollView01 NSScrollView% Bˆ C³€ Cž  C³€ Cž&0± &01 NSClipView% A¨ AÀ C¨ C‘  C¨ C‘&0± &01GSControlTemplate1GSClassSwapper0±& %  OwnTableView1 NSTableView%  C¨ C!  C¨ C!&0± &%0±0±&°&&&&&&&&0± &01 NSTableColumn0 ±&% column1 C¨ A  GÃP0!1NSTableHeaderCell1NSTextFieldCell0"±& %  Playlists0#±% &&&&&&&&0%’0$1NSColor0%±&%NSNamedColorSpace0&±&%System0'±&%controlShadowColor0(±°%°&0)±&%windowFrameTextColor0*±0+±&%neuf°°+&&&&&&&&0%’0,±°%0-±&% System0.±&% textBackgroundColor0/±°%°-00±& %  textColor01±°%°-02±& %  gridColor03±°%04±&% System05±&% controlBackgroundColor061NSTableHeaderView%  C¨ A°  C¨ A°&07± &081GSTableCornerView% @ @ A˜ A°  A˜ A°&09± &%% A€’ @ @@0:±°%°-0;±&% controlBackgroundColor0<1 NSScroller% @ AÀ A C‘  A C‘&0=± &%0>±°°&&&&&&&&&°2 _doScroll:v12@0:4@80?±% A¨ @ C¨ A°  C¨ A°&0@± &°60A±°%°-0B±& %  controlColor°8°% A A A A °<°?0C±& %  TextField0D1 NSTextField% A AP C‹ A¨  C‹ A¨&"0E± &%0F±0G±&°&&&&&&&&0%’0H±°%0I±&% System0J±&% textBackgroundColor0K±°%°I0L±& %  textColor’0M±&% GSCustomClassMap0N±&0O±&% GormNSTableView°0P±&% Button0Q±% A B B` AÀ  B` AÀ&$0R± &%0S± 0T±&% Update°&&&&&&&&%’0U±&0V±&&&&0W±& %  TableColumn°0X±& %  GormNSPanel0Y1GSWindowTemplate0Z±&%NSPanel1NSPanel1NSWindow%  C³€ CÀ& % C• Dr€0[±%  C³€ CÀ  C³€ CÀ&0\± &°°Q0]±% C’€ B B` AÀ  B` AÀ&!0^± &%0_± 0`±&% Load°&&&&&&&&%’0a±&0b±&&&&°D°° 0c±°%0d±&% System0e±&% windowBackgroundColor0f±&% Window0g±& %  Playlists°g Cz Cz F@ F@%0h1 NSImage0i±&%NSApplicationIcon&   D  D€°O°0j±& %  TableColumn10k±0l±&% column2 CŽ A  GÃP0m±0n±&%  °#&&&&&&&&0%’0o±°%°d0p±&% controlShadowColor0q±°%°-0r±&% windowFrameTextColor0s±0t±&% three°°t&&&&&&&&0%’°,°/0u±&% Button1°]0v± &0w1!NSNibConnector°X°0x±!°0y±!°O0z±!°W0{±!°j0|±!°P0}±!°u0~±!°C0±!°0€1"NSNibOutletConnector°°X0±&% window0‚±!° 0ƒ±"°X°C0„±&% initialFirstResponder0…±"°°O0†1#NSMutableString&% listView0‡±"°°C0ˆ±#& %  saveField0‰1$NSNibControlConnector°P°0б#& %  updateLists:0‹±$° °0Œ±#& %  removeList:0±$°u°0ޱ#& %  loadList:0±$°°0±#& %  saveList:0‘±$°C°°0’±"°O°0“±#& %  dataSource0”±"°O°0•±#&% delegate0–1% GSMutableSet1& NSMutableSet1'NSSet&°YMPDCon-1.5.1/Resources/Preferences.gorm/0000755000175000017500000000000012244352107020124 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/Preferences.gorm/data.classes0000644000175000017500000000071611717240357022427 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "apply:", "revert:", "usePasswordChanged:" ); Super = NSObject; }; PreferencesController = { Actions = ( "apply:", "revert:", "usePasswordChanged:" ); Outlets = ( mpdHost, mpdPort, password, scrollSwitch, usePassword, colorWell, mpdTimeout ); Super = NSWindowController; }; }MPDCon-1.5.1/Resources/Preferences.gorm/data.info0000644000175000017500000000027011717240357021720 0ustar sebastiasebastiaGNUstep archive00009c40:00000003:00000003:00000000:01GormFilePrefsManager1NSObject% 01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/Preferences.gorm/objects.gorm0000644000175000017500000001611611747210172022452 0ustar sebastiasebastiaGNUstep archive00003070:00000021:000000b0:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A C“ C‹€&% D€ D@01 NSView% ?€ A C“ C‹€  C“ C‹€&01 NSMutableArray1 NSArray&01NSButton1 NSControl% Cd @À B` AÀ  B` AÀ&0± &%0 1 NSButtonCell1 NSActionCell1NSCell0 ±&%Apply0 1NSFont%&&&&&&&&&&&&&&%’0 ±&0 ±&&&& &&0±% C' @À B` AÀ  B` AÀ&0± &%0±0±&%Revert° &&&&&&&&&&&&&&%’0±&0±&&&& &&01NSBox% A B  C‰ B¢  C‰ B¢&0± &0± % @à @à C‚ Bp  C‚ Bp&0± &0±% Bº B C& A€  C& A€&0± &%0±0±&%Enable Scrolling of Titles01NSImage01NSMutableString&%common_SwitchOff° &&&&&&&&&&&&&&%’0±&0±&0 ±0!±&%common_SwitchOn&&& &&0"1 NSColorWell% CN @ BT Að  BT Að&0#± &%0$±0%±&° &&&&&&&&&&&&&&0&1NSColor0'±&% NSCalibratedRGBColorSpace ?`»š ?`»š ?`»š ?`»š ?€’0(1 NSTextField% Bì A B¦ A  B¦ A&0)± &%0*1NSTextFieldCell0+±& % Display Color0,±% A@°+&&&&&&&& &&&&&&%’0-±0.±&% NSNamedColorSpace0/±&%System00±&%textBackgroundColor01±°.°/02±& % textColor’03±04±& % Misc Settings° &&&&&&&&&&&&&& @  @ %%05±% A Bò C‰ C  C‰ C&06± &07± % @à @à C‚ Bþ  C‚ Bþ&08± &  09±% ?€ BÊ B¢ A˜  B¢ A˜&0:± &%0;±0<±& % MPD Host:0=±% A`°<&&&&&&&& &&&&&&%’°-°1’0>±% B® BÆ C- A¨  C- A¨&0?± &%0@±0A±&° °A&&&&&&&& &&&&&&%’°-°1’0B±% ?€ B– B¢ A˜  B¢ A˜&0C± &%0D±0E±& % MPD Port:°=°E&&&&&&&& &&&&&&%’°-°1’0F±% B® B’ C- A¨  C- A¨&0G± &%0H±0I±&° °I&&&&&&&& &&&&&&%’°-°1’0J±% C AÐ BØ A€  BØ A€&0K± &%0L±0M±& % Use Password°° &&&&&&&&&&&&&&%’0N±&0O±&° &&& &&0P±% ?€  B¤ A  B¤ A&0Q± &%0R±0S±& % Password:°=&&&&&&&& &&&&&&%’°-°1’0T1GSControlTemplate0U±&%NSSecureTextField±% B®  C- A¨  C- A¨&0V± &%0W1NSSecureTextFieldCell0X±&° &&&&&&&& &&&&&&%’0Y±0Z±&% NSCalibratedWhiteColorSpace ?€ ?€°1’0[±% BD BÔ A˜  BÔ A˜&0\± &%0]±0^±&%Timeout in ms:°=°^&&&&&&&& &&&&&&%’°-°1’0_±% C B< BØ A¨  BØ A¨&0`± &%0a±0b±&° °b&&&&&&&& &&&&&&%’°-°1’0c±0d±& % MPD Settings° &&&&&&&&&&&&&& @  @ %%0e±°.0f±&% System0g±&% windowBackgroundColor0h±&%Window0i±& % Preferences°i ?€ B F@ F@%0j±0k±&% NSApplicationIcon&   D€ D@0l± &0m± &0n1NSMutableDictionary1 NSDictionary&0o±&%Button2°0p±&%Button3°J0q±&% NSOwner0r±&%PreferencesController0s±&%Box2°0t±& % TextField1°B0u±& % TextField2°>0v±& % TextField(1)°_0w±& % TextField°90x±& % TextField3°F0y±& % TextField4°P0z±& % TextField5°T0{±& % TextField6°(0|±&%Button°0}±& % GormNSPanel°0~±&%Box°50±& % TextField(0)°[0€±& % ColorWell°"0±&%Button1°0‚± &0ƒ1NSNibConnector°}°q0„±°u°q0…±°x°q0†±°|0‡±°0ˆ1 NSNibOutletConnector°q°}0‰±&%window0б °u°x0‹±& % nextKeyView0Œ±°o0±°s0ޱ°p0±°y0±°z0‘±°~0’± °z°u0“±& % nextKeyView0”± °q°u0•±&%mpdHost0–± °q°x0—±&%mpdPort0˜± °q°z0™±&%password0š± °q°o0›±& % scrollSwitch0œ1!NSNibControlConnector°|°q0±&%apply:0ž±!°°q0Ÿ±&%revert:0 ±!°p°q0¡±&%usePasswordChanged:0¢±°€0£±°{0¤± °q°€0¥±& % colorWell0¦± °q°p0§±& % usePassword0¨±°0©±°v0ª± °x°v0«±& % nextKeyView0¬± °v°z0­±& % nextKeyView0®± °q°v0¯±& % mpdTimeout0°±&°z°UMPDCon-1.5.1/Resources/SongInspector.gorm/0000755000175000017500000000000012244352107020460 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/SongInspector.gorm/data.classes0000644000175000017500000000045612030335302022744 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; SongInspector = { Actions = ( ); Outlets = ( album, artist, composer, date, disc, genre, filename, comment, performer, title, track ); Super = NSWindowController; }; }MPDCon-1.5.1/Resources/SongInspector.gorm/data.info0000644000175000017500000000027012030335302022234 0ustar sebastiasebastiaGNUstep archive00003070:00000003:00000003:00000000:01GormFilePrefsManager1NSObject%01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/SongInspector.gorm/objects.gorm0000644000175000017500000001314312030337303022773 0ustar sebastiasebastiaGNUstep archive00003070:00000018:0000008a:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A Cˆ CÂ&% C¿ D€01 NSView% ?€ A Cˆ C  Cˆ CÂ&01 NSMutableArray1 NSArray&01 NSTextField1 NSControl% A0 C¯ C| Aà  C| Aà&0± &%0 1NSTextFieldCell1 NSActionCell1NSCell0 ±&%Artist0 1NSFont% A@° &&&&&&&& &&&&&&%’0 1NSColor0 ±&% NSNamedColorSpace0±&%System0±&%textBackgroundColor0±° °0±& % textColor’0±% A C¡ C| Aà  C| Aà&0± &%0±0±&%Title° °&&&&&&&& &&&&&&%’° °’0±% A C’ C| Að  C| Að&0± &%0±0±&%Album° °&&&&&&&& &&&&&&%’° °’0±% BD C‰ B A  B A&0± &%0±0±&%Nr° °&&&&&&&& &&&&&&%’° °’0±% A C€ C| A  C| A&0± &%0 ±0!±&%Genre° °!&&&&&&&& &&&&&&%’° °’0"±% C< C‰ B” A  B” A&0#± &%0$±0%±&%Date° °%&&&&&&&& &&&&&&%’° °’0&±% A Cn Cy A  Cy A&0'± &%0(±0)±&%Composer° °)&&&&&&&& &&&&&&%’° °’0*±% A0 C\ Cy A  Cy A&0+± &%0,±0-±& % Performer° °-&&&&&&&& &&&&&&%’° °’0.±% A0 A  C| C  C| C&0/± &%00±01±&%comment° °1&&&&&&&& &&&&&&%’° °’02±% Bô C‰ Aè A  Aè A&03± &%04±05±&%Nr.° °5&&&&&&&& &&&&&&%’° °’06±% A C Cx Bx  Cx Bx&07± &%08±09±&%Filename° °9&&&&&&&& &&&&&&%’° °’0:±% A C‰ B A  B A&0;± &%0<±0=±&%Track:° °=&&&&&&&& &&&&&&%’° °’0>±% B¬ C‰ B A  B A&0?± &%0@±0A±&%Disc:° °A&&&&&&&& &&&&&&%’° °’0B±% C C‰ B A  B A&0C± &%0D±0E±&%Date:° °E&&&&&&&& &&&&&&%’° °’0F±° 0G±&% System0H±&% windowBackgroundColor0I±&%Window0J±&%Song Inspector°J @@ B F@ F@%&   D€ D@0K± &0L± &0M1NSMutableDictionary1 NSDictionary&0N±& % TextField(10)°60O±& % TextField(6)°&0P±& % TextField(12)°>0Q±& % TextField(8)°.0R±&% NSOwner0S±& % SongInspector0T±& % TextField(1)°0U±& % TextField(3)°0V±& % TextField(5)°"0W±& % TextField(11)°:0X±& % TextField(7)°*0Y±& % TextField(13)°B0Z±& % TextField(9)°20[±&%View(0)°0\±& % TextField(0)°0]±& % InspectorWin°0^±& % TextField(2)°0_±& % TextField(4)°0`± &0a1NSNibConnector°]0b±&% NSOwner0c±°[°]0d±°\°[0e±°T°[0f±°^°[0g±°U°[0h±°_°[0i±°V°[0j±°O°[0k±°X°[0l±°Q°[0m±°Z°[0n±°N°[0o1NSNibOutletConnector°b°\0p±&%artist0q±°b°T0r±&%title0s±°b°^0t±&%album0u±°b°U0v±&%track0w±°b°_0x±&%genre0y±°b°V0z±&%date0{±°b°O0|±&%composer0}±°b°X0~±& % performer0±°b°Z0€±&%disc0±°b°N0‚±&%filename0ƒ±°b°Q0„±&%comment0…±°b°]0†±&%window0‡±°W°[0ˆ±°P°[0‰±°Y°[0б&MPDCon-1.5.1/Resources/StatisticsViewer.gorm/0000755000175000017500000000000012244352107021177 5ustar sebastiasebastiaMPDCon-1.5.1/Resources/StatisticsViewer.gorm/data.classes0000644000175000017500000000065311716254207023500 0ustar sebastiasebastia{ "## Comment" = "Do NOT change this file, Gorm maintains it"; FirstResponder = { Actions = ( "closeWindow:", "updateStatistics:" ); Super = NSObject; }; StatisticsController = { Actions = ( "closeWindow:", "updateStatistics:" ); Outlets = ( songs, artists, albums, uptime, playtime, dbPlaytime, dbUpdatetime ); Super = NSWindowController; }; }MPDCon-1.5.1/Resources/StatisticsViewer.gorm/data.info0000644000175000017500000000027011717240360022765 0ustar sebastiasebastiaGNUstep archive00009c40:00000003:00000003:00000000:01GormFilePrefsManager1NSObject% 01NSString&%Latest Version0±& % Typed StreamMPDCon-1.5.1/Resources/StatisticsViewer.gorm/objects.gorm0000644000175000017500000001644211747210172023527 0ustar sebastiasebastiaGNUstep archive00003070:0000001e:000000af:00000000:01GSNibContainer1NSObject01 NSMutableSet1NSSet&01GSWindowTemplate1GSClassSwapper01NSString&% NSPanel1NSPanel1 NSWindow1 NSResponder% ?€ A C« C€&% C` D@01 NSView% ?€ A C« C€  C« C€&01 NSMutableArray1 NSArray&01NSBox% A C9 C € B¸  C € B¸&0± &0 ± % @à @à C™€ BŽ  C™€ BŽ&0 ± &0 1 NSTextField1 NSControl% B8 B` A  B` A&0 ± &%0 1NSTextFieldCell1 NSActionCell1NSCell0±&%Artists:01NSFont% A`°&&&&&&&& &&&&&&%’01NSColor0±&% NSNamedColorSpace0±&%System0±&%textBackgroundColor0±°°0±& % textColor’0±% A¸ B‚ A  B‚ A&0± &%0±0±&%Albums:°&&&&&&&& &&&&&&%’°°’0±%  B‚ A  B‚ A&0± &%0±0±&%Songs:°&&&&&&&& &&&&&&%’°°’0±% BŒ B8 Cg A  Cg A&0± &%0 ±0!±&°&&&&&&&& &&&&&&%’°°’0"±% BŒ A¸ Cg A  Cg A&0#± &%0$±0%±&°&&&&&&&& &&&&&&%’°°’0&±% BŒ  Cg A  Cg A&0'± &%0(±0)±&°&&&&&&&& &&&&&&%’°°’0*±0+±& % Collection0,±%&&&&&&&&&&&&&& @  @ %%0-±% A BÞ C € BŠ  C € BŠ&0.± &0/± % @à @à C™€ B@  C™€ B@&00± &01±% A¸ B‚ A  B‚ A&02± &%03±04±&%Uptime:°°4&&&&&&&& &&&&&&%’°°’05±%  BŒ A  BŒ A&06± &%07±08±& % Playtime:°&&&&&&&& &&&&&&%’°°’09±% BŒ A¸ Ci A  Ci A&0:± &%0;±0<±&°&&&&&&&& &&&&&&%’°°’0=±% BŒ  Ci A  Ci A&0>± &%0?±0@±&°&&&&&&&& &&&&&&%’°°’0A±0B±&%Server°,&&&&&&&&&&&&&& @  @ %%0C±% A B C € BŠ  C € BŠ&0D± &0E± % @à @à C™€ B@  C™€ B@&0F± &0G±% A¸ B° A  B° A&0H± &%0I±0J±& % Updatetime:°°J&&&&&&&& &&&&&&%’°°’0K±%  B° A  B° A&0L± &%0M±0N±& % Playtime:°&&&&&&&& &&&&&&%’°°’0O±% B¢ A¸ C_ A  C_ A&0P± &%0Q±0R±&°&&&&&&&& &&&&&&%’°°’0S±% B¢  C_ A  C_ A&0T± &%0U±0V±&°&&&&&&&& &&&&&&%’°°’0W±0X±&%Database°,&&&&&&&&&&&&&& @  @ %%0Y1NSButton% C‰€ A B` AÀ  B` AÀ&0Z± &%0[1 NSButtonCell0\±&%Close°,&&&&&&&&&&&&&&%’0]±&0^±&&&& &&0_±% A A B` AÀ  B` AÀ&0`± &%0a±0b±&%Update°,&&&&&&&&&&&&&&%’0c±&0d±&&&& &&0e±°0f±&% System0g±&% windowBackgroundColor0h±&%Window0i±&%Server Statistics°i ?€ B F@ F@%0j1NSImage0k±&% NSApplicationIcon&   D€ D@0l± &0m± &0n1NSMutableDictionary1 NSDictionary&0o±& % GormNSPanel°0p±& % TextField7°50q±&% NSOwner0r±&%StatisticsController0s±& % TextField8°90t±& % TextField° 0u±& % TextField9°=0v±&%Button°Y0w±& % TextField10°G0x±& % TextField11°K0y±& % TextField12°O0z±& % TextField13°S0{±&%Box°0|±& % TextField1°0}±& % TextField2°0~±&%Button1°_0±& % TextField3°0€±& % TextField4°"0±& % TextField5°&0‚±&%Box1°-0ƒ±& % TextField6°10„±&%Box2°C0…± &0†1NSNibConnector°o0‡±&% NSOwner0ˆ±°t0‰±°|0б°}0‹±°0Œ±°€°‡0±°°‡0ޱ°ƒ0±°p0±°s°‡0‘±°u°‡0’±°w°‡0“±°x°‡0”±°y°‡0•±°z°‡0–±°{0—±°‚0˜±°„0™±°v0š1NSNibOutletConnector°‡°o0›±&%window0œ±°~0±°‡°0ž1NSMutableString&%artists0Ÿ±°‡°€0 ±&%albums0¡±°‡°0¢±&%songs0£±°‡°s0¤±&%uptime0¥±°‡°u0¦±&%playtime0§±°‡°y0¨±& % dbUpdatetime0©±°‡°z0ª±& % dbPlaytime0«1NSNibControlConnector°~°‡0¬±&%updateStatistics:0­±°v°‡0®±& % closeWindow:0¯±&