From: <ste...@us...> - 2010-01-16 11:43:42
|
Revision: 1484 http://vienna-rss.svn.sourceforge.net/vienna-rss/?rev=1484&view=rev Author: stevewpalmer Date: 2010-01-16 11:43:27 +0000 (Sat, 16 Jan 2010) Log Message: ----------- Add viennaplugin support for packaging up plugins. Added a couple of new strings that need to be localized. Viennaplugin icon is temporary and needs to be replaced. Modified Paths: -------------- trunk/2.5.0/AppController.m trunk/2.5.0/Info.plist trunk/2.5.0/PluginManager.h trunk/2.5.0/PluginManager.m trunk/2.5.0/Vienna.xcodeproj/project.pbxproj trunk/2.5.0/cs.lproj/Localizable.strings trunk/2.5.0/da.lproj/Localizable.strings trunk/2.5.0/de.lproj/Localizable.strings trunk/2.5.0/en.lproj/Localizable.strings trunk/2.5.0/es.lproj/Localizable.strings trunk/2.5.0/eus.lproj/Localizable.strings trunk/2.5.0/fr.lproj/Localizable.strings trunk/2.5.0/it.lproj/Localizable.strings trunk/2.5.0/ja.lproj/Localizable.strings trunk/2.5.0/ko.lproj/Localizable.strings trunk/2.5.0/nl.lproj/Localizable.strings trunk/2.5.0/pt.lproj/Localizable.strings trunk/2.5.0/pt_BR.lproj/Localizable.strings trunk/2.5.0/ru.lproj/Localizable.strings trunk/2.5.0/sv.lproj/Localizable.strings trunk/2.5.0/tr.lproj/Localizable.strings trunk/2.5.0/uk.lproj/Localizable.strings trunk/2.5.0/zh_CN.lproj/Localizable.strings trunk/2.5.0/zh_TW.lproj/Localizable.strings Added Paths: ----------- trunk/2.5.0/vienna2plugin.icns Modified: trunk/2.5.0/AppController.m =================================================================== --- trunk/2.5.0/AppController.m 2010-01-16 02:17:11 UTC (rev 1483) +++ trunk/2.5.0/AppController.m 2010-01-16 11:43:27 UTC (rev 1484) @@ -60,54 +60,55 @@ #include <IOKit/IOMessage.h> @interface AppController (Private) --(NSMenu *)searchFieldMenu; --(void)installSleepHandler; --(void)installScriptsFolderWatcher; --(void)handleTabChange:(NSNotification *)nc; --(void)handleFolderSelection:(NSNotification *)nc; --(void)handleCheckFrequencyChange:(NSNotification *)nc; --(void)handleFolderNameChange:(NSNotification *)nc; --(void)handleDidBecomeKeyWindow:(NSNotification *)nc; --(void)handleReloadPreferences:(NSNotification *)nc; --(void)handleShowAppInStatusBar:(NSNotification *)nc; --(void)handleShowStatusBar:(NSNotification *)nc; --(void)handleShowFilterBar:(NSNotification *)nc; --(void)setAppStatusBarIcon; --(void)localiseMenus:(NSArray *)arrayOfMenus; --(void)updateNewArticlesNotification; --(void)showAppInStatusBar; --(void)initSortMenu; --(void)initColumnsMenu; --(void)initBlogWithMenu; --(void)initScriptsMenu; --(void)initFiltersMenu; --(NSMenu *)getStylesMenu; --(void)startProgressIndicator; --(void)stopProgressIndicator; --(void)doEditFolder:(Folder *)folder; --(void)refreshOnTimer:(NSTimer *)aTimer; --(void)setStatusBarState:(BOOL)isVisible withAnimation:(BOOL)doAnimate; --(void)setFilterBarState:(BOOL)isVisible withAnimation:(BOOL)doAnimate; --(void)setPersistedFilterBarState:(BOOL)isVisible withAnimation:(BOOL)doAnimate; --(void)doConfirmedDelete:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; --(void)doConfirmedEmptyTrash:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; --(void)runAppleScript:(NSString *)scriptName; --(NSString *)appName; --(void)sendBlogEvent:(NSString *)externalEditorBundleIdentifier title:(NSString *)title url:(NSString *)url body:(NSString *)body author:(NSString *)author guid:(NSString *)guid; --(void)setLayout:(int)newLayout withRefresh:(BOOL)refreshFlag; --(void)updateAlternateMenuTitle; --(void)updateSearchPlaceholder; --(void)toggleOptionKeyButtonStates; --(FoldersTree *)foldersTree; --(void)updateCloseCommands; --(void)loadOpenTabs; --(BOOL)isFilterBarVisible; --(BOOL)isStatusBarVisible; --(NSDictionary *)registrationDictionaryForGrowl; --(NSTimer *)checkTimer; --(ToolbarItem *)toolbarItemWithIdentifier:(NSString *)theIdentifier; --(void)searchArticlesWithString:(NSString *)searchString; --(void)sourceWindowWillClose:(NSNotification *)notification; + -(NSMenu *)searchFieldMenu; + -(void)installSleepHandler; + -(void)installScriptsFolderWatcher; + -(void)handleTabChange:(NSNotification *)nc; + -(void)handleFolderSelection:(NSNotification *)nc; + -(void)handleCheckFrequencyChange:(NSNotification *)nc; + -(void)handleFolderNameChange:(NSNotification *)nc; + -(void)handleDidBecomeKeyWindow:(NSNotification *)nc; + -(void)handleReloadPreferences:(NSNotification *)nc; + -(void)handleShowAppInStatusBar:(NSNotification *)nc; + -(void)handleShowStatusBar:(NSNotification *)nc; + -(void)handleShowFilterBar:(NSNotification *)nc; + -(void)setAppStatusBarIcon; + -(void)localiseMenus:(NSArray *)arrayOfMenus; + -(void)updateNewArticlesNotification; + -(void)showAppInStatusBar; + -(void)initSortMenu; + -(void)initColumnsMenu; + -(void)initBlogWithMenu; + -(void)initScriptsMenu; + -(void)initFiltersMenu; + -(NSMenu *)getStylesMenu; + -(void)startProgressIndicator; + -(void)stopProgressIndicator; + -(void)doEditFolder:(Folder *)folder; + -(void)refreshOnTimer:(NSTimer *)aTimer; + -(BOOL)installFilename:(NSString *)srcFile toPath:(NSString *)path; + -(void)setStatusBarState:(BOOL)isVisible withAnimation:(BOOL)doAnimate; + -(void)setFilterBarState:(BOOL)isVisible withAnimation:(BOOL)doAnimate; + -(void)setPersistedFilterBarState:(BOOL)isVisible withAnimation:(BOOL)doAnimate; + -(void)doConfirmedDelete:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; + -(void)doConfirmedEmptyTrash:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; + -(void)runAppleScript:(NSString *)scriptName; + -(NSString *)appName; + -(void)sendBlogEvent:(NSString *)externalEditorBundleIdentifier title:(NSString *)title url:(NSString *)url body:(NSString *)body author:(NSString *)author guid:(NSString *)guid; + -(void)setLayout:(int)newLayout withRefresh:(BOOL)refreshFlag; + -(void)updateAlternateMenuTitle; + -(void)updateSearchPlaceholder; + -(void)toggleOptionKeyButtonStates; + -(FoldersTree *)foldersTree; + -(void)updateCloseCommands; + -(void)loadOpenTabs; + -(BOOL)isFilterBarVisible; + -(BOOL)isStatusBarVisible; + -(NSDictionary *)registrationDictionaryForGrowl; + -(NSTimer *)checkTimer; + -(ToolbarItem *)toolbarItemWithIdentifier:(NSString *)theIdentifier; + -(void)searchArticlesWithString:(NSString *)searchString; + -(void)sourceWindowWillClose:(NSNotification *)notification; @end // Static constant strings that are typically never tweaked @@ -636,24 +637,8 @@ Preferences * prefs = [Preferences standardPreferences]; if ([[filename pathExtension] isEqualToString:@"viennastyle"]) { - NSString * path = [prefs stylesFolder]; NSString * styleName = [[filename lastPathComponent] stringByDeletingPathExtension]; - NSString * fullPath = [path stringByAppendingPathComponent:[filename lastPathComponent]]; - - // Make sure we actually have a Styles folder. - NSFileManager * fileManager = [NSFileManager defaultManager]; - BOOL isDir = NO; - - if (![fileManager fileExistsAtPath:path isDirectory:&isDir]) - { - if (![fileManager createDirectoryAtPath:path attributes:NULL]) - { - runOKAlertPanel(NSLocalizedString(@"Cannot create style folder title", nil), NSLocalizedString(@"Cannot create style folder body", nil), path); - return NO; - } - } - [fileManager removeFileAtPath:fullPath handler:nil]; - if (![fileManager copyPath:filename toPath:fullPath handler:nil]) + if (![self installFilename:filename toPath:[prefs stylesFolder]]) [[Preferences standardPreferences] setDisplayStyle:styleName]; else { @@ -666,25 +651,19 @@ } return YES; } - if ([[filename pathExtension] isEqualToString:@"scpt"]) + if ([[filename pathExtension] isEqualToString:@"viennaplugin"]) { - NSString * path = [prefs scriptsFolder]; - NSString * fullPath = [path stringByAppendingPathComponent:[filename lastPathComponent]]; - - // Make sure we actually have a Scripts folder. - NSFileManager * fileManager = [NSFileManager defaultManager]; - BOOL isDir = NO; - - if (![fileManager fileExistsAtPath:path isDirectory:&isDir]) + NSString * path = [prefs pluginsFolder]; + if ([self installFilename:filename toPath:path]) { - if (![fileManager createDirectoryAtPath:path attributes:NULL]) - { - runOKAlertPanel(NSLocalizedString(@"Cannot create scripts folder title", nil), NSLocalizedString(@"Cannot create scripts folder body", nil), path); - return NO; - } + NSString * fullPath = [path stringByAppendingPathComponent:[filename lastPathComponent]]; + [pluginManager loadPlugin:fullPath]; } - [fileManager removeFileAtPath:fullPath handler:nil]; - if ([fileManager copyPath:filename toPath:fullPath handler:nil]) + return YES; + } + if ([[filename pathExtension] isEqualToString:@"scpt"]) + { + if ([self installFilename:filename toPath:[prefs scriptsFolder]]) { if (!hasOSScriptsMenu()) [self initScriptsMenu]; @@ -700,6 +679,31 @@ return NO; } +/* installFilename + * Copies the folder at srcFile to the specified path. The path is created if it doesn't already exist and + * an error is reported if we fail to create the path. The return value is the result of copying the source + * folder to the new path. + */ +-(BOOL)installFilename:(NSString *)srcFile toPath:(NSString *)path +{ + NSString * fullPath = [path stringByAppendingPathComponent:[srcFile lastPathComponent]]; + + // Make sure we actually have a destination folder. + NSFileManager * fileManager = [NSFileManager defaultManager]; + BOOL isDir = NO; + + if (![fileManager fileExistsAtPath:path isDirectory:&isDir]) + { + if (![fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:NULL error:NULL]) + { + runOKAlertPanel(NSLocalizedString(@"Cannot create folder title", nil), NSLocalizedString(@"Cannot create folder body", nil), path); + return NO; + } + } + [fileManager removeFileAtPath:fullPath handler:nil]; + return [fileManager copyPath:srcFile toPath:fullPath handler:nil]; +} + /* searchFieldMenu * Allocates a popup menu for one of the search fields we use. */ Modified: trunk/2.5.0/Info.plist =================================================================== --- trunk/2.5.0/Info.plist 2010-01-16 02:17:11 UTC (rev 1483) +++ trunk/2.5.0/Info.plist 2010-01-16 11:43:27 UTC (rev 1484) @@ -23,6 +23,20 @@ <string>YES</string> </dict> <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>viennaplugin</string> + </array> + <key>CFBundleTypeIconFile</key> + <string>vienna2plugin.icns</string> + <key>CFBundleTypeName</key> + <string>Vienna Plugin Package</string> + <key>CFBundleTypeRole</key> + <string>Viewer</string> + <key>LSTypeIsPackage</key> + <string>YES</string> + </dict> + <dict> <key>CFBundleTypeExtension</key> <array> <string>scpt</string> Modified: trunk/2.5.0/PluginManager.h =================================================================== --- trunk/2.5.0/PluginManager.h 2010-01-16 02:17:11 UTC (rev 1483) +++ trunk/2.5.0/PluginManager.h 2010-01-16 11:43:27 UTC (rev 1484) @@ -28,5 +28,6 @@ -(void)resetPlugins; -(NSArray *)toolbarItems; -(NSArray *)defaultToolbarItems; +-(void)loadPlugin:(NSString *)pluginPath; -(void)toolbarItem:(ToolbarItem *)item withIdentifier:(NSString *)itemIdentifier; @end Modified: trunk/2.5.0/PluginManager.m =================================================================== --- trunk/2.5.0/PluginManager.m 2010-01-16 02:17:11 UTC (rev 1483) +++ trunk/2.5.0/PluginManager.m 2010-01-16 11:43:27 UTC (rev 1484) @@ -70,24 +70,32 @@ for (pluginName in pluginPaths) { NSString * pluginPath = [pluginPaths objectForKey:pluginName]; - NSString * listFile = [pluginPath stringByAppendingPathComponent:@"info.plist"]; - NSMutableDictionary * pluginInfo = [NSMutableDictionary dictionaryWithContentsOfFile:listFile]; + [self loadPlugin:pluginPath]; + } + + [pluginPaths release]; +} - // If the info.plist is missing or corrupted, warn but then just move on and the user - // will have to figure it out. - if (pluginInfo == nil) - { - NSAssert1(false, @"Missing or corrupt info.plist in %@", pluginPath); - continue; - } - +/* loadPlugin + * Load the plugin at the specified path. + */ +-(void)loadPlugin:(NSString *)pluginPath +{ + NSString * listFile = [pluginPath stringByAppendingPathComponent:@"info.plist"]; + NSString * pluginName = [pluginPath lastPathComponent]; + NSMutableDictionary * pluginInfo = [NSMutableDictionary dictionaryWithContentsOfFile:listFile]; + + // If the info.plist is missing or corrupted, warn but then just move on and the user + // will have to figure it out. + if (pluginInfo == nil) + NSAssert1(false, @"Missing or corrupt info.plist in %@", pluginPath); + else + { // We need to save the path to the plugin in the plugin object for later access to other // resources in the plugin folder. [pluginInfo setObject:pluginPath forKey:@"Path"]; [allPlugins setObject:pluginInfo forKey:pluginName]; } - - [pluginPaths release]; } /* toolbarItems Modified: trunk/2.5.0/Vienna.xcodeproj/project.pbxproj =================================================================== --- trunk/2.5.0/Vienna.xcodeproj/project.pbxproj 2010-01-16 02:17:11 UTC (rev 1483) +++ trunk/2.5.0/Vienna.xcodeproj/project.pbxproj 2010-01-16 11:43:27 UTC (rev 1484) @@ -395,6 +395,7 @@ AA1A2A2E0C09D83B005968DC /* skipFolderButtonPressed.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = skipFolderButtonPressed.tiff; sourceTree = "<group>"; }; AA1A2A320C09D84E005968DC /* subscribeButtonPressed.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = subscribeButtonPressed.tiff; sourceTree = "<group>"; }; AA1A2C2F0C0A1EC1005968DC /* emptyTrashButton.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = emptyTrashButton.tiff; sourceTree = "<group>"; }; + AA1A3DC61100FA6E00F89575 /* vienna2plugin.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vienna2plugin.icns; sourceTree = "<group>"; }; AA20DC9D0882CCC300A226F5 /* unread.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = unread.tiff; sourceTree = "<group>"; }; AA2185010861E7600024DD4A /* TexturedHeader.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = TexturedHeader.m; sourceTree = "<group>"; }; AA2185020861E7600024DD4A /* TexturedHeader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = TexturedHeader.h; sourceTree = "<group>"; }; @@ -1115,6 +1116,7 @@ AA67F3980897377C008BBC37 /* stopRefresh.tiff */, AA34582C084BE802003D992E /* vienna2.icns */, AA4AB5E008971B28006C843E /* vienna2style.icns */, + AA1A3DC61100FA6E00F89575 /* vienna2plugin.icns */, AA2185050861E7E10024DD4A /* metal_column_header.png */, AAB90EFC061D059D00CA4741 /* searchFolder.tiff */, AAFDB7AE0C0B1516000D1643 /* smartFolder.tiff */, Modified: trunk/2.5.0/cs.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/da.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/de.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/en.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/es.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/eus.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/fr.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/it.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/ja.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/ko.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/nl.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/pt.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/pt_BR.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/ru.lproj/Localizable.strings =================================================================== --- trunk/2.5.0/ru.lproj/Localizable.strings 2010-01-16 02:17:11 UTC (rev 1483) +++ trunk/2.5.0/ru.lproj/Localizable.strings 2010-01-16 11:43:27 UTC (rev 1484) @@ -57,8 +57,6 @@ "Refresh all your subscriptions" = "Обновить все подписки"; "New style title" = "Vienna установила новый Стиль"; "New style body" = "Стиль \"%@\" был установлен в папку стилей и добавлен в меню Стиль."; -"Cannot create style folder title" = "Невозможно создать папку Стиля"; -"Cannot create style folder body" = "Невозможно создать папку Стиля в \"%@\". Vienna не сможет установить выбранный Стиль."; "More Styles..." = "Больше Стилей..."; "Delete selected message" = "Вы уверены, что хотите безвозвратно удалить выбранные статьи?"; "Delete selected message text" = "Это действие не может быть отменено."; @@ -188,8 +186,6 @@ "Preferences" = "Настройки"; "General" = "Общие"; "Appearance" = "Внешний Вид"; -"Cannot create scripts folder title" = "Невозможно создать папку скриптов"; -"Cannot create scripts folder body" = "Невозможно создать папку скриптов в \"%@\". Vienna не установит выбранный скрипт."; "Locate Title" = "Невозможно создать базу данных Vienna"; "Locate Text" = "Новая база данных Vienna не может быть создана в \"%@\" из-за того, что папка, возможно, находится на удаленном сервере, а текущая версия Vienna не может работать с удаленными базами данных. Пожалуйста, выберите папку на своем компьютере.\n"; "Empty Trash message" = "Удалить все сообщения в Корзине?"; @@ -397,4 +393,8 @@ "Search all articles or the current web page" = "Search all articles or the current web page"; "Database Upgrade" = "Database Upgrade"; "Vienna must upgrade its database to the latest version. This may take a minute or so. We apologize for the inconveninece." = "Vienna must upgrade its database to the latest version. This may take a minute or so. We apologize for the inconveninece."; -"Upgrade Database" = "Upgrade Database"; \ No newline at end of file +"Upgrade Database" = "Upgrade Database"; + +/* Added in 2.5.0 */ +"Cannot create folder title" = "Cannot create folder"; +"Cannot create folder body" = "The \"%@\" folder cannot be created."; Modified: trunk/2.5.0/sv.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/tr.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/uk.lproj/Localizable.strings =================================================================== (Binary files differ) Added: trunk/2.5.0/vienna2plugin.icns =================================================================== (Binary files differ) Property changes on: trunk/2.5.0/vienna2plugin.icns ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: trunk/2.5.0/zh_CN.lproj/Localizable.strings =================================================================== (Binary files differ) Modified: trunk/2.5.0/zh_TW.lproj/Localizable.strings =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |