diff --git a/Linux/Helper.py b/Linux/Helper.py index 56f132d..e70f96a 100644 --- a/Linux/Helper.py +++ b/Linux/Helper.py @@ -10,119 +10,119 @@ import os import array class WebPage(QtWebKit.QWebPage): - def __init__(self, parent=0, app=None): - super(QtWebKit.QWebPage, self).__init__(parent) - self.setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateExternalLinks) - self.app = app + def __init__(self, parent=0, app=None): + super(QtWebKit.QWebPage, self).__init__(parent) + self.setLinkDelegationPolicy(QtWebKit.QWebPage.DelegateExternalLinks) + self.app = app - def javaScriptConsoleMessage(self, message, lineNumber, sourceId): - print str(message) + " on line: " + str(lineNumber) + " Source: " + str(sourceId) + def javaScriptConsoleMessage(self, message, lineNumber, sourceId): + print str(message) + " on line: " + str(lineNumber) + " Source: " + str(sourceId) - def checkRequest(self, request): - print request + def checkRequest(self, request): + print request class WebViewCreator(QtWebKit.QWebView): - def __init__(self, app, local=True, parent=None): - if parent != None: - QtGui.QWidget.__init__(self) - else: - QtGui.QWidget.__init__(self) + def __init__(self, app, local=True, parent=None): + if parent != None: + QtGui.QWidget.__init__(self) + else: + QtGui.QWidget.__init__(self) - self.app = app - self.is_local = local - self.connect(self, SIGNAL("linkClicked (const QUrl&)"), self.app.controller.openQURL) - self.setPage(WebPage(self, self.app)) - - def load_local(self, callback=None): - self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True) - self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalStorageEnabled, True) - self.loadFinished.connect(lambda ok: self.load_finished(ok, callback)) + self.app = app + self.is_local = local + self.connect(self, SIGNAL("linkClicked (const QUrl&)"), self.app.controller.openQURL) + self.setPage(WebPage(self, self.app)) + + def load_local(self, callback=None): + self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True) + self.page().settings().setAttribute(QtWebKit.QWebSettings.LocalStorageEnabled, True) + self.loadFinished.connect(lambda ok: self.load_finished(ok, callback)) - frame = self.page().mainFrame() - frame.addToJavaScriptWindowObject("controller", self.app.controller) - frame.addToJavaScriptWindowObject("__console", self.app.console) + frame = self.page().mainFrame() + frame.addToJavaScriptWindowObject("controller", self.app.controller) + frame.addToJavaScriptWindowObject("__console", self.app.console) - url = self.app.resources_uri() + "/index.html" - self.load(QtCore.QUrl(url)) + url = self.app.resources_uri() + "/index.html" + self.load(QtCore.QUrl(url)) - def load_url(self, url, callback=None): - self.loadFinished.connect(lambda ok: self.load_finished(ok, callback)) - self.load(QtCore.QUrl(url)) + def load_url(self, url, callback=None): + self.loadFinished.connect(lambda ok: self.load_finished(ok, callback)) + self.load(QtCore.QUrl(url)) - def load_finished(self, ok, callback=None): - frame = self.page().mainFrame() - if self.is_local: - frame.evaluateJavaScript("var OS_TYPE = 'linux';") + def load_finished(self, ok, callback=None): + frame = self.page().mainFrame() + if self.is_local: + frame.evaluateJavaScript("var OS_TYPE = 'linux';") - js_plugin_path = os.path.expanduser('~/.bungloo/Plugin.js') - if os.access(js_plugin_path, os.R_OK): - func = "setTimeout(function() { loadJsPlugin('file://localhost" + js_plugin_path + "') }, 1000);" - frame.evaluateJavaScript(func) + js_plugin_path = os.path.expanduser('~/.bungloo/Plugin.js') + if os.access(js_plugin_path, os.R_OK): + func = "setTimeout(function() { loadJsPlugin('file://localhost" + js_plugin_path + "') }, 1000);" + frame.evaluateJavaScript(func) - css_plugin_path = os.path.expanduser('~/.bungloo/Plugin.css') - if os.access(css_plugin_path, os.R_OK): - func = "setTimeout(function() { loadCssPlugin('file://localhost" + css_plugin_path + "') }, 1000);" - frame.evaluateJavaScript(func) + css_plugin_path = os.path.expanduser('~/.bungloo/Plugin.css') + if os.access(css_plugin_path, os.R_OK): + func = "setTimeout(function() { loadCssPlugin('file://localhost" + css_plugin_path + "') }, 1000);" + frame.evaluateJavaScript(func) - if callback: - callback(ok) + if callback: + callback(ok) class NetworkAccessManager(QNetworkAccessManager): - def __init__(self, old_manager, bungloo_callback): - QNetworkAccessManager.__init__(self) + def __init__(self, old_manager, bungloo_callback): + QNetworkAccessManager.__init__(self) - self.bungloo_callback = bungloo_callback + self.bungloo_callback = bungloo_callback - self.old_manager = old_manager - self.setCache(old_manager.cache()) - self.setCookieJar(old_manager.cookieJar()) - self.setProxy(old_manager.proxy()) - self.setProxyFactory(old_manager.proxyFactory()) - - def createRequest(self, operation, request, data): - if request.url().scheme() != "bungloo": - return QNetworkAccessManager.createRequest(self, operation, request, data) - else: - self.bungloo_callback(request.url()) - return QNetworkAccessManager.createRequest(self, QNetworkAccessManager.GetOperation, QNetworkRequest(QtCore.QUrl())) - + self.old_manager = old_manager + self.setCache(old_manager.cache()) + self.setCookieJar(old_manager.cookieJar()) + self.setProxy(old_manager.proxy()) + self.setProxyFactory(old_manager.proxyFactory()) + + def createRequest(self, operation, request, data): + if request.url().scheme() != "bungloo": + return QNetworkAccessManager.createRequest(self, operation, request, data) + else: + self.bungloo_callback(request.url()) + return QNetworkAccessManager.createRequest(self, QNetworkAccessManager.GetOperation, QNetworkRequest(QtCore.QUrl())) + class PostModel: - def __init__(self): - self.text = None - self.inReplyTostatusId = None - self.inReplyToEntity = None - self.location = None - self.imageFilePath = None - self.isPrivate = False + def __init__(self): + self.text = None + self.inReplyTostatusId = None + self.inReplyToEntity = None + self.location = None + self.imageFilePath = None + self.isPrivate = False class RestorableWindow(QtGui.QMainWindow): - def __init__(self, action, app): - self.action = action - self.app = app - QtGui.QMainWindow.__init__(self) - self.restoreGeometry(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowGeometry-" + self.action))) - self.restoreState(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowState-" + self.action))) + def __init__(self, action, app): + self.action = action + self.app = app + QtGui.QMainWindow.__init__(self) + self.restoreGeometry(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowGeometry-" + self.action))) + self.restoreState(QtCore.QByteArray.fromRawData(self.app.controller.stringForKey("mainWindowState-" + self.action))) - def closeEvent(self, event): - self._saveGeometry() + def closeEvent(self, event): + self._saveGeometry() - def _saveGeometry(self): - self.app.controller.setStringForKey(self.saveGeometry(), "mainWindowGeometry-" + self.action) - self.app.controller.setStringForKey(self.saveState(), "mainWindowState-" + self.action) + def _saveGeometry(self): + self.app.controller.setStringForKey(self.saveGeometry(), "mainWindowGeometry-" + self.action) + self.app.controller.setStringForKey(self.saveState(), "mainWindowState-" + self.action) - def hide(self): - self._saveGeometry() - QtGui.QMainWindow.close(self) + def hide(self): + self._saveGeometry() + QtGui.QMainWindow.close(self) - def sizeHint(self): - return QtCore.QSize(300, 500) + def sizeHint(self): + return QtCore.QSize(300, 500) - def show(self): - QtGui.QMainWindow.show(self) - self.activateWindow() - self.raise_() \ No newline at end of file + def show(self): + QtGui.QMainWindow.show(self) + self.activateWindow() + self.raise_() \ No newline at end of file diff --git a/Mac/AccessToken.m b/Mac/AccessToken.m index 7c75464..b212e64 100644 --- a/Mac/AccessToken.m +++ b/Mac/AccessToken.m @@ -13,109 +13,109 @@ - (id)init { - self = [super init]; - if (self) { - // Initialization code here. - d = [NSUserDefaults standardUserDefaults]; - //[d removeObjectForKey:@"user_access_token"]; - } - - return self; + self = [super init]; + if (self) { + // Initialization code here. + d = [NSUserDefaults standardUserDefaults]; + //[d removeObjectForKey:@"user_access_token"]; + } + + return self; } - (void)setString:(NSString *)string forKey:(NSString *)aKey { - [d setObject:string forKey:aKey]; - [d synchronize]; + [d setObject:string forKey:aKey]; + [d synchronize]; } - (NSString *)stringForKey:(NSString *)aKey { - return [d objectForKey:aKey]; + return [d objectForKey:aKey]; } - (void)setAccessToken:(NSString *)_accessToken { - [d synchronize]; + [d synchronize]; } - (NSString *)accessToken { - return [d objectForKey:@"accessToken"]; + return [d objectForKey:@"accessToken"]; } - (void)setSecret:(NSString *)_secret { - UInt32 _passwordLength = 0; - char *_password = nil; - SecKeychainItemRef item = nil; - SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &_passwordLength, (void **)&_password, &item); - - OSStatus status; - void * passwordData = (void*)[_secret cStringUsingEncoding:NSUTF8StringEncoding]; - UInt32 passwordLength = strlen((char*)passwordData); - if (!item) - { - status = SecKeychainAddGenericPassword( - NULL, // default keychain - 6, // length of service name - "Bungloo", // service name - 17, // length of account name - "BunglooUserAccount", // account name - passwordLength, // length of password - passwordData, // pointer to password data - NULL // the item reference - ); - } - else - { - status = SecKeychainItemModifyContent( - item, - NULL, - passwordLength, - passwordData - ); - } - NSLog(@"%@",(NSString *)SecCopyErrorMessageString (status,NULL)); + UInt32 _passwordLength = 0; + char *_password = nil; + SecKeychainItemRef item = nil; + SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &_passwordLength, (void **)&_password, &item); + + OSStatus status; + void * passwordData = (void*)[_secret cStringUsingEncoding:NSUTF8StringEncoding]; + UInt32 passwordLength = strlen((char*)passwordData); + if (!item) + { + status = SecKeychainAddGenericPassword( + NULL, // default keychain + 6, // length of service name + "Bungloo", // service name + 17, // length of account name + "BunglooUserAccount", // account name + passwordLength, // length of password + passwordData, // pointer to password data + NULL // the item reference + ); + } + else + { + status = SecKeychainItemModifyContent( + item, + NULL, + passwordLength, + passwordData + ); + } + NSLog(@"%@",(NSString *)SecCopyErrorMessageString (status,NULL)); } - (NSString *)secret { - UInt32 passwordLength = 0; - char *password = nil; - SecKeychainItemRef item = nil; - SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &passwordLength, (void **)&password, &item); - - if (!item) { - return nil; - } - - //Get password - NSString *passwordString = [[[NSString alloc] initWithData:[NSData dataWithBytes:password length:passwordLength] encoding:NSUTF8StringEncoding] autorelease]; - SecKeychainItemFreeContent(NULL, password); - return passwordString; + UInt32 passwordLength = 0; + char *password = nil; + SecKeychainItemRef item = nil; + SecKeychainFindGenericPassword(NULL, 6, "Bungloo", 17, "BunglooUserAccount", &passwordLength, (void **)&password, &item); + + if (!item) { + return nil; + } + + //Get password + NSString *passwordString = [[[NSString alloc] initWithData:[NSData dataWithBytes:password length:passwordLength] encoding:NSUTF8StringEncoding] autorelease]; + SecKeychainItemFreeContent(NULL, password); + return passwordString; } - (void)setUserId:(NSString *)_userId { - [d setObject:_userId forKey:@"userId"]; - [d synchronize]; + [d setObject:_userId forKey:@"userId"]; + [d synchronize]; } - (NSString *)userId { - return [d objectForKey:@"userId"]; + return [d objectForKey:@"userId"]; } - (void)setScreenName:(NSString *)_screenName { - [d setObject:_screenName forKey:@"screenName"]; - [d synchronize]; + [d setObject:_screenName forKey:@"screenName"]; + [d synchronize]; } - (NSString *)screenName { - return [d objectForKey:@"screenName"]; + return [d objectForKey:@"screenName"]; } + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector { diff --git a/Mac/Bungloo.temp_caseinsensitive_rename_Prefix.pch b/Mac/Bungloo.temp_caseinsensitive_rename_Prefix.pch index 3402f1b..694af35 100644 --- a/Mac/Bungloo.temp_caseinsensitive_rename_Prefix.pch +++ b/Mac/Bungloo.temp_caseinsensitive_rename_Prefix.pch @@ -3,5 +3,5 @@ // #ifdef __OBJC__ - #import + #import #endif diff --git a/Mac/Controller.h b/Mac/Controller.h index 0a5d908..9eb0800 100644 --- a/Mac/Controller.h +++ b/Mac/Controller.h @@ -21,20 +21,20 @@ IBOutlet NSWindow *timelineViewWindow; IBOutlet WebView *mentionsView; IBOutlet NSWindow *mentionsViewWindow; - IBOutlet WebView *conversationView; - IBOutlet NSWindow *conversationViewWindow; - WebView *profileView; - NSWindow *profileViewWindow; - NSPanel *openProfileWindow; - NSWindow *loginViewWindow; - NSTextField *loginEntityTextField; - NSProgressIndicator *loginActivityIndicator; + IBOutlet WebView *conversationView; + IBOutlet NSWindow *conversationViewWindow; + WebView *profileView; + NSWindow *profileViewWindow; + NSPanel *openProfileWindow; + NSWindow *loginViewWindow; + NSTextField *loginEntityTextField; + NSProgressIndicator *loginActivityIndicator; IBOutlet NSMenuItem *globalHotkeyMenuItem; IBOutlet NSImageView *logoLayer; ViewDelegate *viewDelegate; - WebView *oauthView; - AccessToken *accessToken; - NSTextField *showProfileTextField; + WebView *oauthView; + AccessToken *accessToken; + NSTextField *showProfileTextField; } diff --git a/Mac/Controller.m b/Mac/Controller.m index 897c248..a3ed94b 100644 --- a/Mac/Controller.m +++ b/Mac/Controller.m @@ -24,12 +24,12 @@ - (void)awakeFromNib { - [timelineViewWindow setExcludedFromWindowsMenu:YES]; - [mentionsViewWindow setExcludedFromWindowsMenu:YES]; - + [timelineViewWindow setExcludedFromWindowsMenu:YES]; + [mentionsViewWindow setExcludedFromWindowsMenu:YES]; + [self initHotKeys]; - - [GrowlApplicationBridge setGrowlDelegate:self]; + + [GrowlApplicationBridge setGrowlDelegate:self]; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self @@ -55,28 +55,28 @@ forEventClass:kInternetEventClass andEventID:kAEGetURL]; - - viewDelegate = [[ViewDelegate alloc] init]; - accessToken = [[AccessToken alloc] init]; - - BOOL forceLogin = NO; - /* - if (![accessToken stringForKey:@"version-0.6.0-new-login"]) { - [self logout:self]; - forceLogin = YES; - [accessToken setString:nil forKey:@"entity"]; - [accessToken setString:@"yes" forKey:@"version-0.6.0-new-login"]; - }*/ - - if (forceLogin || ![accessToken stringForKey:@"user_access_token"] || ![accessToken secret]) { - [timelineViewWindow performClose:self]; - [mentionsViewWindow performClose:self]; - [self.loginViewWindow makeKeyAndOrderFront:self]; - [self initOauth]; - } else { - [timelineViewWindow makeKeyAndOrderFront:self]; - [self initWebViews]; - } + + viewDelegate = [[ViewDelegate alloc] init]; + accessToken = [[AccessToken alloc] init]; + + BOOL forceLogin = NO; + /* + if (![accessToken stringForKey:@"version-0.6.0-new-login"]) { + [self logout:self]; + forceLogin = YES; + [accessToken setString:nil forKey:@"entity"]; + [accessToken setString:@"yes" forKey:@"version-0.6.0-new-login"]; + }*/ + + if (forceLogin || ![accessToken stringForKey:@"user_access_token"] || ![accessToken secret]) { + [timelineViewWindow performClose:self]; + [mentionsViewWindow performClose:self]; + [self.loginViewWindow makeKeyAndOrderFront:self]; + [self initOauth]; + } else { + [timelineViewWindow makeKeyAndOrderFront:self]; + [self initWebViews]; + } } # pragma mark Init @@ -85,81 +85,81 @@ - (void)initOauth { - if (!oauthView) { - NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"]; - NSURL *url = [NSURL fileURLWithPath:path]; - NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil]; - - oauthView = [[WebView alloc] init]; - viewDelegate.oauthView = oauthView; - [[oauthView mainFrame] loadHTMLString:index_string baseURL:url]; - [oauthView setFrameLoadDelegate:viewDelegate]; - [oauthView setPolicyDelegate:viewDelegate]; - [oauthView setUIDelegate:viewDelegate]; - [[oauthView windowScriptObject] setValue:self forKey:@"controller"]; + if (!oauthView) { + NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"]; + NSURL *url = [NSURL fileURLWithPath:path]; + NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil]; + + oauthView = [[WebView alloc] init]; + viewDelegate.oauthView = oauthView; + [[oauthView mainFrame] loadHTMLString:index_string baseURL:url]; + [oauthView setFrameLoadDelegate:viewDelegate]; + [oauthView setPolicyDelegate:viewDelegate]; + [oauthView setUIDelegate:viewDelegate]; + [[oauthView windowScriptObject] setValue:self forKey:@"controller"]; - } + } } - (void)initWebViews { - if (viewDelegate.timelineView != timelineView) - { - [self initOauth]; - - NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"]; - NSURL *url = [NSURL fileURLWithPath:path]; - NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil]; - - viewDelegate.timelineView = timelineView; - [[timelineView mainFrame] loadHTMLString:index_string baseURL:url]; - [timelineView setFrameLoadDelegate:viewDelegate]; - [timelineView setPolicyDelegate:viewDelegate]; - [timelineView setUIDelegate:viewDelegate]; - [[timelineView windowScriptObject] setValue:self forKey:@"controller"]; - //WebPreferences* prefs = [timelineView preferences]; - //[prefs _setLocalStorageDatabasePath:localStoragePath]; - //[prefs setLocalStorageEnabled:YES]; - - viewDelegate.mentionsView = mentionsView; - [[mentionsView mainFrame] loadHTMLString:index_string baseURL:url]; - [mentionsView setFrameLoadDelegate:viewDelegate]; - [mentionsView setPolicyDelegate:viewDelegate]; - [mentionsView setUIDelegate:viewDelegate]; - [[mentionsView windowScriptObject] setValue:self forKey:@"controller"]; - //prefs = [mentionsView preferences]; - //[prefs _setLocalStorageDatabasePath:localStoragePath]; - //[prefs setLocalStorageEnabled:YES]; - - viewDelegate.conversationView = conversationView; - [[conversationView mainFrame] loadHTMLString:index_string baseURL:url]; - [conversationView setFrameLoadDelegate:viewDelegate]; - [conversationView setPolicyDelegate:viewDelegate]; - [conversationView setUIDelegate:viewDelegate]; - [[conversationView windowScriptObject] setValue:self forKey:@"controller"]; - //prefs = [conversationView preferences]; - //[prefs _setLocalStorageDatabasePath:localStoragePath]; - //[prefs setLocalStorageEnabled:YES]; - - viewDelegate.profileView = profileView; - [[profileView mainFrame] loadHTMLString:index_string baseURL:url]; - [profileView setFrameLoadDelegate:viewDelegate]; - [profileView setPolicyDelegate:viewDelegate]; - [profileView setUIDelegate:viewDelegate]; - [[profileView windowScriptObject] setValue:self forKey:@"controller"]; - //prefs = [profileView preferences]; - //[prefs _setLocalStorageDatabasePath:localStoragePath]; - //[prefs setLocalStorageEnabled:YES]; + if (viewDelegate.timelineView != timelineView) + { + [self initOauth]; + + NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Webkit/"]; + NSURL *url = [NSURL fileURLWithPath:path]; + NSString *index_string = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@index.html", path] encoding:NSUTF8StringEncoding error:nil]; + + viewDelegate.timelineView = timelineView; + [[timelineView mainFrame] loadHTMLString:index_string baseURL:url]; + [timelineView setFrameLoadDelegate:viewDelegate]; + [timelineView setPolicyDelegate:viewDelegate]; + [timelineView setUIDelegate:viewDelegate]; + [[timelineView windowScriptObject] setValue:self forKey:@"controller"]; + //WebPreferences* prefs = [timelineView preferences]; + //[prefs _setLocalStorageDatabasePath:localStoragePath]; + //[prefs setLocalStorageEnabled:YES]; + + viewDelegate.mentionsView = mentionsView; + [[mentionsView mainFrame] loadHTMLString:index_string baseURL:url]; + [mentionsView setFrameLoadDelegate:viewDelegate]; + [mentionsView setPolicyDelegate:viewDelegate]; + [mentionsView setUIDelegate:viewDelegate]; + [[mentionsView windowScriptObject] setValue:self forKey:@"controller"]; + //prefs = [mentionsView preferences]; + //[prefs _setLocalStorageDatabasePath:localStoragePath]; + //[prefs setLocalStorageEnabled:YES]; + + viewDelegate.conversationView = conversationView; + [[conversationView mainFrame] loadHTMLString:index_string baseURL:url]; + [conversationView setFrameLoadDelegate:viewDelegate]; + [conversationView setPolicyDelegate:viewDelegate]; + [conversationView setUIDelegate:viewDelegate]; + [[conversationView windowScriptObject] setValue:self forKey:@"controller"]; + //prefs = [conversationView preferences]; + //[prefs _setLocalStorageDatabasePath:localStoragePath]; + //[prefs setLocalStorageEnabled:YES]; + + viewDelegate.profileView = profileView; + [[profileView mainFrame] loadHTMLString:index_string baseURL:url]; + [profileView setFrameLoadDelegate:viewDelegate]; + [profileView setPolicyDelegate:viewDelegate]; + [profileView setUIDelegate:viewDelegate]; + [[profileView windowScriptObject] setValue:self forKey:@"controller"]; + //prefs = [profileView preferences]; + //[prefs _setLocalStorageDatabasePath:localStoragePath]; + //[prefs setLocalStorageEnabled:YES]; - } - else - { - [timelineView stringByEvaluatingJavaScriptFromString:@"start('timeline')"]; - [mentionsView stringByEvaluatingJavaScriptFromString:@"start('mentions')"]; - [conversationView stringByEvaluatingJavaScriptFromString:@"start('conversation')"]; - [profileView stringByEvaluatingJavaScriptFromString:@"start('profile')"]; - } + } + else + { + [timelineView stringByEvaluatingJavaScriptFromString:@"start('timeline')"]; + [mentionsView stringByEvaluatingJavaScriptFromString:@"start('mentions')"]; + [conversationView stringByEvaluatingJavaScriptFromString:@"start('conversation')"]; + [profileView stringByEvaluatingJavaScriptFromString:@"start('profile')"]; + } } - (void)initHotKeys @@ -172,21 +172,21 @@ NSInteger defaultsNewTweetKey = (NSInteger)[defaults integerForKey:@"newTweetKey"]; if ([defaults objectForKey:@"newTweetKey"] != nil) - { + { newTweetKey = defaultsNewTweetKey; } - else - { + else + { [defaults setInteger:newTweetKey forKey:@"newTweetKey"]; } NSInteger defaultsNewTweetModifierKey = (NSInteger)[defaults integerForKey:@"newTweetModifierKey"]; if ([defaults objectForKey:@"newTweetModifierKey"] != nil) - { + { newTweetModifierKey = defaultsNewTweetModifierKey; } - else - { + else + { [defaults setInteger:newTweetModifierKey forKey:@"newTweetModifierKey"]; } @@ -221,23 +221,23 @@ - (void)alertTitle:(NSString *)title withMessage:(NSString *)message { - NSAlert *alert = [NSAlert alertWithMessageText:title - defaultButton:@"OK" alternateButton:nil otherButton:nil - informativeTextWithFormat:@"%@", message]; - [alert runModal]; + NSAlert *alert = [NSAlert alertWithMessageText:title + defaultButton:@"OK" alternateButton:nil otherButton:nil + informativeTextWithFormat:@"%@", message]; + [alert runModal]; } - (void)authentificationSucceded:(id)sender { - [loginActivityIndicator stopAnimation:self]; + [loginActivityIndicator stopAnimation:self]; [self initWebViews]; - [loginViewWindow performClose:self]; + [loginViewWindow performClose:self]; } - (void)authentificationDidNotSucceed:(NSString *)errorMessage { - [loginActivityIndicator stopAnimation:self]; - [self alertTitle:@"Authenication error" withMessage:errorMessage]; + [loginActivityIndicator stopAnimation:self]; + [self alertTitle:@"Authenication error" withMessage:errorMessage]; } + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector @@ -252,21 +252,21 @@ - (void)setString:(NSString *)string forKey:(NSString *)aKey { - [self.accessToken setString:string forKey:aKey]; + [self.accessToken setString:string forKey:aKey]; } - (void)setSecret:(NSString *)string { - [self.accessToken setSecret:string]; + [self.accessToken setSecret:string]; } - (NSString *)secret { - return [self.accessToken secret]; + return [self.accessToken secret]; } - (NSString *)stringForKey:(NSString *)aKey { - return [self.accessToken stringForKey:aKey]; + return [self.accessToken stringForKey:aKey]; } @@ -274,13 +274,13 @@ -(BOOL)applicationShouldOpenUntitledFile:(NSApplication *)theApplication { - return NO; + return NO; } - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag { - [timelineViewWindow makeKeyAndOrderFront:self]; - return NO; + [timelineViewWindow makeKeyAndOrderFront:self]; + return NO; } - (IBAction)openNewMessageWindow:(id)sender @@ -294,7 +294,7 @@ [NSApp activateIgnoringOtherApps:YES]; NewMessageWindow *newMessage = (NewMessageWindow *)[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil]; [newMessage inReplyTo:userName statusId:statusId withString:string]; - [newMessage setIsPrivate:isPrivate]; + [newMessage setIsPrivate:isPrivate]; } - (void)openNewMessageWindowWithString:(NSString *)aString @@ -304,11 +304,11 @@ NSRange range = [aString rangeOfString:@"oauthtoken"]; if (range.length > 0) - { - [oauthView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"bungloo_instance.requestAccessToken('%@')", aString]]; + { + [oauthView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"bungloo_instance.requestAccessToken('%@')", aString]]; } - else - { + else + { NewMessageWindow *newTweet = (NewMessageWindow *)[[NSDocumentController sharedDocumentController] openUntitledDocumentAndDisplay:YES error:nil]; [newTweet withString:aString]; } @@ -323,38 +323,38 @@ - (IBAction)sendTweet:(id)sender { PostModel *post = (PostModel *)[sender object]; - NSString *text = [[post.text stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; - text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; - - NSString *locationObject = @"null"; - if (post.location) { - locationObject = [NSString stringWithFormat:@"[%f, %f]", post.location.coordinate.latitude, post.location.coordinate.longitude]; - } - - NSString *imageFilePath = @"null"; - if (post.imageFilePath) { - NSError *error; - NSString *mimeType = [MimeType mimeTypeForFileAtPath:post.imageFilePath error:&error]; - NSData *data = [[NSData alloc] initWithContentsOfFile:post.imageFilePath]; - NSString *base64 = [data base64Encoding_xcd]; - [data release]; - imageFilePath = [NSString stringWithFormat:@"\"data:%@;base64,%@\"", mimeType, base64]; - } - - NSString *isPrivate = @"false"; - if (post.isPrivate) { - isPrivate = @"true"; - } - - NSString *func = [NSString stringWithFormat:@"bungloo_instance.sendNewMessage(\"%@\", \"%@\", \"%@\", %@, %@, %@)", - text, - post.inReplyTostatusId, - post.inReplyToEntity, - locationObject, - imageFilePath, - isPrivate]; + NSString *text = [[post.text stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"] stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; + text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; + + NSString *locationObject = @"null"; + if (post.location) { + locationObject = [NSString stringWithFormat:@"[%f, %f]", post.location.coordinate.latitude, post.location.coordinate.longitude]; + } + + NSString *imageFilePath = @"null"; + if (post.imageFilePath) { + NSError *error; + NSString *mimeType = [MimeType mimeTypeForFileAtPath:post.imageFilePath error:&error]; + NSData *data = [[NSData alloc] initWithContentsOfFile:post.imageFilePath]; + NSString *base64 = [data base64Encoding_xcd]; + [data release]; + imageFilePath = [NSString stringWithFormat:@"\"data:%@;base64,%@\"", mimeType, base64]; + } + + NSString *isPrivate = @"false"; + if (post.isPrivate) { + isPrivate = @"true"; + } + + NSString *func = [NSString stringWithFormat:@"bungloo_instance.sendNewMessage(\"%@\", \"%@\", \"%@\", %@, %@, %@)", + text, + post.inReplyTostatusId, + post.inReplyToEntity, + locationObject, + imageFilePath, + isPrivate]; - [timelineView stringByEvaluatingJavaScriptFromString:func]; + [timelineView stringByEvaluatingJavaScriptFromString:func]; } - (NSString *)pluginURL @@ -362,8 +362,8 @@ NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *pathToPlugin = [@"~/Library/Application Support/Bungloo/Plugin.js" stringByExpandingTildeInPath]; - if([fileManager fileExistsAtPath:pathToPlugin]) - { + if([fileManager fileExistsAtPath:pathToPlugin]) + { return [NSString stringWithFormat:@"%@", [NSURL fileURLWithPath:pathToPlugin]]; } return nil; @@ -372,12 +372,12 @@ - (void)unreadMentions:(int)count { if (![mentionsViewWindow isVisible] && count > 0) - { + { [timelineViewWindow setTitle:[NSString stringWithFormat:@"Bungloo (^%i)", count]]; [[[NSApplication sharedApplication] dockTile] setBadgeLabel:[NSString stringWithFormat:@"%i", count]]; } - else - { + else + { [timelineViewWindow setTitle:[NSString stringWithFormat:@"Bungloo"]]; [[[NSApplication sharedApplication] dockTile] setBadgeLabel:nil]; [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.unread_mentions = 0;"]; @@ -386,92 +386,92 @@ - (void)notificateUserAboutMention:(NSString *)text fromName:(NSString *)name withPostId:(NSString *)postId andEntity:(NSString *)entity { - [GrowlApplicationBridge - notifyWithTitle:[NSString stringWithFormat:@"Mentioned by %@ on Tent", name] - description:text - notificationName:@"Mention" - iconData:nil - priority:0 - isSticky:NO - clickContext:[NSDictionary dictionaryWithObjectsAndKeys: - entity, @"entity", - postId, @"postId", nil]]; + [GrowlApplicationBridge + notifyWithTitle:[NSString stringWithFormat:@"Mentioned by %@ on Tent", name] + description:text + notificationName:@"Mention" + iconData:nil + priority:0 + isSticky:NO + clickContext:[NSDictionary dictionaryWithObjectsAndKeys: + entity, @"entity", + postId, @"postId", nil]]; } - (void)openURL:(NSString *)url { - [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; } - (IBAction)showProfile:(id)sender { - NSString *entity = [self.showProfileTextField stringValue]; - if ([entity rangeOfString:@"."].location != NSNotFound && ([entity hasPrefix:@"http://"] || [entity hasPrefix:@"https://"])) { - NSString *func = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@')", entity]; - [profileView stringByEvaluatingJavaScriptFromString:func]; - [profileViewWindow makeKeyAndOrderFront:self]; - [openProfileWindow performClose:self]; - } + NSString *entity = [self.showProfileTextField stringValue]; + if ([entity rangeOfString:@"."].location != NSNotFound && ([entity hasPrefix:@"http://"] || [entity hasPrefix:@"https://"])) { + NSString *func = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@')", entity]; + [profileView stringByEvaluatingJavaScriptFromString:func]; + [profileViewWindow makeKeyAndOrderFront:self]; + [openProfileWindow performClose:self]; + } } - (void)notificateViewsAboutDeletedPostWithId:(NSString *)postId byEntity:(NSString*)entity { - NSString *fun = [NSString stringWithFormat:@"bungloo_instance.postDeleted('%@', '%@')", postId, entity]; - [timelineView stringByEvaluatingJavaScriptFromString:fun]; - [mentionsView stringByEvaluatingJavaScriptFromString:fun]; - [conversationView stringByEvaluatingJavaScriptFromString:fun]; - [profileView stringByEvaluatingJavaScriptFromString:fun]; + NSString *fun = [NSString stringWithFormat:@"bungloo_instance.postDeleted('%@', '%@')", postId, entity]; + [timelineView stringByEvaluatingJavaScriptFromString:fun]; + [mentionsView stringByEvaluatingJavaScriptFromString:fun]; + [conversationView stringByEvaluatingJavaScriptFromString:fun]; + [profileView stringByEvaluatingJavaScriptFromString:fun]; } /* - (void)storeAccessToken:(NSString *)_accessToken secret:(NSString *)secret userId:(NSString *)userId andScreenName:(NSString *)screenName { - self.accessToken.accessToken = _accessToken; - self.accessToken.secret = secret; - self.accessToken.userId = userId; - self.accessToken.screenName = screenName; - [timelineViewWindow makeKeyAndOrderFront:self]; - - [[NSNotificationCenter defaultCenter] postNotificationName:@"authentificationSucceded" object:nil]; + self.accessToken.accessToken = _accessToken; + self.accessToken.secret = secret; + self.accessToken.userId = userId; + self.accessToken.screenName = screenName; + [timelineViewWindow makeKeyAndOrderFront:self]; + + [[NSNotificationCenter defaultCenter] postNotificationName:@"authentificationSucceded" object:nil]; }*/ - (void)loggedIn { - [loginActivityIndicator stopAnimation:self]; + [loginActivityIndicator stopAnimation:self]; [self initWebViews]; - [loginViewWindow performClose:self]; - [timelineViewWindow makeKeyAndOrderFront:self]; + [loginViewWindow performClose:self]; + [timelineViewWindow makeKeyAndOrderFront:self]; } - (IBAction)login:(id)sender { - if ([[loginEntityTextField stringValue] length] > 0) { - [[loginEntityTextField window] makeFirstResponder:nil]; - [loginActivityIndicator startAnimation:self]; - [oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.authenticate();"]; - } + if ([[loginEntityTextField stringValue] length] > 0) { + [[loginEntityTextField window] makeFirstResponder:nil]; + [loginActivityIndicator startAnimation:self]; + [oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.authenticate();"]; + } } - (IBAction)logout:(id)sender { - [oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; - - [timelineViewWindow performClose:self]; - [mentionsViewWindow performClose:self]; - [conversationViewWindow performClose:self]; - [profileViewWindow performClose:self]; - [self.loginViewWindow makeKeyAndOrderFront:self]; - - [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; - [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; + [oauthView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; + + [timelineViewWindow performClose:self]; + [mentionsViewWindow performClose:self]; + [conversationViewWindow performClose:self]; + [profileViewWindow performClose:self]; + [self.loginViewWindow makeKeyAndOrderFront:self]; + + [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; + [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.logout();"]; } // Mentions window has been visible - (void)windowDidBecomeKey:(NSNotification *)notification { if ([notification object] == mentionsViewWindow) - { + { //[self unreadMentions:0]; [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.setAllMentionsRead();"]; } @@ -485,39 +485,39 @@ - (IBAction)showConversationForPostId:(NSString *)postId andEntity:(NSString *)entity { - NSString *js = [NSString stringWithFormat:@"bungloo_instance.showStatus('%@', '%@');", postId, entity]; - [conversationView stringByEvaluatingJavaScriptFromString:js]; - [conversationViewWindow makeKeyAndOrderFront:self]; - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; + NSString *js = [NSString stringWithFormat:@"bungloo_instance.showStatus('%@', '%@');", postId, entity]; + [conversationView stringByEvaluatingJavaScriptFromString:js]; + [conversationViewWindow makeKeyAndOrderFront:self]; + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; } - (IBAction)clearCache:(id)sender { - [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.cache.clear()"]; + [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.cache.clear()"]; } - (IBAction)showProfileForEntity:(NSString *)entity { - NSString *js = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@');", entity]; - [profileView stringByEvaluatingJavaScriptFromString:js]; - [profileViewWindow makeKeyAndOrderFront:self]; + NSString *js = [NSString stringWithFormat:@"bungloo_instance.showProfileForEntity('%@');", entity]; + [profileView stringByEvaluatingJavaScriptFromString:js]; + [profileViewWindow makeKeyAndOrderFront:self]; } - (void)growlNotificationWasClicked:(id)clickContext { - NSDictionary *userInfo = (NSDictionary *)clickContext; - NSString *postId = [userInfo objectForKey:@"postId"]; - NSString *entity = [userInfo objectForKey:@"entity"]; - - [self showConversationForPostId:postId andEntity:entity]; - - NSString *js = [NSString stringWithFormat:@"bungloo_instance.mentionRead('%@', '%@');", postId, entity]; - [mentionsView stringByEvaluatingJavaScriptFromString:js]; + NSDictionary *userInfo = (NSDictionary *)clickContext; + NSString *postId = [userInfo objectForKey:@"postId"]; + NSString *entity = [userInfo objectForKey:@"entity"]; + + [self showConversationForPostId:postId andEntity:entity]; + + NSString *js = [NSString stringWithFormat:@"bungloo_instance.mentionRead('%@', '%@');", postId, entity]; + [mentionsView stringByEvaluatingJavaScriptFromString:js]; } - (NSString *) applicationNameForGrowl { - return @"Bungloo"; + return @"Bungloo"; } /* CARBON */ diff --git a/Mac/MimeType.m b/Mac/MimeType.m index 59a2efd..bdc54ad 100644 --- a/Mac/MimeType.m +++ b/Mac/MimeType.m @@ -11,17 +11,17 @@ @implementation MimeType +(NSString *)mimeTypeForFileAtPath:(NSString *)path error:(NSError **)err { - NSString *uti, *mimeType = nil; - - if (!(uti = [[NSWorkspace sharedWorkspace] typeOfFile:path error:err])) - return nil; - if (err) - *err = nil; - - if ((mimeType = (NSString *)UTTypeCopyPreferredTagWithClass((CFStringRef)uti, kUTTagClassMIMEType))) - mimeType = NSMakeCollectable(mimeType); - - return mimeType; + NSString *uti, *mimeType = nil; + + if (!(uti = [[NSWorkspace sharedWorkspace] typeOfFile:path error:err])) + return nil; + if (err) + *err = nil; + + if ((mimeType = (NSString *)UTTypeCopyPreferredTagWithClass((CFStringRef)uti, kUTTagClassMIMEType))) + mimeType = NSMakeCollectable(mimeType); + + return mimeType; } @end diff --git a/Mac/NSData+Base64.h b/Mac/NSData+Base64.h index 24d0984..51a4e4c 100644 --- a/Mac/NSData+Base64.h +++ b/Mac/NSData+Base64.h @@ -15,7 +15,7 @@ { if ([base64Encoding length] % 4 != 0) return nil; - + NSString *plist = [NSString stringWithFormat:@"%@", base64Encoding]; return [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSASCIIStringEncoding] options:0 format:NULL error:NULL]; } @@ -28,7 +28,7 @@ NSRange endRange = [plist rangeOfData:[@"" dataUsingEncoding:NSASCIIStringEncoding] options:NSDataSearchBackwards range:fullRange]; if (startRange.location == NSNotFound || endRange.location == NSNotFound) return nil; - + NSUInteger base64Location = startRange.location + startRange.length; NSUInteger base64length = endRange.location - base64Location; NSData *base64Data = [NSData dataWithBytesNoCopy:(void *)((uintptr_t)base64Location + (uintptr_t)[plist bytes]) length:base64length freeWhenDone:NO]; diff --git a/Mac/NewMessageWindow.h b/Mac/NewMessageWindow.h index a61ab0d..b8893ab 100644 --- a/Mac/NewMessageWindow.h +++ b/Mac/NewMessageWindow.h @@ -15,15 +15,15 @@ { IBOutlet NSTextField *textField; IBOutlet NSTextField *counter; - NSMenu *addMenu; - NSButton *addMenuButton; + NSMenu *addMenu; + NSButton *addMenuButton; NSString *inReplyTostatusId; - NSString *inReplyToEntity; - NSMenuItem *addImage; - CLLocationManager *locationManager; - CLLocation *currentLocation; - NSString *imageFilePath; - NSButton *togglePrivateButton; + NSString *inReplyToEntity; + NSMenuItem *addImage; + CLLocationManager *locationManager; + CLLocation *currentLocation; + NSString *imageFilePath; + NSButton *togglePrivateButton; } @property (nonatomic, retain) IBOutlet NSTextField *textField; diff --git a/Mac/NewMessageWindow.m b/Mac/NewMessageWindow.m index 9d969d2..350194f 100644 --- a/Mac/NewMessageWindow.m +++ b/Mac/NewMessageWindow.m @@ -27,31 +27,31 @@ - (void)dealloc { - [locationManager stopUpdatingLocation]; - [locationManager release]; - [currentLocation release]; - [imageFilePath release]; - [super dealloc]; + [locationManager stopUpdatingLocation]; + [locationManager release]; + [currentLocation release]; + [imageFilePath release]; + [super dealloc]; } - (id)init { - self = [super init]; - if (self) - { - // Add your subclass-specific initialization here. - // If an error occurs here, send a [self release] message and return nil. + self = [super init]; + if (self) + { + // Add your subclass-specific initialization here. + // If an error occurs here, send a [self release] message and return nil. inReplyTostatusId = @""; - inReplyToEntity = @""; - } - return self; + inReplyToEntity = @""; + } + return self; } - (NSString *)windowNibName { - // Override returning the nib file name of the document - // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. - return @"NewMessageWindow"; + // Override returning the nib file name of the document + // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead. + return @"NewMessageWindow"; } - (NSString *)displayName @@ -61,24 +61,24 @@ - (void)windowControllerDidLoadNib:(NSWindowController *) aController { - [super windowControllerDidLoadNib:aController]; - // Add any code here that needs to be executed once the windowController has loaded the document's window. - [textField becomeFirstResponder]; + [super windowControllerDidLoadNib:aController]; + // Add any code here that needs to be executed once the windowController has loaded the document's window. + [textField becomeFirstResponder]; - // Enable Continous Spelling - NSTextView *textView = (NSTextView *)[[[self.windowControllers objectAtIndex:0] window] firstResponder];; - [textView setContinuousSpellCheckingEnabled:YES]; + // Enable Continous Spelling + NSTextView *textView = (NSTextView *)[[[self.windowControllers objectAtIndex:0] window] firstResponder];; + [textView setContinuousSpellCheckingEnabled:YES]; } - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError { - // Insert code here to write your document to data of the specified type. If the given outError != NULL, ensure that you set *outError when returning nil. + // Insert code here to write your document to data of the specified type. If the given outError != NULL, ensure that you set *outError when returning nil. - // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. + // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead. - // For applications targeted for Panther or earlier systems, you should use the deprecated API -dataRepresentationOfType:. In this case you can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. + // For applications targeted for Panther or earlier systems, you should use the deprecated API -dataRepresentationOfType:. In this case you can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead. - if ( outError != NULL ) { + if ( outError != NULL ) { *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL]; } return nil; @@ -86,42 +86,42 @@ - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError { - // Insert code here to read your document from the given data of the specified type. If the given outError != NULL, ensure that you set *outError when returning NO. + // Insert code here to read your document from the given data of the specified type. If the given outError != NULL, ensure that you set *outError when returning NO. - // You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead. - - // For applications targeted for Panther or earlier systems, you should use the deprecated API -loadDataRepresentation:ofType. In this case you can also choose to override -readFromFile:ofType: or -loadFileWrapperRepresentation:ofType: instead. - - if ( outError != NULL ) - { + // You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead. + + // For applications targeted for Panther or earlier systems, you should use the deprecated API -loadDataRepresentation:ofType. In this case you can also choose to override -readFromFile:ofType: or -loadFileWrapperRepresentation:ofType: instead. + + if ( outError != NULL ) + { *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL]; } - return YES; + return YES; } - (void)inReplyTo:(NSString *)entity statusId:(NSString *)statusId withString:(NSString *)string { [textField setStringValue:string]; - - NSInteger location = [string rangeOfString:@" "].location; - NSInteger length = 0; - if (location != NSNotFound) { - length = [[textField stringValue] length] - location - 1; - } - - + + NSInteger location = [string rangeOfString:@" "].location; + NSInteger length = 0; + if (location != NSNotFound) { + length = [[textField stringValue] length] - location - 1; + } + + NSRange range = {location + 1, length}; [[textField currentEditor] setSelectedRange:range]; - + [inReplyTostatusId release]; inReplyTostatusId = statusId; [inReplyTostatusId retain]; - - [inReplyToEntity release]; - inReplyToEntity = entity; - [inReplyToEntity retain]; - - [self controlTextDidChange:nil]; + + [inReplyToEntity release]; + inReplyToEntity = entity; + [inReplyToEntity retain]; + + [self controlTextDidChange:nil]; } - (void)withString:(NSString *)aString @@ -129,59 +129,59 @@ [textField setStringValue:aString]; NSRange range = {[[textField stringValue] length] , 0}; [[textField currentEditor] setSelectedRange:range]; - NSLog(@"BB"); - - [self controlTextDidChange:nil]; + NSLog(@"BB"); + + [self controlTextDidChange:nil]; } - (IBAction)addCurrentLocation:(id)sender { - NSMenuItem *menuItem = (NSMenuItem *)sender; - if (!self.locationManager) - { - [menuItem setTitle:@"Current location not available"]; - [self initLocationManager]; - } - else - { - [self.locationManager stopUpdatingLocation]; - self.currentLocation = nil; - self.locationManager = nil; - [menuItem setTitle:@"Add current location"]; - } + NSMenuItem *menuItem = (NSMenuItem *)sender; + if (!self.locationManager) + { + [menuItem setTitle:@"Current location not available"]; + [self initLocationManager]; + } + else + { + [self.locationManager stopUpdatingLocation]; + self.currentLocation = nil; + self.locationManager = nil; + [menuItem setTitle:@"Add current location"]; + } } - (IBAction)openAddMenu:(id)sender { - NSRect frame = [(NSButton *)sender frame]; - NSPoint menuOrigin = [[(NSButton *)sender superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height) toView:nil]; - - NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseDown - location:menuOrigin - modifierFlags:NSLeftMouseDownMask // 0x100 - timestamp:NSTimeIntervalSince1970 - windowNumber:[[(NSButton *)sender window] windowNumber] - context:[[(NSButton *)sender window] graphicsContext] - eventNumber:0 - clickCount:1 - pressure:1]; - - [NSMenu popUpContextMenu:self.addMenu withEvent:event forView:self.addMenuButton]; + NSRect frame = [(NSButton *)sender frame]; + NSPoint menuOrigin = [[(NSButton *)sender superview] convertPoint:NSMakePoint(frame.origin.x, frame.origin.y+frame.size.height) toView:nil]; + + NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseDown + location:menuOrigin + modifierFlags:NSLeftMouseDownMask // 0x100 + timestamp:NSTimeIntervalSince1970 + windowNumber:[[(NSButton *)sender window] windowNumber] + context:[[(NSButton *)sender window] graphicsContext] + eventNumber:0 + clickCount:1 + pressure:1]; + + [NSMenu popUpContextMenu:self.addMenu withEvent:event forView:self.addMenuButton]; } - (IBAction)togglePrivate:(id)sender { - NSImage *image = [NSImage imageNamed:NSImageNameLockLockedTemplate]; - if (self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate]) - { - image = [NSImage imageNamed:NSImageNameLockUnlockedTemplate]; - } - [self.togglePrivateButton setImage:image]; + NSImage *image = [NSImage imageNamed:NSImageNameLockLockedTemplate]; + if (self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate]) + { + image = [NSImage imageNamed:NSImageNameLockUnlockedTemplate]; + } + [self.togglePrivateButton setImage:image]; } - (void)setIsPrivate:(BOOL)isPrivate { - NSImage *image = [NSImage imageNamed:(isPrivate ? NSImageNameLockLockedTemplate : NSImageNameLockUnlockedTemplate)]; - [self.togglePrivateButton setImage:image]; + NSImage *image = [NSImage imageNamed:(isPrivate ? NSImageNameLockLockedTemplate : NSImageNameLockUnlockedTemplate)]; + [self.togglePrivateButton setImage:image]; } -(void)controlTextDidChange:(NSNotification *)aNotification { @@ -196,44 +196,44 @@ - (void)initLocationManager { - self.locationManager = [[CLLocationManager alloc] init]; - [self.locationManager setDelegate:self]; - [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; - [self.locationManager setDistanceFilter:kCLDistanceFilterNone]; - [self.locationManager startUpdatingLocation]; + self.locationManager = [[CLLocationManager alloc] init]; + [self.locationManager setDelegate:self]; + [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; + [self.locationManager setDistanceFilter:kCLDistanceFilterNone]; + [self.locationManager startUpdatingLocation]; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { - self.currentLocation = newLocation; - NSMenuItem *menuItem = [self.addMenu itemAtIndex:0]; - [menuItem setTitle:@"Remove current location"]; + self.currentLocation = newLocation; + NSMenuItem *menuItem = [self.addMenu itemAtIndex:0]; + [menuItem setTitle:@"Remove current location"]; } - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ - NSLog(@"CLLocationManager Error: %@", error); - - NSMenuItem *menuItem = [self.addMenu itemAtIndex:0]; - [menuItem setTitle:@"Current location not available"]; + NSLog(@"CLLocationManager Error: %@", error); + + NSMenuItem *menuItem = [self.addMenu itemAtIndex:0]; + [menuItem setTitle:@"Current location not available"]; } - (IBAction)sendPostButtonPressed:(id)sender { - [self sendPost:self.textField]; + [self sendPost:self.textField]; } #pragma mark Keyboard delegate methods - (IBAction)sendPost:(NSControl *)control { - BOOL emptyIsOk = self.currentLocation || self.imageFilePath; + BOOL emptyIsOk = self.currentLocation || self.imageFilePath; if (emptyIsOk || ([[control stringValue] length] <= MESSAGE_MAX_LENGTH && [[control stringValue] length] > 0)) { PostModel *post = [[[PostModel alloc] init] autorelease]; post.text = [control stringValue]; post.inReplyTostatusId = inReplyTostatusId; - post.inReplyToEntity = inReplyToEntity; - post.location = self.currentLocation; - post.imageFilePath = self.imageFilePath; - post.isPrivate = self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate]; + post.inReplyToEntity = inReplyToEntity; + post.location = self.currentLocation; + post.imageFilePath = self.imageFilePath; + post.isPrivate = self.togglePrivateButton.image == [NSImage imageNamed:NSImageNameLockLockedTemplate]; [[NSNotificationCenter defaultCenter] postNotificationName:@"sendTweet" object:post]; [self close]; } else { @@ -243,102 +243,102 @@ } - (BOOL)isCommandEnterEvent:(NSEvent *)e { - NSUInteger flags = (e.modifierFlags & NSDeviceIndependentModifierFlagsMask); - BOOL isCommand = (flags & NSCommandKeyMask) == NSCommandKeyMask; - BOOL isEnter = (e.keyCode == 0x24); // VK_RETURN - return (isCommand && isEnter); + NSUInteger flags = (e.modifierFlags & NSDeviceIndependentModifierFlagsMask); + BOOL isCommand = (flags & NSCommandKeyMask) == NSCommandKeyMask; + BOOL isEnter = (e.keyCode == 0x24); // VK_RETURN + return (isCommand && isEnter); } - (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector { - BOOL retval = NO; - - BOOL isEnter = [[NSApp currentEvent] keyCode] == 76; - - if (commandSelector == @selector(insertNewline:) && !isEnter) { - - NSText *text = [[textField window] fieldEditor:YES forObject:nil]; - - NSRange range = [text selectedRange]; - NSString *stringBefore = [textField.stringValue substringToIndex:range.location]; - NSString *stringAfter = [textField.stringValue substringFromIndex:range.location + range.length]; - - textField.stringValue = [NSString stringWithFormat:@"%@\n%@", stringBefore, stringAfter]; + BOOL retval = NO; + + BOOL isEnter = [[NSApp currentEvent] keyCode] == 76; + + if (commandSelector == @selector(insertNewline:) && !isEnter) { + + NSText *text = [[textField window] fieldEditor:YES forObject:nil]; + + NSRange range = [text selectedRange]; + NSString *stringBefore = [textField.stringValue substringToIndex:range.location]; + NSString *stringAfter = [textField.stringValue substringFromIndex:range.location + range.length]; + + textField.stringValue = [NSString stringWithFormat:@"%@\n%@", stringBefore, stringAfter]; - NSRange r = NSMakeRange(range.location + 1, 0); - [text scrollRangeToVisible:r]; - [text setSelectedRange:r]; + NSRange r = NSMakeRange(range.location + 1, 0); + [text scrollRangeToVisible:r]; + [text setSelectedRange:r]; - retval = YES; // causes Apple to NOT fire the default enter action - } - else if (commandSelector == @selector(noop:) && isEnter) { - retval = YES; - [self sendPost:control]; - } - - return retval; + retval = YES; // causes Apple to NOT fire the default enter action + } + else if (commandSelector == @selector(noop:) && isEnter) { + retval = YES; + [self sendPost:control]; + } + + return retval; } #pragma mark Add images - (IBAction)addImage:(id)sender { - NSMenuItem *menuItem = (NSMenuItem *)sender; + NSMenuItem *menuItem = (NSMenuItem *)sender; - if (!self.imageFilePath) - { - [menuItem setTitle:@"Remove photo"]; - - NSOpenPanel* openDlg = [NSOpenPanel openPanel]; - [openDlg setPrompt:@"Select"]; - [openDlg setDelegate:self]; - - // Enable the selection of files in the dialog. - [openDlg setCanChooseFiles:YES]; - - // Enable the selection of directories in the dialog. - [openDlg setCanChooseDirectories:NO]; - - // Display the dialog. If the OK button was pressed, - // process the files. - if ( [openDlg runModalForDirectory:nil file:nil] == NSOKButton ) - { - // Get an array containing the full filenames of all - // files and directories selected. - NSArray* files = [openDlg filenames]; - - // Loop through all the files and process them. - for( int i = 0; i < [files count]; i++ ) - { - self.imageFilePath = [files objectAtIndex:i]; - } - } - } - else - { - self.imageFilePath = nil; - [menuItem setTitle:@"Add photo"]; - } + if (!self.imageFilePath) + { + [menuItem setTitle:@"Remove photo"]; + + NSOpenPanel* openDlg = [NSOpenPanel openPanel]; + [openDlg setPrompt:@"Select"]; + [openDlg setDelegate:self]; + + // Enable the selection of files in the dialog. + [openDlg setCanChooseFiles:YES]; + + // Enable the selection of directories in the dialog. + [openDlg setCanChooseDirectories:NO]; + + // Display the dialog. If the OK button was pressed, + // process the files. + if ( [openDlg runModalForDirectory:nil file:nil] == NSOKButton ) + { + // Get an array containing the full filenames of all + // files and directories selected. + NSArray* files = [openDlg filenames]; + + // Loop through all the files and process them. + for( int i = 0; i < [files count]; i++ ) + { + self.imageFilePath = [files objectAtIndex:i]; + } + } + } + else + { + self.imageFilePath = nil; + [menuItem setTitle:@"Add photo"]; + } } -(BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename { - NSString* ext = [filename pathExtension]; - if ([ext isEqualToString:@""] || [ext isEqualToString:@"/"] || ext == nil || ext == NULL || [ext length] < 1) { - return YES; - } - - NSEnumerator* tagEnumerator = [[NSArray arrayWithObjects:@"png", @"jpg", @"gif", @"jpeg", nil] objectEnumerator]; - NSString* allowedExt; - while ((allowedExt = [tagEnumerator nextObject])) - { - if ([ext caseInsensitiveCompare:allowedExt] == NSOrderedSame) - { - return YES; - } - } - - return NO; + NSString* ext = [filename pathExtension]; + if ([ext isEqualToString:@""] || [ext isEqualToString:@"/"] || ext == nil || ext == NULL || [ext length] < 1) { + return YES; + } + + NSEnumerator* tagEnumerator = [[NSArray arrayWithObjects:@"png", @"jpg", @"gif", @"jpeg", nil] objectEnumerator]; + NSString* allowedExt; + while ((allowedExt = [tagEnumerator nextObject])) + { + if ([ext caseInsensitiveCompare:allowedExt] == NSOrderedSame) + { + return YES; + } + } + + return NO; } @end diff --git a/Mac/PostModel.h b/Mac/PostModel.h index 57f367c..b8ebb44 100644 --- a/Mac/PostModel.h +++ b/Mac/PostModel.h @@ -12,10 +12,10 @@ @interface PostModel : NSObject { NSString *text; NSString *inReplyTostatusId; - NSString *inReplyToEntity; - CLLocation *location; - NSString *imageFilePath; - BOOL isPrivate; + NSString *inReplyToEntity; + CLLocation *location; + NSString *imageFilePath; + BOOL isPrivate; } @property (nonatomic, retain) NSString *text; diff --git a/Mac/PostModel.m b/Mac/PostModel.m index b98db99..e36be45 100644 --- a/Mac/PostModel.m +++ b/Mac/PostModel.m @@ -17,9 +17,9 @@ { [text release]; [inReplyTostatusId release]; - [inReplyToEntity release]; - [location release]; - [imageFilePath release]; + [inReplyToEntity release]; + [location release]; + [imageFilePath release]; [super dealloc]; } diff --git a/Mac/ViewDelegate.h b/Mac/ViewDelegate.h index 81a50c7..7e3cb80 100644 --- a/Mac/ViewDelegate.h +++ b/Mac/ViewDelegate.h @@ -13,9 +13,9 @@ @interface ViewDelegate : NSObject { WebView *timelineView; WebView *mentionsView; - WebView *conversationView; - WebView *profileView; - WebView *oauthView; + WebView *conversationView; + WebView *profileView; + WebView *oauthView; } @property (nonatomic, assign) WebView *timelineView; diff --git a/Mac/ViewDelegate.m b/Mac/ViewDelegate.m index 663507a..92b5211 100644 --- a/Mac/ViewDelegate.m +++ b/Mac/ViewDelegate.m @@ -17,14 +17,14 @@ if (![message isKindOfClass:[NSDictionary class]]) return; - NSString *viewName = @"TimelineView"; - if (sender == mentionsView) viewName = @"MentionsView"; - if (sender == conversationView) viewName = @"ConversationView"; - if (sender == oauthView) viewName = @"OauthView"; - if (sender == profileView) viewName = @"ProfileView"; - + NSString *viewName = @"TimelineView"; + if (sender == mentionsView) viewName = @"MentionsView"; + if (sender == conversationView) viewName = @"ConversationView"; + if (sender == oauthView) viewName = @"OauthView"; + if (sender == profileView) viewName = @"ProfileView"; + NSLog(@"js<%@>: %@:%@: %@", - viewName, + viewName, [[message objectForKey:@"sourceURL"] lastPathComponent], [message objectForKey:@"lineNumber"], [message objectForKey:@"message"] @@ -32,94 +32,94 @@ } - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { - NSString *viewName = @"TimelineView"; - if (sender == mentionsView) viewName = @"MentionsView"; - if (sender == conversationView) viewName = @"ConversationView"; - if (sender == oauthView) viewName = @"OauthView"; + NSString *viewName = @"TimelineView"; + if (sender == mentionsView) viewName = @"MentionsView"; + if (sender == conversationView) viewName = @"ConversationView"; + if (sender == oauthView) viewName = @"OauthView"; NSLog(@"jsa<%@>: %@", viewName, message); } - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame { - NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Bungloo", @""), // title - message, // message - NSLocalizedString(@"OK", @""), // default button - NSLocalizedString(@"Cancel", @""), // alt button - nil); - return NSAlertDefaultReturn == result; - return NO; + NSInteger result = NSRunCriticalAlertPanel(NSLocalizedString(@"Bungloo", @""), // title + message, // message + NSLocalizedString(@"OK", @""), // default button + NSLocalizedString(@"Cancel", @""), // alt button + nil); + return NSAlertDefaultReturn == result; + return NO; } - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id )listener { [listener ignore]; - [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + [[NSWorkspace sharedWorkspace] openURL:[request URL]]; } - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame { - - NSFileManager *fileManager = [NSFileManager defaultManager]; + + NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *pathToJsPlugin = [@"~/Library/Application Support/bungloo/Plugin.js" stringByExpandingTildeInPath]; NSString *pathToCssPlugin = [@"~/Library/Application Support/bungloo/Plugin.css" stringByExpandingTildeInPath]; - if([fileManager fileExistsAtPath:pathToCssPlugin]) - { - [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadCssPlugin('file://localhost%@') }, 1000);", pathToCssPlugin]]; + if([fileManager fileExistsAtPath:pathToCssPlugin]) + { + [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadCssPlugin('file://localhost%@') }, 1000);", pathToCssPlugin]]; } - - if([fileManager fileExistsAtPath:pathToJsPlugin]) - { - [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadJsPlugin('file://localhost%@') }, 1000);", pathToJsPlugin]]; + + if([fileManager fileExistsAtPath:pathToJsPlugin]) + { + [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setTimeout(function() { loadJsPlugin('file://localhost%@') }, 1000);", pathToJsPlugin]]; } - - [sender stringByEvaluatingJavaScriptFromString:@"var OS_TYPE = 'mac';"]; + + [sender stringByEvaluatingJavaScriptFromString:@"var OS_TYPE = 'mac';"]; - if (sender == oauthView) { - - [oauthView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('oauth') }"]; + if (sender == oauthView) { + + [oauthView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('oauth') }"]; - } else if(sender == conversationView) { - - [conversationView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('conversation') }"]; - - } else if(sender == profileView) { - - [profileView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('profile') }"]; - - } else { - - NSString *action = @"timeline"; - NSString *delay = @"1"; - - if (sender == mentionsView) { - action = @"mentions"; - delay = @"1000"; - } - - [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"function HostAppGo() { start('%@') }", action]]; - } + } else if(sender == conversationView) { + + [conversationView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('conversation') }"]; + + } else if(sender == profileView) { + + [profileView stringByEvaluatingJavaScriptFromString:@"function HostAppGo() { start('profile') }"]; + + } else { + + NSString *action = @"timeline"; + NSString *delay = @"1"; + + if (sender == mentionsView) { + action = @"mentions"; + delay = @"1000"; + } + + [sender stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"function HostAppGo() { start('%@') }", action]]; + } } - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems { - // FIXME - /* - NSMutableArray *menuItems = [NSMutableArray arrayWithArray:defaultMenuItems]; - - for (NSMenuItem*item in defaultMenuItems) { - if ([[item title] isEqualToString:@"Reload"]) { - //[item setAction:@selector(reload:)]; - //[item setTarget:self]; - } else { - [menuItems addObject:item]; - } - }*/ - - return defaultMenuItems; + // FIXME + /* + NSMutableArray *menuItems = [NSMutableArray arrayWithArray:defaultMenuItems]; + + for (NSMenuItem*item in defaultMenuItems) { + if ([[item title] isEqualToString:@"Reload"]) { + //[item setAction:@selector(reload:)]; + //[item setTarget:self]; + } else { + [menuItems addObject:item]; + } + }*/ + + return defaultMenuItems; } - (void)reload:(id)sender { - [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"]; - [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"]; + [timelineView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"]; + [mentionsView stringByEvaluatingJavaScriptFromString:@"bungloo_instance.getNewData();"]; } - (NSString *)pluginURL @@ -127,8 +127,8 @@ NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *pathToPlugin = [@"~/Library/Application Support/Bungloo/Plugin.js" stringByExpandingTildeInPath]; - if([fileManager fileExistsAtPath:pathToPlugin]) - { + if([fileManager fileExistsAtPath:pathToPlugin]) + { return [NSString stringWithFormat:@"%@", [NSURL fileURLWithPath:pathToPlugin]]; } return nil; diff --git a/Mac/main.m b/Mac/main.m index e841b28..75ec058 100644 --- a/Mac/main.m +++ b/Mac/main.m @@ -10,5 +10,5 @@ int main(int argc, char *argv[]) { - return NSApplicationMain(argc, (const char **) argv); + return NSApplicationMain(argc, (const char **) argv); } diff --git a/Mac/publish/Appcast.xml b/Mac/publish/Appcast.xml index cb159ba..6f58002 100755 --- a/Mac/publish/Appcast.xml +++ b/Mac/publish/Appcast.xml @@ -1,12 +1,12 @@ - - Bungloo's Changelog - http://jabs.nu/Bungloo/download/Appcast.xml - Most recent changes with links to updates. - en - - Version 1.0.0 + + Bungloo's Changelog + http://jabs.nu/Bungloo/download/Appcast.xml + Most recent changes with links to updates. + en + + Version 1.0.0 10.5.0 http://jabs.nu/bungloo/download/ReleaseNotes.html Mon, 11 Feb 2013 00:29:41 +0100 @@ -15,6 +15,6 @@ length="1101694" type="application/octet-stream" sparkle:dsaSignature="MCwCFB1JIQINycvbZblob0PHy6Be1nVzAhQ2zkoVqoOjJsDjcnZYjI1qY7oX1Q==" /> - - + + diff --git a/Mac/publish/ReleaseNotes.html b/Mac/publish/ReleaseNotes.html index 56112e5..fa58168 100644 --- a/Mac/publish/ReleaseNotes.html +++ b/Mac/publish/ReleaseNotes.html @@ -7,8 +7,8 @@ h1 { font-size: 1.2em; } h2 { font-size: 1em; margin-top: 2em; } hr { margin: 2em 0; } - p { margin: 0; padding: 0; } - strong { color: red; } + p { margin: 0; padding: 0; } + strong { color: red; } @@ -191,13 +191,13 @@

