summaryrefslogtreecommitdiff
path: root/UICaboodle
diff options
context:
space:
mode:
Diffstat (limited to 'UICaboodle')
-rw-r--r--UICaboodle/BrowserView.m79
-rw-r--r--UICaboodle/RVBook.h21
-rw-r--r--UICaboodle/RVBook.mm38
3 files changed, 126 insertions, 12 deletions
diff --git a/UICaboodle/BrowserView.m b/UICaboodle/BrowserView.m
index 8734fe5..61a21c9 100644
--- a/UICaboodle/BrowserView.m
+++ b/UICaboodle/BrowserView.m
@@ -1,5 +1,46 @@
#include <BrowserView.h>
+/* Indirect Delegate {{{ */
+@interface IndirectDelegate : NSProxy {
+ _transient volatile id delegate_;
+}
+
+- (void) setDelegate:(id)delegate;
+- (id) initWithDelegate:(id)delegate;
+@end
+
+@implementation IndirectDelegate
+
+- (void) setDelegate:(id)delegate {
+ delegate_ = delegate;
+}
+
+- (id) initWithDelegate:(id)delegate {
+ delegate_ = delegate;
+ return self;
+}
+
+- (BOOL) respondsToSelector:(SEL)sel {
+ return delegate_ == nil ? FALSE : [delegate_ respondsToSelector:sel];
+}
+
+- (NSMethodSignature *) methodSignatureForSelector:(SEL)sel {
+ if (delegate_ != nil)
+ if (NSMethodSignature *sig = [delegate_ methodSignatureForSelector:sel])
+ return sig;
+ // XXX: I fucking hate Apple so very very bad
+ return [NSMethodSignature signatureWithObjCTypes:"v@:"];
+}
+
+- (void) forwardInvocation:(NSInvocation *)inv {
+ SEL sel = [inv selector];
+ if (delegate_ != nil && [delegate_ respondsToSelector:sel])
+ [inv invokeWithTarget:delegate_];
+}
+
+@end
+/* }}} */
+
@interface WebView (Cydia)
- (void) setScriptDebugDelegate:(id)delegate;
- (void) _setFormDelegate:(id)delegate;
@@ -309,8 +350,12 @@
}
/* }}} */
+- (void) webViewClose:(WebView *)sender {
+ [book_ close];
+}
+
- (void) webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame {
- [window setValue:self forKey:@"cydia"];
+ [window setValue:indirect_ forKey:@"cydia"];
}
- (void) webView:(WebView *)sender unableToImplementPolicyWithError:(NSError *)error frame:(WebFrame *)frame {
@@ -319,16 +364,30 @@
- (void) webView:(WebView *)sender decidePolicyForNewWindowAction:(NSDictionary *)action request:(NSURLRequest *)request newFrameName:(NSString *)name decisionListener:(id<WebPolicyDecisionListener>)listener {
if (NSURL *url = [request URL]) {
- if (name != nil && [name isEqualToString:@"_open"])
+ if (name == nil) unknown: {
+ NSLog(@"win:%@:%@", url, [action description]);
+ if (![self getSpecial:url]) {
+ NSString *scheme([[url scheme] lowercaseString]);
+ if ([scheme isEqualToString:@"mailto"])
+ [delegate_ openMailToURL:url];
+ else goto use;
+ }
+ } else if ([name isEqualToString:@"_open"])
[delegate_ openURL:url];
+ else if ([name isEqualToString:@"_popup"]) {
+ RVBook *book([[[RVPopUpBook alloc] initWithFrame:[delegate_ popUpBounds]] autorelease]);
+ [book setDelegate:self];
+
+ RVPage *page([delegate_ pageForURL:url hasTag:NULL]);
+ if (page == nil) {
+ BrowserView *browser([[[BrowserView alloc] initWithBook:book] autorelease]);
+ [browser loadURL:url];
+ page = browser;
+ }
- NSLog(@"win:%@:%@", url, [action description]);
- if (![self getSpecial:url]) {
- NSString *scheme([[url scheme] lowercaseString]);
- if ([scheme isEqualToString:@"mailto"])
- [delegate_ openMailToURL:url];
- else goto use;
- }
+ [book setPage:page];
+ [book_ pushBook:book];
+ } else goto unknown;
[listener ignore];
} else use:
@@ -359,7 +418,9 @@
if (request_ != nil)
[request_ autorelease];
request_ = [request retain];
+#if ForSaurik
NSLog(@"dpn:%@", request_);
+#endif
}
[listener use];
diff --git a/UICaboodle/RVBook.h b/UICaboodle/RVBook.h
index 88a5191..a7781e7 100644
--- a/UICaboodle/RVBook.h
+++ b/UICaboodle/RVBook.h
@@ -1,12 +1,18 @@
#import "UICaboodle.h"
-#import <UIKit/UIView.h>
+#import <UIKit/UIKit.h>
@class NSMutableArray;
+@class RVBook;
@class RVPage;
@class UINavigationBar;
@class UITransitionView;
+@interface UIView (PopUpView)
+- (void) popFromSuperviewAnimated:(BOOL)animated;
+- (void) popSubview:(UIView *)view;
+@end
+
@protocol RVNavigationBarDelegate
@end
@@ -14,6 +20,8 @@
- (void) setPageActive:(BOOL)active with:(id)object;
- (void) resetViewAnimated:(BOOL)animated with:(id)object;
- (void) reloadDataWith:(id)object;
+- (void) popUpBook:(RVBook *)book;
+- (CGRect) popUpBounds;
@end
@interface RVBook : UIView <
@@ -24,6 +32,7 @@
UITransitionView *transition_;
BOOL resetting_;
_transient id delegate_;
+ UIToolbar *toolbar_;
}
- (UINavigationBar *) navigationBar;
@@ -36,6 +45,8 @@
- (void) pushPage:(RVPage *)page;
- (void) popPages:(unsigned)pages;
+- (void) pushBook:(RVBook *)book;
+
- (void) resetViewAnimated:(BOOL)animated;
- (void) resetViewAnimated:(BOOL)animated toPage:(RVPage *)page;
@@ -47,5 +58,13 @@
- (void) reloadData;
- (CGRect) pageBounds;
+- (void) close;
+
+@end
+
+@interface RVPopUpBook : RVBook {
+ _transient RVBook *parent_;
+ bool cancel_;
+}
@end
diff --git a/UICaboodle/RVBook.mm b/UICaboodle/RVBook.mm
index a6f5318..b1bbce6 100644
--- a/UICaboodle/RVBook.mm
+++ b/UICaboodle/RVBook.mm
@@ -52,7 +52,6 @@
- (id) createButtonWithContents:(id)contents width:(float)width barStyle:(int)barStyle buttonStyle:(int)style isRight:(BOOL)right {
float adjust = [contents widthForButtonContents:width];
- NSLog(@"cc:%@:%g:%g", contents, width, adjust);
width = adjust;
return [super createButtonWithContents:contents width:width barStyle:barStyle buttonStyle:style isRight:right];
}
@@ -63,10 +62,14 @@
- (void) dealloc {
[navbar_ setDelegate:nil];
+ if (toolbar_ != nil)
+ [toolbar_ setDelegate:nil];
[pages_ release];
[navbar_ release];
[transition_ release];
+ if (toolbar_ != nil)
+ [toolbar_ release];
[super dealloc];
}
@@ -157,6 +160,10 @@
[navbar_ setAccessoryView:[page accessoryView] animate:animated removeOnPop:NO];
}
+- (void) pushBook:(RVBook *)book {
+ [delegate_ popUpBook:book];
+}
+
- (void) popPages:(unsigned)pages {
if (pages == 0)
return;
@@ -213,10 +220,14 @@
[navitem setTitle:title];
}
+- (NSString *) _leftButtonTitleForPage:(RVPage *)page {
+ return [page leftButtonTitle];
+}
+
- (void) reloadButtonsForPage:(RVPage *)page {
if ([pages_ count] == 0 || page != [pages_ lastObject])
return;
- NSString *leftButtonTitle([page leftButtonTitle]);
+ NSString *leftButtonTitle([self _leftButtonTitleForPage:page]);
UINavigationButtonStyle leftButtonStyle = [page leftButtonStyle];
UINavigationButtonStyle rightButtonStyle = [page rightButtonStyle];
//[navbar_ showButtonsWithLeftTitle:leftButtonTitle rightTitle:[page rightButtonTitle] leftBack:(leftButtonTitle == nil)];
@@ -244,4 +255,27 @@
return [transition_ bounds];
}
+- (void) close {
+}
+
+@end
+
+@implementation RVPopUpBook
+
+- (NSString *) _leftButtonTitleForPage:(RVPage *)page {
+ NSString *title([super _leftButtonTitleForPage:page]);
+ return (cancel_ = title == nil && [pages_ count] == 1) ? @"Cancel" : title;
+}
+
+- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {
+ if (button == 1 && cancel_)
+ [self close];
+ else
+ [super navigationBar:navbar buttonClicked:button];
+}
+
+- (void) close {
+ [self popFromSuperviewAnimated:YES];
+}
+
@end