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