Mentions now appear as realnames


- +

Tentia 0.1.1

Bugfixes

Changed to send on Cmd+Enter.

- +
- +

Tentia 0.1.0

First attempt to rewrite the old Twitter client Twittia to a new and shiny Tent client Tentia.

diff --git a/Mac/publish/publish.rb b/Mac/publish/publish.rb index fb5d5c0..ba37a34 100755 --- a/Mac/publish/publish.rb +++ b/Mac/publish/publish.rb @@ -2,10 +2,10 @@ require 'time' def test var, message - unless var - puts message - exit - end + unless var + puts message + exit + end end path = File.dirname File.expand_path(__FILE__) @@ -28,13 +28,13 @@ end xml = < - - Bungloo's Changelog - http://jabs.nu/Bungloo/download/Appcast.xml - Most recent changes with links to updates. - en - - Version #{version} + + Bungloo's Changelog + http://jabs.nu/Bungloo/download/Appcast.xml + Most recent changes with links to updates. + en + + Version #{version} 10.5.0 http://jabs.nu/bungloo/download/ReleaseNotes.html #{Time.now.rfc2822} @@ -43,8 +43,8 @@ xml = < - - + + XML diff --git a/WebKit/css/default.css b/WebKit/css/default.css index 9f69df9..cf6b38c 100644 --- a/WebKit/css/default.css +++ b/WebKit/css/default.css @@ -283,7 +283,7 @@ li.mentioned { .reposted_by li:hover { background: black; -} +} .reposted_by li a { color: white;