[Libreoffice-commits] core.git: 2 commits - ios/.DS_Store ios/iosremote

Siqi LIU me at siqi.fr
Tue Aug 6 21:49:06 PDT 2013


 ios/.DS_Store                                                                                                  |binary
 ios/iosremote/.DS_Store                                                                                        |binary
 ios/iosremote/PopoverView.h                                                                                    |  202 +
 ios/iosremote/PopoverView.m                                                                                    | 1049 ++++++++++
 ios/iosremote/PopoverViewCompatibility.h                                                                       |   23 
 ios/iosremote/PopoverView_Configuration.h                                                                      |  112 +
 ios/iosremote/TestFlightSDK1.2.6/.DS_Store                                                                     |binary
 ios/iosremote/UIBarButtonItem+Theme.h                                                                          |   16 
 ios/iosremote/UIBarButtonItem+Theme.m                                                                          |   48 
 ios/iosremote/UINavigationController+Theme.h                                                                   |   15 
 ios/iosremote/UINavigationController+Theme.m                                                                   |   23 
 ios/iosremote/iPad_autosize.storyboard                                                                         |  103 
 ios/iosremote/iosremote.xcodeproj/project.pbxproj                                                              |   94 
 ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate |binary
 ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings   |   10 
 ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist                  |   20 
 ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme                       |   86 
 ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist                 |   22 
 ios/iosremote/iosremote/.DS_Store                                                                              |binary
 ios/iosremote/iosremote/AppDelegate.m                                                                          |   17 
 ios/iosremote/iosremote/BasePresentationViewController.h                                                       |    3 
 ios/iosremote/iosremote/BasePresentationViewController.m                                                       |   48 
 ios/iosremote/iosremote/LibONavigationController.h                                                             |   13 
 ios/iosremote/iosremote/LibONavigationController.m                                                             |   44 
 ios/iosremote/iosremote/SWRevealViewController/navBarBackground at 2x.png                                         |binary
 ios/iosremote/iosremote/UIViewController+LibOStyling.h                                                         |   15 
 ios/iosremote/iosremote/UIViewController+LibOStyling.m                                                         |   35 
 ios/iosremote/iosremote/add.png                                                                                |binary
 ios/iosremote/iosremote/add at 2x.png                                                                             |binary
 ios/iosremote/iosremote/autoDismissKeyboardNavigationViewController.h                                          |    3 
 ios/iosremote/iosremote/backButton.png                                                                         |binary
 ios/iosremote/iosremote/backButton at 2x.png                                                                      |binary
 ios/iosremote/iosremote/en.lproj/.DS_Store                                                                     |binary
 ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard                                                    |   28 
 ios/iosremote/iosremote/gear.png                                                                               |binary
 ios/iosremote/iosremote/gear at 2x.png                                                                            |binary
 ios/iosremote/iosremote/gear_pressed.png                                                                       |binary
 ios/iosremote/iosremote/gear_pressed at 2x.png                                                                    |binary
 ios/iosremote/iosremote/gear_transparent_bg.png                                                                |binary
 ios/iosremote/iosremote/gear_transparent_bg at 2x.png                                                             |binary
 ios/iosremote/iosremote/iosremote-Info.plist                                                                   |    2 
 ios/iosremote/iosremote/more_icon.png                                                                          |binary
 ios/iosremote/iosremote/more_icon at 2x.png                                                                       |binary
 ios/iosremote/iosremote/navBarButtonNormal at 2x.png                                                              |binary
 ios/iosremote/iosremote/newServer_vc.h                                                                         |    3 
 ios/iosremote/iosremote/newServer_vc.m                                                                         |   19 
 ios/iosremote/iosremote/serverList_vc.m                                                                        |    4 
 ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.m                                                        |    5 
 ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.m                                                      |    4 
 ios/iosremote/iosremote/slideShowSwipeInList_ipad.m                                                            |    7 
 ios/iosremote/iosremote/slideShow_vc_iphone.m                                                                  |   49 
 ios/iosremote/iosremote_ipad_icon.png                                                                          |binary
 ios/iosremote/iosremote_ipad_icon at 2x.png                                                                       |binary
 ios/iosremote/iosremote_iphone_icon.png                                                                        |binary
 ios/iosremote/iosremote_iphone_icon at 2x.png                                                                     |binary
 ios/iosremote/navBarBackground.png                                                                             |binary
 ios/iosremote/navBarBackground at 2x.png                                                                          |binary
 57 files changed, 2087 insertions(+), 35 deletions(-)

New commits:
commit 735ea456719c0c27cb4ae102ccd1bc3bc93f818a
Author: Siqi LIU <me at siqi.fr>
Date:   Wed Aug 7 12:37:38 2013 +0800

    minor
    
    Change-Id: I949464f042e3bb2ba1360feb6ba4867b332b8483

diff --git a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate
index 7c56597..0728360 100644
Binary files a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate and b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate differ
commit 2a5d3cbebc182f02773b7704a99dbf63bd10f5a5
Author: Siqi LIU <me at siqi.fr>
Date:   Wed Aug 7 12:37:21 2013 +0800

    design style revamped for iOS7
    
    Change-Id: I469e50e779ac201ab15aa8fff8e2f6fcfb2f99b6

diff --git a/ios/.DS_Store b/ios/.DS_Store
new file mode 100644
index 0000000..6ebde5e
Binary files /dev/null and b/ios/.DS_Store differ
diff --git a/ios/iosremote/.DS_Store b/ios/iosremote/.DS_Store
new file mode 100644
index 0000000..bff21b7
Binary files /dev/null and b/ios/iosremote/.DS_Store differ
diff --git a/ios/iosremote/PopoverView.h b/ios/iosremote/PopoverView.h
new file mode 100755
index 0000000..a945e38
--- /dev/null
+++ b/ios/iosremote/PopoverView.h
@@ -0,0 +1,202 @@
+//
+//  PopoverView.h
+//  Embark
+//
+//  Created by Oliver Rickard on 20/08/2012.
+//
+//
+
+#import <UIKit/UIKit.h>
+#import "PopoverViewCompatibility.h"
+
+
+/**************** Support both ARC and non-ARC ********************/
+
+#ifndef SUPPORT_ARC
+#define SUPPORT_ARC
+
+#if __has_feature(objc_arc_weak)                //objc_arc_weak
+#define WEAK weak
+#define __WEAK __weak
+#define STRONG strong
+
+#define AUTORELEASE self
+#define RELEASE self
+#define RETAIN self
+#define CFTYPECAST(exp) (__bridge exp)
+#define TYPECAST(exp) (__bridge_transfer exp)
+#define CFRELEASE(exp) CFRelease(exp)
+#define DEALLOC self
+
+#elif __has_feature(objc_arc)                   //objc_arc
+#define WEAK unsafe_unretained
+#define __WEAK __unsafe_unretained
+#define STRONG strong
+
+#define AUTORELEASE self
+#define RELEASE self
+#define RETAIN self
+#define CFTYPECAST(exp) (__bridge exp)
+#define TYPECAST(exp) (__bridge_transfer exp)
+#define CFRELEASE(exp) CFRelease(exp)
+#define DEALLOC self
+
+#else                                           //none
+#define WEAK assign
+#define __WEAK
+#define STRONG retain
+
+#define AUTORELEASE autorelease
+#define RELEASE release
+#define RETAIN retain
+#define CFTYPECAST(exp) (exp)
+#define TYPECAST(exp) (exp)
+#define CFRELEASE(exp) CFRelease(exp)
+#define DEALLOC dealloc
+
+#endif
+#endif
+
+/******************************************************************/
+
+
+ at class PopoverView;
+
+ at protocol PopoverViewDelegate <NSObject>
+
+ at optional
+
+//Delegate receives this call as soon as the item has been selected
+- (void)popoverView:(PopoverView *)popoverView didSelectItemAtIndex:(NSInteger)index;
+
+//Delegate receives this call once the popover has begun the dismissal animation
+- (void)popoverViewDidDismiss:(PopoverView *)popoverView;
+
+ at end
+
+ at interface PopoverView : UIView {
+    CGRect boxFrame;
+    CGSize contentSize;
+    CGPoint arrowPoint;
+
+    BOOL above;
+
+    __WEAK id<PopoverViewDelegate> delegate;
+
+    UIView *parentView;
+
+    UIView *topView;
+
+    NSArray *subviewsArray;
+
+    NSArray *dividerRects;
+
+    UIView *contentView;
+
+    UIView *titleView;
+
+    UIActivityIndicatorView *activityIndicator;
+
+    //Instance variable that can change at runtime
+    BOOL showDividerRects;
+}
+
+ at property (nonatomic, STRONG) UIView *titleView;
+
+ at property (nonatomic, STRONG) UIView *contentView;
+
+ at property (nonatomic, STRONG) NSArray *subviewsArray;
+
+ at property (nonatomic, WEAK) id<PopoverViewDelegate> delegate;
+
+#pragma mark - Class Static Showing Methods
+
+//These are the main static methods you can use to display the popover.
+//Simply call [PopoverView show...] with your arguments, and the popover will be generated, added to the view stack, and notify you when it's done.
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate;
+
+#pragma mark - Instance Showing Methods
+
+//Adds/animates in the popover to the top of the view stack with the arrow pointing at the "point"
+//within the specified view.  The contentView will be added to the popover, and should have either
+//a clear color backgroundColor, or perhaps a rounded corner bg rect (radius 4.f if you're going to
+//round).
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)contentView;
+
+//Calls above method with a UILabel containing the text you deliver to this method.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text;
+
+//Calls top method with an array of UIView objects.  This method will stack these views vertically
+//with kBoxPadding padding between each view in the y-direction.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray;
+
+//Does same as above, but adds a title label at top of the popover.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray;
+
+//Calls the viewArray method with an array of UILabels created with the strings
+//in stringArray.  All contents of stringArray must be NSStrings.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray;
+
+//This method does same as above, but with a title label at the top of the popover.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray;
+
+//Draws a vertical list of the NSString elements of stringArray with UIImages
+//from imageArray placed centered above them.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray;
+
+//Does the same as above, but with a title
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray;
+
+//Lays out the PopoverView at a point once all of the views have already been setup elsewhere
+- (void)layoutAtPoint:(CGPoint)point inView:(UIView *)view;
+
+#pragma mark - Other Interaction
+//This method animates the rotation of the PopoverView to a new point
+- (void)animateRotationToNewPoint:(CGPoint)point inView:(UIView *)view withDuration:(NSTimeInterval)duration;
+
+#pragma mark - Dismissal
+//Dismisses the view, and removes it from the view stack.
+- (void)dismiss;
+- (void)dismiss:(BOOL)animated;
+
+#pragma mark - Activity Indicator Methods
+
+//Shows the activity indicator, and changes the title (if the title is available, and is a UILabel).
+- (void)showActivityIndicatorWithMessage:(NSString *)msg;
+
+//Hides the activity indicator, and changes the title (if the title is available) to the msg
+- (void)hideActivityIndicatorWithMessage:(NSString *)msg;
+
+#pragma mark - Custom Image Showing
+
+//Animate in, and display the image provided here.
+- (void)showImage:(UIImage *)image withMessage:(NSString *)msg;
+
+#pragma mark - Error/Success Methods
+
+//Shows (and animates in) an error X in the contentView
+- (void)showError;
+
+//Shows (and animates in) a success checkmark in the contentView
+- (void)showSuccess;
+
+ at end
diff --git a/ios/iosremote/PopoverView.m b/ios/iosremote/PopoverView.m
new file mode 100755
index 0000000..1bf43b5
--- /dev/null
+++ b/ios/iosremote/PopoverView.m
@@ -0,0 +1,1049 @@
+//
+//  PopoverView.m
+//  Embark
+//
+//  Created by Oliver Rickard on 20/08/2012.
+//
+//
+
+#import "PopoverView.h"
+#import "PopoverView_Configuration.h"
+#import <QuartzCore/QuartzCore.h>
+
+#pragma mark - Implementation
+
+ at implementation PopoverView
+
+ at synthesize subviewsArray;
+ at synthesize contentView;
+ at synthesize titleView;
+ at synthesize delegate;
+
+#pragma mark - Static Methods
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withText:text];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withTitle:title withText:text];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withViewArray:viewArray];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withTitle:title withViewArray:viewArray];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withStringArray:stringArray];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withTitle:title withStringArray:stringArray];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withStringArray:stringArray withImageArray:imageArray];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withTitle:title withStringArray:stringArray withImageArray:imageArray];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withTitle:title withContentView:cView];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate {
+    PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+    [popoverView showAtPoint:point inView:view withContentView:cView];
+    popoverView.delegate = delegate;
+    [popoverView RELEASE];
+    return popoverView;
+}
+
+#pragma mark - View Lifecycle
+
+- (id)initWithFrame:(CGRect)frame
+{
+    self = [super initWithFrame:frame];
+    if (self) {
+        // Initialization code
+        
+        self.backgroundColor = [UIColor clearColor];
+        
+        self.titleView = nil;
+        self.contentView = nil;
+        
+        showDividerRects = kShowDividersBetweenViews;
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    self.subviewsArray = nil;
+    
+    if (dividerRects) {
+        [dividerRects RELEASE];
+        dividerRects = nil;
+    }
+    
+    self.contentView = nil;
+    self.titleView = nil;
+    
+    [super DEALLOC];
+}
+
+
+
+#pragma mark - Display methods
+
+// get the screen size, adjusted for orientation and status bar display
+// see http://stackoverflow.com/questions/7905432/how-to-get-orientation-dependent-height-and-width-of-the-screen/7905540#7905540
+- (CGSize) screenSize
+{
+    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
+    CGSize size = [UIScreen mainScreen].bounds.size;
+    UIApplication *application = [UIApplication sharedApplication];
+    if (UIInterfaceOrientationIsLandscape(orientation))
+    {
+        size = CGSizeMake(size.height, size.width);
+    }
+    if (application.statusBarHidden == NO)
+    {
+        size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
+    }
+    return size;
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text
+{
+    UIFont *font = kTextFont;
+    
+    CGSize screenSize = [self screenSize];
+    CGSize textSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(screenSize.width - kHorizontalMargin*4.f, 1000.f) lineBreakMode:UILineBreakModeWordWrap];
+    
+    UILabel *textView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+    textView.backgroundColor = [UIColor clearColor];
+    textView.userInteractionEnabled = NO;
+    [textView setNumberOfLines:0]; //This is so the label word wraps instead of cutting off the text
+    textView.font = font;
+    textView.textAlignment = kTextAlignment;
+    textView.textColor = kTextColor;
+    textView.text = text;
+    
+    [self showAtPoint:point inView:view withViewArray:[NSArray arrayWithObject:[textView AUTORELEASE]]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withText:(NSString *)text
+{
+    UIFont *font = kTextFont;
+    
+    CGSize screenSize = [self screenSize];
+    CGSize textSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(screenSize.width - kHorizontalMargin*4.f, 1000.f) lineBreakMode:UILineBreakModeWordWrap];
+    
+    UILabel *textView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+    textView.backgroundColor = [UIColor clearColor];
+    textView.userInteractionEnabled = NO;
+    [textView setNumberOfLines:0]; //This is so the label word wraps instead of cutting off the text
+    textView.font = font;
+    textView.textAlignment = kTextAlignment;
+    textView.textColor = kTextColor;
+    textView.text = text;
+    
+    [self showAtPoint:point inView:view withTitle:title withViewArray:[NSArray arrayWithObject:[textView AUTORELEASE]]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray
+{
+    UIView *container = [[UIView alloc] initWithFrame:CGRectZero];
+    
+    float totalHeight = 0.f;
+    float totalWidth = 0.f;
+    
+    int i = 0;
+    
+    //Position each view the first time, and identify which view has the largest width that controls
+    //the sizing of the popover.
+    for (UIView *view in viewArray) {
+        
+        view.frame = CGRectMake(0, totalHeight, view.frame.size.width, view.frame.size.height);
+        //Only add padding below the view if it's not the last item
+        float padding = (i == viewArray.count-1) ? 0 : kBoxPadding;
+        
+        totalHeight += view.frame.size.height + padding;
+        
+        if (view.frame.size.width > totalWidth) {
+            totalWidth = view.frame.size.width;
+        }
+        
+        [container addSubview:view];
+        
+        i++;
+    }
+    
+    //If dividers are enabled, then we allocate the divider rect array.  This will hold NSValues
+    if (kShowDividersBetweenViews) {
+        dividerRects = [[NSMutableArray alloc] initWithCapacity:viewArray.count-1];
+    }
+    
+    container.frame = CGRectMake(0, 0, totalWidth, totalHeight);
+    
+    i = 0;
+    
+    totalHeight = 0;
+    
+    //Now we actually change the frame element for each subview, and center the views horizontally.
+    for (UIView *view in viewArray) {
+        if ([view autoresizingMask] == UIViewAutoresizingFlexibleWidth) {
+            //Now make sure all flexible views are the full width
+            view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, totalWidth, view.frame.size.height);
+        } else {
+            //If the view is not flexible width, then we position it centered in the view
+            //without stretching it.
+            view.frame = CGRectMake(floorf(CGRectGetMinX(boxFrame) + totalWidth*0.5f - view.frame.size.width*0.5f), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
+        }
+        
+        //and if dividers are enabled, we record their position for the drawing methods
+        if (kShowDividersBetweenViews && i != viewArray.count-1) {
+            CGRect dividerRect = CGRectMake(view.frame.origin.x, floorf(view.frame.origin.y + view.frame.size.height + kBoxPadding*0.5f), view.frame.size.width, 0.5f);
+            
+            [((NSMutableArray *)dividerRects) addObject:[NSValue valueWithCGRect:dividerRect]];
+        }
+        
+        //Only add padding below the view if it's not the last item
+        float padding = (i == viewArray.count-1) ? 0.f : kBoxPadding;
+        
+        totalHeight += view.frame.size.height + padding;
+        
+        i++;
+    }
+    
+    self.subviewsArray = viewArray;
+    
+    [self showAtPoint:point inView:view withContentView:[container AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray
+{
+    UIView *container = [[UIView alloc] initWithFrame:CGRectZero];
+    
+    //Create a label for the title text.
+    CGSize titleSize = [title sizeWithFont:kTitleFont];
+    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.f, 0.f, titleSize.width, titleSize.height)];
+    titleLabel.backgroundColor = [UIColor clearColor];
+    titleLabel.font = kTitleFont;
+    titleLabel.textAlignment = UITextAlignmentCenter;
+    titleLabel.textColor = kTitleColor;
+    titleLabel.text = title;
+    
+    //Make sure that the title's label will have non-zero height.  If it has zero height, then we don't allocate any space
+    //for it in the positioning of the views.
+    float titleHeightOffset = (titleSize.height > 0.f ? kBoxPadding : 0.f);
+    
+    float totalHeight = titleSize.height + titleHeightOffset + kBoxPadding;
+    float totalWidth = titleSize.width;
+    
+    int i = 0;
+    
+    //Position each view the first time, and identify which view has the largest width that controls
+    //the sizing of the popover.
+    for (UIView *view in viewArray) {
+        
+        view.frame = CGRectMake(0, totalHeight, view.frame.size.width, view.frame.size.height);
+        
+        //Only add padding below the view if it's not the last item.
+        float padding = (i == viewArray.count-1) ? 0.f : kBoxPadding;
+        
+        totalHeight += view.frame.size.height + padding;
+        
+        if (view.frame.size.width > totalWidth) {
+            totalWidth = view.frame.size.width;
+        }
+        
+        [container addSubview:view];
+        
+        i++;
+    }
+    
+    //If dividers are enabled, then we allocate the divider rect array.  This will hold NSValues
+    if (kShowDividersBetweenViews) {
+        dividerRects = [[NSMutableArray alloc] initWithCapacity:viewArray.count-1];
+    }
+    
+    i = 0;
+    
+    for (UIView *view in viewArray) {
+        if ([view autoresizingMask] == UIViewAutoresizingFlexibleWidth) {
+            //Now make sure all flexible views are the full width
+            view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, totalWidth, view.frame.size.height);
+        } else {
+            //If the view is not flexible width, then we position it centered in the view
+            //without stretching it.
+            view.frame = CGRectMake(floorf(CGRectGetMinX(boxFrame) + totalWidth*0.5f - view.frame.size.width*0.5f), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
+        }
+        
+        //and if dividers are enabled, we record their position for the drawing methods
+        if (kShowDividersBetweenViews && i != viewArray.count-1) {
+            CGRect dividerRect = CGRectMake(view.frame.origin.x, floorf(view.frame.origin.y + view.frame.size.height + kBoxPadding*0.5f), view.frame.size.width, 0.5f);
+            
+            [((NSMutableArray *)dividerRects) addObject:[NSValue valueWithCGRect:dividerRect]];
+        }
+        
+        i++;
+    }
+    
+    titleLabel.frame = CGRectMake(floorf(totalWidth*0.5f - titleSize.width*0.5f), 0, titleSize.width, titleSize.height);
+    
+    //Store the titleView as an instance variable if it is larger than 0 height (not an empty string)
+    if (titleSize.height > 0) {
+        self.titleView = titleLabel;
+    }
+    
+    [container addSubview:[titleLabel AUTORELEASE]];
+    
+    container.frame = CGRectMake(0, 0, totalWidth, totalHeight);
+    
+    self.subviewsArray = viewArray;
+    
+    [self showAtPoint:point inView:view withContentView:[container AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray
+{
+    NSMutableArray *labelArray = [[NSMutableArray alloc] initWithCapacity:stringArray.count];
+    
+    UIFont *font = kTextFont;
+    
+    for (NSString *string in stringArray) {
+        CGSize textSize = [string sizeWithFont:font];
+        UIButton *textButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+        textButton.backgroundColor = [UIColor clearColor];
+        textButton.titleLabel.font = font;
+        textButton.titleLabel.textAlignment = kTextAlignment;
+        textButton.titleLabel.textColor = kTextColor;
+        [textButton setTitle:string forState:UIControlStateNormal];
+        textButton.layer.cornerRadius = 4.f;
+        [textButton setTitleColor:kTextColor forState:UIControlStateNormal];
+        [textButton setTitleColor:kTextHighlightColor forState:UIControlStateHighlighted];
+        [textButton addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];
+        
+        [labelArray addObject:[textButton AUTORELEASE]];
+    }
+    
+    [self showAtPoint:point inView:view withViewArray:[labelArray AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray
+ {
+    NSMutableArray *labelArray = [[NSMutableArray alloc] initWithCapacity:stringArray.count];
+    
+    UIFont *font = kTextFont;
+    
+    for (NSString *string in stringArray) {
+        CGSize textSize = [string sizeWithFont:font];
+        UIButton *textButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+        textButton.backgroundColor = [UIColor clearColor];
+        textButton.titleLabel.font = font;
+        textButton.titleLabel.textAlignment = kTextAlignment;
+        textButton.titleLabel.textColor = kTextColor;
+        [textButton setTitle:string forState:UIControlStateNormal];
+        textButton.layer.cornerRadius = 4.f;
+        [textButton setTitleColor:kTextColor forState:UIControlStateNormal];
+        [textButton setTitleColor:kTextHighlightColor forState:UIControlStateHighlighted];
+        [textButton addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];
+        
+        [labelArray addObject:[textButton AUTORELEASE]];
+    }
+    
+    [self showAtPoint:point inView:view withTitle:title withViewArray:[labelArray AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray
+{
+    //Here we do something pretty similar to the stringArray method above.
+    //We create an array of subviews that contains the strings and images centered above a label.
+    
+    NSAssert((stringArray.count == imageArray.count), @"stringArray.count should equal imageArray.count");
+    NSMutableArray* tempViewArray = [self makeTempViewsWithStrings:stringArray andImages:imageArray];
+    
+    [self showAtPoint:point inView:view withViewArray:tempViewArray];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray
+{
+    NSAssert((stringArray.count == imageArray.count), @"stringArray.count should equal imageArray.count");
+    NSMutableArray* tempViewArray = [self makeTempViewsWithStrings:stringArray andImages:imageArray];
+        
+    [self showAtPoint:point inView:view withTitle:title withViewArray:tempViewArray];
+}
+
+- (NSMutableArray*) makeTempViewsWithStrings:(NSArray *)stringArray andImages:(NSArray *)imageArray
+{
+    NSMutableArray *tempViewArray = [[NSMutableArray alloc] initWithCapacity:stringArray.count];
+    
+    UIFont *font = kTextFont;
+    
+    for (int i = 0; i < stringArray.count; i++) {
+        NSString *string = [stringArray objectAtIndex:i];
+        
+        //First we build a label for the text to set in.
+        CGSize textSize = [string sizeWithFont:font];
+        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+        label.backgroundColor = [UIColor clearColor];
+        label.font = font;
+        label.textAlignment = kTextAlignment;
+        label.textColor = kTextColor;
+        label.text = string;
+        label.layer.cornerRadius = 4.f;
+        
+        //Now we grab the image at the same index in the imageArray, and create
+        //a UIImageView for it.
+        UIImage *image = [imageArray objectAtIndex:i];
+        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
+        
+        //Take the larger of the two widths as the width for the container
+        float containerWidth = MAX(imageView.frame.size.width, label.frame.size.width);
+        float containerHeight = label.frame.size.height + kImageTopPadding + kImageBottomPadding + imageView.frame.size.height;
+        
+        //This container will hold both the image and the label
+        UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, containerWidth, containerHeight)];
+        
+        //Now we do the frame manipulations to put the imageView on top of the label, both centered
+        imageView.frame = CGRectMake(floorf(containerWidth*0.5f - imageView.frame.size.width*0.5f), kImageTopPadding, imageView.frame.size.width, imageView.frame.size.height);
+        label.frame = CGRectMake(floorf(containerWidth*0.5f - label.frame.size.width*0.5f), imageView.frame.size.height + kImageBottomPadding + kImageTopPadding, label.frame.size.width, label.frame.size.height);
+        
+        [containerView addSubview:imageView];
+        [containerView addSubview:label];
+        
+        [label RELEASE];
+        [imageView RELEASE];
+        
+        [tempViewArray addObject:containerView];
+        [containerView RELEASE];
+    }
+
+    return [tempViewArray AUTORELEASE];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withContentView:(UIView *)cView
+{
+    [self showAtPoint:point inView:view withTitle:title withViewArray:[NSArray arrayWithObject:cView]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)cView {
+    
+    //NSLog(@"point:%f,%f", point.x, point.y);
+    
+    self.contentView = cView;
+    parentView = view;
+    
+    // get the top view
+    // http://stackoverflow.com/questions/3843411/getting-reference-to-the-top-most-view-window-in-ios-application/8045804#8045804
+    topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
+    
+    [self setupLayout:point inView:view];
+    
+    // Make the view small and transparent before animation
+    self.alpha = 0.f;
+    self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+    
+    // animate into full size
+    // First stage animates to 1.05x normal size, then second stage animates back down to 1x size.
+    // This two-stage animation creates a little "pop" on open.
+    [UIView animateWithDuration:0.2f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+        self.alpha = 1.f;
+        self.transform = CGAffineTransformMakeScale(1.05f, 1.05f);
+    } completion:^(BOOL finished) {
+        [UIView animateWithDuration:0.08f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+            self.transform = CGAffineTransformIdentity;
+        } completion:nil];
+    }];
+}
+
+- (void)layoutAtPoint:(CGPoint)point inView:(UIView *)view
+{
+    // make transparent
+    self.alpha = 0.f;
+    
+    [self setupLayout:point inView:view];
+    
+    // animate back to full opacity
+    [UIView animateWithDuration:0.2f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+        self.alpha = 1.f;
+    } completion:nil];
+}
+
+-(void)setupLayout:(CGPoint)point inView:(UIView*)view
+{
+    CGPoint topPoint = [topView convertPoint:point fromView:view];
+
+    arrowPoint = topPoint;
+
+    //NSLog(@"arrowPoint:%f,%f", arrowPoint.x, arrowPoint.y);
+
+    CGRect topViewBounds = topView.bounds;
+    //NSLog(@"topViewBounds %@", NSStringFromCGRect(topViewBounds));
+
+    float contentHeight = contentView.frame.size.height;
+    float contentWidth = contentView.frame.size.width;
+
+    float padding = kBoxPadding;
+
+    float boxHeight = contentHeight + 2.f*padding;
+    float boxWidth = contentWidth + 2.f*padding;
+
+    float xOrigin = 0.f;
+
+    //Make sure the arrow point is within the drawable bounds for the popover.
+    if (arrowPoint.x + kArrowHeight > topViewBounds.size.width - kHorizontalMargin - kBoxRadius - kArrowHorizontalPadding) {//Too far to the right
+        arrowPoint.x = topViewBounds.size.width - kHorizontalMargin - kBoxRadius - kArrowHorizontalPadding - kArrowHeight;
+        //NSLog(@"Correcting Arrow Point because it's too far to the right");
+    } else if (arrowPoint.x - kArrowHeight < kHorizontalMargin + kBoxRadius + kArrowHorizontalPadding) {//Too far to the left
+        arrowPoint.x = kHorizontalMargin + kArrowHeight + kBoxRadius + kArrowHorizontalPadding;
+        //NSLog(@"Correcting Arrow Point because it's too far to the left");
+    }
+
+    //NSLog(@"arrowPoint:%f,%f", arrowPoint.x, arrowPoint.y);
+
+    xOrigin = floorf(arrowPoint.x - boxWidth*0.5f);
+
+    //Check to see if the centered xOrigin value puts the box outside of the normal range.
+    if (xOrigin < CGRectGetMinX(topViewBounds) + kHorizontalMargin) {
+        xOrigin = CGRectGetMinX(topViewBounds) + kHorizontalMargin;
+    } else if (xOrigin + boxWidth > CGRectGetMaxX(topViewBounds) - kHorizontalMargin) {
+        //Check to see if the positioning puts the box out of the window towards the left
+        xOrigin = CGRectGetMaxX(topViewBounds) - kHorizontalMargin - boxWidth;
+    }
+
+    float arrowHeight = kArrowHeight;
+
+    float topPadding = kTopMargin;
+
+    above = YES;
+
+    if (topPoint.y - contentHeight - arrowHeight - topPadding < CGRectGetMinY(topViewBounds)) {
+        //Position below because it won't fit above.
+        above = NO;
+        
+        boxFrame = CGRectMake(xOrigin, arrowPoint.y + arrowHeight, boxWidth, boxHeight);
+    } else {
+        //Position above.
+        above = YES;
+        
+        boxFrame = CGRectMake(xOrigin, arrowPoint.y - arrowHeight - boxHeight, boxWidth, boxHeight);
+    }
+
+    //NSLog(@"boxFrame:(%f,%f,%f,%f)", boxFrame.origin.x, boxFrame.origin.y, boxFrame.size.width, boxFrame.size.height);
+
+    CGRect contentFrame = CGRectMake(boxFrame.origin.x + padding, boxFrame.origin.y + padding, contentWidth, contentHeight);
+    contentView.frame = contentFrame;
+
+    //We set the anchorPoint here so the popover will "grow" out of the arrowPoint specified by the user.
+    //You have to set the anchorPoint before setting the frame, because the anchorPoint property will
+    //implicitly set the frame for the view, which we do not want.
+    self.layer.anchorPoint = CGPointMake(arrowPoint.x / topViewBounds.size.width, arrowPoint.y / topViewBounds.size.height);
+    self.frame = topViewBounds;
+    [self setNeedsDisplay];
+
+    [self addSubview:contentView];
+    [topView addSubview:self];
+
+    //Add a tap gesture recognizer to the large invisible view (self), which will detect taps anywhere on the screen.
+    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
+    tap.cancelsTouchesInView = NO; // Allow touches through to a UITableView or other touchable view, as suggested by Dimajp.
+    [self addGestureRecognizer:tap];
+    [tap RELEASE];
+
+    self.userInteractionEnabled = YES;
+}
+
+
+#pragma mark - Activity Indicator
+
+//Animates in a progress indicator, and removes
+- (void)showActivityIndicatorWithMessage:(NSString *)msg
+{
+    if ([titleView isKindOfClass:[UILabel class]]) {
+        ((UILabel *)titleView).text = msg;
+    }
+    
+    if (subviewsArray && (subviewsArray.count > 0)) {
+        [UIView animateWithDuration:0.2f animations:^{
+            for (UIView *view in subviewsArray) {
+                view.alpha = 0.f;
+            }
+        }];
+        
+        if (showDividerRects) {
+            showDividerRects = NO;
+            [self setNeedsDisplay];
+        }
+    }
+    
+    if (activityIndicator) {
+        [activityIndicator RELEASE];
+        [activityIndicator removeFromSuperview];
+        activityIndicator = nil;
+    }
+    
+    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
+    activityIndicator.frame = CGRectMake(CGRectGetMidX(contentView.bounds) - 10.f, CGRectGetMidY(contentView.bounds) - 10.f + 20.f, 20.f, 20.f);
+    [contentView addSubview:activityIndicator];
+    
+    [activityIndicator startAnimating];
+}
+
+- (void)hideActivityIndicatorWithMessage:(NSString *)msg
+{
+    if ([titleView isKindOfClass:[UILabel class]]) {
+        ((UILabel *)titleView).text = msg;
+    }
+    
+    [activityIndicator stopAnimating];
+    [UIView animateWithDuration:0.1f animations:^{
+        activityIndicator.alpha = 0.f;
+    } completion:^(BOOL finished) {
+        [activityIndicator RELEASE];
+        [activityIndicator removeFromSuperview];
+        activityIndicator = nil;
+    }];
+}
+
+- (void)showImage:(UIImage *)image withMessage:(NSString *)msg
+{
+    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
+    imageView.alpha = 0.f;
+    imageView.frame = CGRectMake(floorf(CGRectGetMidX(contentView.bounds) - image.size.width*0.5f), floorf(CGRectGetMidY(contentView.bounds) - image.size.height*0.5f + ((self.titleView) ? 20 : 0.f)), image.size.width, image.size.height);
+    imageView.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+    
+    [contentView addSubview:[imageView AUTORELEASE]];
+    
+    if (subviewsArray && (subviewsArray.count > 0)) {
+        [UIView animateWithDuration:0.2f animations:^{
+            for (UIView *view in subviewsArray) {
+                view.alpha = 0.f;
+            }
+        }];
+        
+        if (showDividerRects) {
+            showDividerRects = NO;
+            [self setNeedsDisplay];
+        }
+    }
+    
+    if (msg) {
+        if ([titleView isKindOfClass:[UILabel class]]) {
+            ((UILabel *)titleView).text = msg;
+        }
+    }
+    
+    [UIView animateWithDuration:0.2f delay:0.2f options:UIViewAnimationOptionCurveEaseOut animations:^{
+        imageView.alpha = 1.f;
+        imageView.transform = CGAffineTransformIdentity;
+    } completion:^(BOOL finished) {
+        //[imageView removeFromSuperview];
+    }];
+}
+
+- (void)showError
+{
+    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error"]];
+    imageView.alpha = 0.f;
+    imageView.frame = CGRectMake(CGRectGetMidX(contentView.bounds) - 20.f, CGRectGetMidY(contentView.bounds) - 20.f + ((self.titleView) ? 20 : 0.f), 40.f, 40.f);
+    imageView.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+    
+    [contentView addSubview:[imageView AUTORELEASE]];
+    
+    if (subviewsArray && (subviewsArray.count > 0)) {
+        [UIView animateWithDuration:0.1f animations:^{
+            for (UIView *view in subviewsArray) {
+                view.alpha = 0.f;
+            }
+        }];
+        
+        if (showDividerRects) {
+            showDividerRects = NO;
+            [self setNeedsDisplay];
+        }
+    }
+    
+    [UIView animateWithDuration:0.1f delay:0.1f options:UIViewAnimationOptionCurveEaseOut animations:^{
+        imageView.alpha = 1.f;
+        imageView.transform = CGAffineTransformIdentity;
+    } completion:^(BOOL finished) {
+        //[imageView removeFromSuperview];
+    }];
+    
+}
+
+- (void)showSuccess
+{
+    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"success"]];
+    imageView.alpha = 0.f;
+    imageView.frame = CGRectMake(CGRectGetMidX(contentView.bounds) - 20.f, CGRectGetMidY(contentView.bounds) - 20.f + ((self.titleView) ? 20 : 0.f), 40.f, 40.f);
+    imageView.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+    
+    [contentView addSubview:[imageView AUTORELEASE]];
+    
+    if (subviewsArray && (subviewsArray.count > 0)) {
+        [UIView animateWithDuration:0.1f animations:^{
+            for (UIView *view in subviewsArray) {
+                view.alpha = 0.f;
+            }
+        }];
+        
+        if (showDividerRects) {
+            showDividerRects = NO;
+            [self setNeedsDisplay];
+        }
+    }
+    
+    [UIView animateWithDuration:0.1f delay:0.1f options:UIViewAnimationOptionCurveEaseOut animations:^{
+        imageView.alpha = 1.f;
+        imageView.transform = CGAffineTransformIdentity;
+    } completion:^(BOOL finished) {
+        //[imageView removeFromSuperview];
+    }];
+    
+}
+
+#pragma mark - User Interaction
+
+- (void)tapped:(UITapGestureRecognizer *)tap
+{    
+    CGPoint point = [tap locationInView:contentView];
+    
+    //NSLog(@"point:(%f,%f)", point.x, point.y);
+    
+    BOOL found = NO;
+    
+    //NSLog(@"subviewsArray:%@", subviewsArray);
+    
+    for (int i = 0; i < subviewsArray.count && !found; i++) {
+        UIView *view = [subviewsArray objectAtIndex:i];
+        
+        //NSLog(@"Rect:(%f,%f,%f,%f)", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
+        
+        if (CGRectContainsPoint(view.frame, point)) {
+            //The tap was within this view, so we notify the delegate, and break the loop.
+            
+            found = YES;
+            
+            //NSLog(@"Tapped subview:%d", i);
+            
+            if ([view isKindOfClass:[UIButton class]]) {
+                return;
+            }
+            
+            if (delegate && [delegate respondsToSelector:@selector(popoverView:didSelectItemAtIndex:)]) {
+                [delegate popoverView:self didSelectItemAtIndex:i];
+            }
+            
+            break;
+        }
+    }
+    
+    if (!found && CGRectContainsPoint(contentView.bounds, point)) {
+        found = YES;
+        //NSLog(@"popover box contains point, ignoring user input");
+    }
+    
+    if (!found) {
+        [self dismiss:YES];
+    }
+    
+}
+
+- (void)didTapButton:(UIButton *)sender
+{
+    int index = [subviewsArray indexOfObject:sender];
+    
+    if (index == NSNotFound) {
+        return;
+    }
+    
+    if (delegate && [delegate respondsToSelector:@selector(popoverView:didSelectItemAtIndex:)]) {
+        [delegate popoverView:self didSelectItemAtIndex:index];
+    }
+}
+
+- (void)dismiss
+{
+    [self dismiss:YES];
+}
+
+- (void)dismiss:(BOOL)animated
+{
+    if (!animated)
+    {
+        [self dismissComplete];
+    }
+    else
+    {
+        [UIView animateWithDuration:0.3f animations:^{
+            self.alpha = 0.1f;
+            self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+        } completion:^(BOOL finished) {
+            [self dismissComplete];
+        }];
+    }
+}
+
+- (void)dismissComplete
+{
+    [self removeFromSuperview];
+    
+    if (self.delegate && [self.delegate respondsToSelector:@selector(popoverViewDidDismiss:)]) {
+        [delegate popoverViewDidDismiss:self];
+    }
+}
+
+- (void)animateRotationToNewPoint:(CGPoint)point inView:(UIView *)view withDuration:(NSTimeInterval)duration
+{
+    [self layoutAtPoint:point inView:view];
+}
+
+#pragma mark - Drawing Routines
+
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect
+{
+    // Drawing code
+    
+    // Build the popover path
+    CGRect frame = boxFrame;
+    
+    float xMin = CGRectGetMinX(frame);
+    float yMin = CGRectGetMinY(frame);
+    
+    float xMax = CGRectGetMaxX(frame);
+    float yMax = CGRectGetMaxY(frame);
+    
+    float radius = kBoxRadius; //Radius of the curvature.
+    
+    float cpOffset = kCPOffset; //Control Point Offset.  Modifies how "curved" the corners are.
+    
+    
+    /*
+     LT2            RT1
+     LT1⌜⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺⎺⌝RT2
+     |               |
+     |    popover    |
+     |               |
+     LB2⌞_______________⌟RB1
+     LB1           RB2
+     
+     Traverse rectangle in clockwise order, starting at LT1
+     L = Left
+     R = Right
+     T = Top
+     B = Bottom
+     1,2 = order of traversal for any given corner
+     
+     */
+    
+    UIBezierPath *popoverPath = [UIBezierPath bezierPath];
+    [popoverPath moveToPoint:CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + radius)];//LT1
+    [popoverPath addCurveToPoint:CGPointMake(xMin + radius, yMin) controlPoint1:CGPointMake(xMin, yMin + radius - cpOffset) controlPoint2:CGPointMake(xMin + radius - cpOffset, yMin)];//LT2
+    
+    //If the popover is positioned below (!above) the arrowPoint, then we know that the arrow must be on the top of the popover.
+    //In this case, the arrow is located between LT2 and RT1
+    if (!above) {
+        [popoverPath addLineToPoint:CGPointMake(arrowPoint.x - kArrowHeight, yMin)];//left side
+        [popoverPath addCurveToPoint:arrowPoint controlPoint1:CGPointMake(arrowPoint.x - kArrowHeight + kArrowCurvature, yMin) controlPoint2:arrowPoint];//actual arrow point
+        [popoverPath addCurveToPoint:CGPointMake(arrowPoint.x + kArrowHeight, yMin) controlPoint1:arrowPoint controlPoint2:CGPointMake(arrowPoint.x + kArrowHeight - kArrowCurvature, yMin)];//right side
+    }
+    
+    [popoverPath addLineToPoint:CGPointMake(xMax - radius, yMin)];//RT1
+    [popoverPath addCurveToPoint:CGPointMake(xMax, yMin + radius) controlPoint1:CGPointMake(xMax - radius + cpOffset, yMin) controlPoint2:CGPointMake(xMax, yMin + radius - cpOffset)];//RT2
+    [popoverPath addLineToPoint:CGPointMake(xMax, yMax - radius)];//RB1
+    [popoverPath addCurveToPoint:CGPointMake(xMax - radius, yMax) controlPoint1:CGPointMake(xMax, yMax - radius + cpOffset) controlPoint2:CGPointMake(xMax - radius + cpOffset, yMax)];//RB2
+    
+    //If the popover is positioned above the arrowPoint, then we know that the arrow must be on the bottom of the popover.
+    //In this case, the arrow is located somewhere between LB1 and RB2
+    if (above) {
+        [popoverPath addLineToPoint:CGPointMake(arrowPoint.x + kArrowHeight, yMax)];//right side
+        [popoverPath addCurveToPoint:arrowPoint controlPoint1:CGPointMake(arrowPoint.x + kArrowHeight - kArrowCurvature, yMax) controlPoint2:arrowPoint];//arrow point
+        [popoverPath addCurveToPoint:CGPointMake(arrowPoint.x - kArrowHeight, yMax) controlPoint1:arrowPoint controlPoint2:CGPointMake(arrowPoint.x - kArrowHeight + kArrowCurvature, yMax)];
+    }
+    
+    [popoverPath addLineToPoint:CGPointMake(xMin + radius, yMax)];//LB1
+    [popoverPath addCurveToPoint:CGPointMake(xMin, yMax - radius) controlPoint1:CGPointMake(xMin + radius - cpOffset, yMax) controlPoint2:CGPointMake(xMin, yMax - radius + cpOffset)];//LB2
+    [popoverPath closePath];
+    
+    //// General Declarations
+    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    
+    //// Shadow Declarations
+    UIColor* shadow = [UIColor colorWithWhite:0.0f alpha:kShadowAlpha];
+    CGSize shadowOffset = CGSizeMake(0, 1);
+    CGFloat shadowBlurRadius = kShadowBlur;
+    
+    //// Gradient Declarations
+    NSArray* gradientColors = [NSArray arrayWithObjects:
+                               (id)kGradientTopColor.CGColor,
+                               (id)kGradientBottomColor.CGColor, nil];
+    CGFloat gradientLocations[] = {0, 1};
+    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFTYPECAST(CFArrayRef)gradientColors), gradientLocations);
+    
+    
+    //These floats are the top and bottom offsets for the gradient drawing so the drawing includes the arrows.
+    float bottomOffset = (above ? kArrowHeight : 0.f);
+    float topOffset = (!above ? kArrowHeight : 0.f);
+    
+    //Draw the actual gradient and shadow.
+    CGContextSaveGState(context);
+    CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
+    CGContextBeginTransparencyLayer(context, NULL);
+    [popoverPath addClip];
+    CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame) - topOffset), CGPointMake(CGRectGetMidX(frame), CGRectGetMaxY(frame) + bottomOffset), 0);
+    CGContextEndTransparencyLayer(context);
+    CGContextRestoreGState(context);
+    
+    //// Cleanup
+    CGGradientRelease(gradient);
+    CGColorSpaceRelease(colorSpace);
+    
+    
+    //Draw the title background
+    if (kDrawTitleGradient) {
+        //Calculate the height of the title bg
+        float titleBGHeight = -1;
+        
+        //NSLog(@"titleView:%@", titleView);
+        
+        if (titleView != nil) {
+            titleBGHeight = kBoxPadding*2.f + titleView.frame.size.height;
+        }
+        
+        
+        //Draw the title bg height, but only if we need to.
+        if (titleBGHeight > 0.f) {
+            CGPoint startingPoint = CGPointMake(xMin, yMin + titleBGHeight);
+            CGPoint endingPoint = CGPointMake(xMax, yMin + titleBGHeight);
+            
+            UIBezierPath *titleBGPath = [UIBezierPath bezierPath];
+            [titleBGPath moveToPoint:startingPoint];
+            [titleBGPath addLineToPoint:CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + radius)];//LT1
+            [titleBGPath addCurveToPoint:CGPointMake(xMin + radius, yMin) controlPoint1:CGPointMake(xMin, yMin + radius - cpOffset) controlPoint2:CGPointMake(xMin + radius - cpOffset, yMin)];//LT2
+            
+            //If the popover is positioned below (!above) the arrowPoint, then we know that the arrow must be on the top of the popover.
+            //In this case, the arrow is located between LT2 and RT1
+            if (!above) {
+                [titleBGPath addLineToPoint:CGPointMake(arrowPoint.x - kArrowHeight, yMin)];//left side
+                [titleBGPath addCurveToPoint:arrowPoint controlPoint1:CGPointMake(arrowPoint.x - kArrowHeight + kArrowCurvature, yMin) controlPoint2:arrowPoint];//actual arrow point
+                [titleBGPath addCurveToPoint:CGPointMake(arrowPoint.x + kArrowHeight, yMin) controlPoint1:arrowPoint controlPoint2:CGPointMake(arrowPoint.x + kArrowHeight - kArrowCurvature, yMin)];//right side
+            }
+            
+            [titleBGPath addLineToPoint:CGPointMake(xMax - radius, yMin)];//RT1
+            [titleBGPath addCurveToPoint:CGPointMake(xMax, yMin + radius) controlPoint1:CGPointMake(xMax - radius + cpOffset, yMin) controlPoint2:CGPointMake(xMax, yMin + radius - cpOffset)];//RT2
+            [titleBGPath addLineToPoint:endingPoint];
+            [titleBGPath addLineToPoint:startingPoint];
+            [titleBGPath closePath];
+            
+            //// General Declarations
+            CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+            CGContextRef context = UIGraphicsGetCurrentContext();
+            
+            //// Gradient Declarations
+            NSArray* gradientColors = [NSArray arrayWithObjects:
+                                       (id)kGradientTitleTopColor.CGColor,
+                                       (id)kGradientTitleBottomColor.CGColor, nil];
+            CGFloat gradientLocations[] = {0, 1};
+            CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFTYPECAST(CFArrayRef)gradientColors), gradientLocations);
+            
+            
+            //These floats are the top and bottom offsets for the gradient drawing so the drawing includes the arrows.
+            float topOffset = (!above ? kArrowHeight : 0.f);
+            
+            //Draw the actual gradient and shadow.
+            CGContextSaveGState(context);
+            CGContextBeginTransparencyLayer(context, NULL);
+            [titleBGPath addClip];
+            CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame) - topOffset), CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame) + titleBGHeight), 0);
+            CGContextEndTransparencyLayer(context);
+            CGContextRestoreGState(context);
+            
+            UIBezierPath *dividerLine = [UIBezierPath bezierPathWithRect:CGRectMake(startingPoint.x, startingPoint.y, (endingPoint.x - startingPoint.x), 0.5f)];
+            [[UIColor colorWithRed:0.741 green:0.741 blue:0.741 alpha:0.5f] setFill];
+            [dividerLine fill];
+            
+            //// Cleanup
+            CGGradientRelease(gradient);
+            CGColorSpaceRelease(colorSpace);
+        }
+    }
+    
+    
+    
+    //Draw the divider rects if we need to
+    {
+        if (kShowDividersBetweenViews && showDividerRects) {
+            if (dividerRects && dividerRects.count > 0) {
+                for (NSValue *value in dividerRects) {
+                    CGRect rect = value.CGRectValue;
+                    rect.origin.x += contentView.frame.origin.x;
+                    rect.origin.y += contentView.frame.origin.y;
+                    
+                    UIBezierPath *dividerPath = [UIBezierPath bezierPathWithRect:rect];
+                    [kDividerColor setFill];
+                    [dividerPath fill];
+                }
+            }
+        }
+    }
+    
+    //Draw border if we need to
+    //The border is done last because it needs to be drawn on top of everything else
+    if (kDrawBorder) {
+        [kBorderColor setStroke];
+        popoverPath.lineWidth = kBorderWidth;
+        [popoverPath stroke];
+    }
+    
+}
+
+ at end
diff --git a/ios/iosremote/PopoverViewCompatibility.h b/ios/iosremote/PopoverViewCompatibility.h
new file mode 100755
index 0000000..f5ce1bb
--- /dev/null
+++ b/ios/iosremote/PopoverViewCompatibility.h
@@ -0,0 +1,23 @@
+//
+//  PopoverViewCompatibility.h
+//  popover
+//
+//  Created by alanduncan on 7/22/13.
+//  Copyright (c) 2013 Oliver Rickard. All rights reserved.
+//
+
+#ifndef popover_PopoverViewCompatibility_h
+#define popover_PopoverViewCompatibility_h
+
+#ifdef __IPHONE_6_0
+
+#define UITextAlignmentCenter       NSTextAlignmentCenter
+#define UITextAlignmentLeft         NSTextAlignmentLeft
+#define UITextAlignmentRight        NSTextAlignmentRight
+#define UILineBreakModeTailTruncation   NSLineBreakByTruncatingTail
+#define UILineBreakModeMiddleTruncation NSLineBreakByTruncatingMiddle
+#define UILineBreakModeWordWrap         NSLineBreakByWordWrapping
+
+#endif
+
+#endif
diff --git a/ios/iosremote/PopoverView_Configuration.h b/ios/iosremote/PopoverView_Configuration.h
new file mode 100755
index 0000000..f59ac94
--- /dev/null
+++ b/ios/iosremote/PopoverView_Configuration.h
@@ -0,0 +1,112 @@
+//
+//  PopoverView_Configuration.h
+//  popover
+//
+//  Created by Bas Pellis on 12/25/12.
+//  Copyright (c) 2012 Oliver Rickard. All rights reserved.
+//
+
+#pragma mark Constants - Configure look/feel
+
+// BOX GEOMETRY
+
+//Height/width of the actual arrow
+#define kArrowHeight 12.f
+
+//padding within the box for the contentView
+#define kBoxPadding 10.f
+
+//control point offset for rounding corners of the main popover box
+#define kCPOffset 1.8f
+
+//radius for the rounded corners of the main popover box
+#define kBoxRadius 4.f
+
+//Curvature value for the arrow.  Set to 0.f to make it linear.
+#define kArrowCurvature 6.f
+
+//Minimum distance from the side of the arrow to the beginning of curvature for the box
+#define kArrowHorizontalPadding 5.f
+
+//Alpha value for the shadow behind the PopoverView
+#define kShadowAlpha 0.4f
+
+//Blur for the shadow behind the PopoverView
+#define kShadowBlur 3.f;
+
+//Box gradient bg alpha
+#define kBoxAlpha 0.95f
+
+//Padding along top of screen to allow for any nav/status bars
+#define kTopMargin 50.f
+
+//margin along the left and right of the box
+#define kHorizontalMargin 10.f
+
+//padding along top of icons/images
+#define kImageTopPadding 3.f
+
+//padding along bottom of icons/images
+#define kImageBottomPadding 3.f
+
+
+// DIVIDERS BETWEEN VIEWS
+
+//Bool that turns off/on the dividers
+#define kShowDividersBetweenViews NO
+
+//color for the divider fill
+#define kDividerColor [UIColor colorWithRed:0.329 green:0.341 blue:0.353 alpha:0.15f]
+
+
+// BACKGROUND GRADIENT
+
+//bottom color white in gradient bg
+#define kGradientBottomColor [UIColor colorWithRed:0.98f green:0.98f blue:0.98f alpha:kBoxAlpha]
+
+//top color white value in gradient bg
+#define kGradientTopColor [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:kBoxAlpha]
+
+
+// TITLE GRADIENT
+
+//bool that turns off/on title gradient
+#define kDrawTitleGradient YES
+
+//bottom color white value in title gradient bg
+#define kGradientTitleBottomColor [UIColor colorWithRed:0.93f green:0.93f blue:0.93f alpha:kBoxAlpha]
+
+//top color white value in title gradient bg
+#define kGradientTitleTopColor [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:kBoxAlpha]
+
+
+// FONTS
+
+//normal text font
+#define kTextFont [UIFont fontWithName:@"HelveticaNeue" size:16.f]
+
+//normal text color
+#define kTextColor [UIColor colorWithRed:0.329 green:0.341 blue:0.353 alpha:1]
+// highlighted text color
+#define kTextHighlightColor [UIColor colorWithRed:0.098 green:0.102 blue:0.106 alpha:1.000]
+
+//normal text alignment
+#define kTextAlignment UITextAlignmentCenter
+
+//title font
+#define kTitleFont [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.f]
+
+//title text color
+#define kTitleColor [UIColor colorWithRed:0.329 green:0.341 blue:0.353 alpha:1]
+
+
+// BORDER
+
+//bool that turns off/on the border
+#define kDrawBorder NO
+
+//border color
+#define kBorderColor [UIColor blackColor]
+
+//border width
+#define kBorderWidth 1.f
\ No newline at end of file
diff --git a/ios/iosremote/TestFlightSDK1.2.6/.DS_Store b/ios/iosremote/TestFlightSDK1.2.6/.DS_Store
new file mode 100644
index 0000000..177ff60
Binary files /dev/null and b/ios/iosremote/TestFlightSDK1.2.6/.DS_Store differ
diff --git a/ios/iosremote/UIBarButtonItem+Theme.h b/ios/iosremote/UIBarButtonItem+Theme.h
new file mode 100644
index 0000000..5fa5b74
--- /dev/null
+++ b/ios/iosremote/UIBarButtonItem+Theme.h
@@ -0,0 +1,16 @@
+//
+//  UIBarButtonItem+Theme.h
+//  VLC for iOS
+//
+//  Created by Romain Goyet on 14/06/13.
+//  Copyright (c) 2013 Applidium. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+ at interface UIBarButtonItem (Theme)
++ (UIBarButtonItem *)themedDoneButtonWithTarget:(id)target andSelector:(SEL)selector;
++ (UIBarButtonItem *)themedBackButtonWithTarget:(id)target andSelector:(SEL)selector;
+ at end
diff --git a/ios/iosremote/UIBarButtonItem+Theme.m b/ios/iosremote/UIBarButtonItem+Theme.m
new file mode 100644
index 0000000..4f125fc
--- /dev/null
+++ b/ios/iosremote/UIBarButtonItem+Theme.m
@@ -0,0 +1,48 @@
+//
+//  UIBarButtonItem+Theme.m
+//  VLC for iOS
+//
+//  Created by Romain Goyet on 14/06/13.
+//  Copyright (c) 2013 Applidium. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import "UIBarButtonItem+Theme.h"
+
+ at implementation UIBarButtonItem (Theme)
++ (UIBarButtonItem *)themedDoneButtonWithTarget:(id)target andSelector:(SEL)selector
+{
+    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_DONE", @"")
+                                                                      style:UIBarButtonItemStyleBordered
+                                                                     target:target
+                                                                     action:selector];
+    [doneButton setBackgroundImage:[UIImage imageNamed:@"doneButton"]
+                          forState:UIControlStateNormal
+                        barMetrics:UIBarMetricsDefault];
+    [doneButton setBackgroundImage:[UIImage imageNamed:@"doneButtonHighlight"]
+                          forState:UIControlStateHighlighted
+                        barMetrics:UIBarMetricsDefault];
+    [doneButton setTitleTextAttributes:@{UITextAttributeTextShadowColor : [UIColor whiteColor], UITextAttributeTextColor : [UIColor blackColor]}
+                              forState:UIControlStateNormal];
+    return doneButton;
+}
+
++ (UIBarButtonItem *)themedBackButtonWithTarget:(id)target andSelector:(SEL)selector
+{
+    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_BACK", @"")
+                                                                   style:UIBarButtonItemStyleBordered
+                                                                  target:target
+                                                                  action:selector];
+    [backButton setBackgroundImage:[[UIImage imageNamed:@"backButton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 6)]
+                          forState:UIControlStateNormal
+                        barMetrics:UIBarMetricsDefault];
+    [backButton setBackgroundImage:[[UIImage imageNamed:@"backButtonHighlight"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 6)]
+                          forState:UIControlStateHighlighted
+                        barMetrics:UIBarMetricsDefault];
+    [backButton setTitleTextAttributes:@{UITextAttributeTextShadowColor : [UIColor colorWithWhite:0. alpha:.37], UITextAttributeTextColor : [UIColor whiteColor]} forState:UIControlStateNormal];
+    [backButton setTitlePositionAdjustment:UIOffsetMake(3, 0) forBarMetrics:UIBarMetricsDefault];
+    return backButton;
+}
+
+ at end
diff --git a/ios/iosremote/UINavigationController+Theme.h b/ios/iosremote/UINavigationController+Theme.h
new file mode 100644
index 0000000..2a27d8e
--- /dev/null
+++ b/ios/iosremote/UINavigationController+Theme.h
@@ -0,0 +1,15 @@
+//
+//  UINavigationController+Theme.h
+//  VLC for iOS
+//
+//  Created by Romain Goyet on 14/06/13.
+//  Copyright (c) 2013 Applidium. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+ at interface UINavigationController (Theme)
+- (void)loadTheme;
+ at end
diff --git a/ios/iosremote/UINavigationController+Theme.m b/ios/iosremote/UINavigationController+Theme.m
new file mode 100644
index 0000000..5e8ed3a
--- /dev/null
+++ b/ios/iosremote/UINavigationController+Theme.m
@@ -0,0 +1,23 @@
+//
+//  UINavigationController+Theme.m
+//  VLC for iOS
+//
+//  Created by Romain Goyet on 14/06/13.
+//  Copyright (c) 2013 Applidium. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import "UINavigationController+Theme.h"
+
+ at implementation UINavigationController (Theme)
+- (void)loadTheme
+{
+    UINavigationBar *navBar = self.navigationBar;
+    [navBar setBackgroundImage:[UIImage imageNamed:@"navBarBackground"]
+                 forBarMetrics:UIBarMetricsDefault];
+    [navBar setBackgroundImage:[UIImage imageNamed:@"navBarBackgroundPhoneLandscape"]
+                 forBarMetrics:UIBarMetricsLandscapePhone];
+    navBar.barStyle = UIBarStyleBlack;
+}
+ at end
diff --git a/ios/iosremote/iPad_autosize.storyboard b/ios/iosremote/iPad_autosize.storyboard
index 804740f..4883c1b 100644
--- a/ios/iosremote/iPad_autosize.storyboard
+++ b/ios/iosremote/iPad_autosize.storyboard
@@ -47,7 +47,7 @@
                                 <action selector="cancelModalView:" destination="5QV-E7-KNT" id="rSl-Rp-xQb"/>
                             </connections>
                         </barButtonItem>
-                        <barButtonItem key="rightBarButtonItem" systemItem="add" id="pU6-XF-laS">
+                        <barButtonItem key="rightBarButtonItem" image="add.png" id="pU6-XF-laS">
                             <connections>
                                 <segue destination="65c-5D-pB7" kind="push" identifier="create_new_server" id="ORn-0W-dHd"/>
                             </connections>
@@ -367,6 +367,21 @@
                                 </subviews>
                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                             </view>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="jBq-0A-D38">
+                                <rect key="frame" x="683.5" y="898.5" width="97" height="59"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                                <state key="normal" backgroundImage="gear.png">
+                                    <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <state key="highlighted" backgroundImage="gear_pressed">
+                                    <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <connections>
+                                    <action selector="popOverUp:" destination="TYh-Hw-m1Q" eventType="touchUpInside" id="0Zm-gv-gne"/>
+                                </connections>
+                            </button>
                             <view alpha="0.50000000000000011" contentMode="scaleToFill" id="jX5-gj-cqE">
                                 <rect key="frame" x="0.0" y="0.0" width="768" height="1004"/>
                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -400,7 +415,7 @@
                                         <size key="shadowOffset" width="0.0" height="0.0"/>
                                     </label>
                                 </subviews>
-                                <color key="backgroundColor" red="0.29803921568627451" green="0.74509803921568629" blue="0.22745098039215686" alpha="1" colorSpace="calibratedRGB"/>
+                                <color key="backgroundColor" red="0.89411764709999997" green="0.43529411759999997" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/>
                             </view>
                         </subviews>
                         <color key="backgroundColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
@@ -411,6 +426,7 @@
                         <outlet property="NotesView" destination="Pk1-fD-KAi" id="2ZD-si-fls"/>
                         <outlet property="clearButton" destination="MKb-4h-13P" id="7Xz-n6-sre"/>
                         <outlet property="currentSlideImageView" destination="x7C-rs-s4K" id="Qtf-99-j0C"/>
+                        <outlet property="gearButton" destination="jBq-0A-D38" id="ATa-gU-YT0"/>
                         <outlet property="horizontalTableView" destination="Iok-mu-c0T" id="SJT-pa-4Hb"/>
                         <outlet property="movingPointer" destination="2SJ-3f-E3k" id="mxV-zz-hjx"/>
                         <outlet property="nextButton" destination="bfp-PJ-NrP" id="1Uf-1g-iQl"/>
@@ -526,6 +542,9 @@
     </scenes>
     <resources>
         <image name="Default-568h at 2x.png" width="640" height="1136"/>
+        <image name="add.png" width="24" height="24"/>
+        <image name="gear.png" width="55" height="35"/>
+        <image name="gear_pressed" width="16" height="16"/>
         <image name="libO_icon.png" width="598" height="598"/>
         <image name="nextButton_normal.png" width="42" height="230"/>
         <image name="nextButton_pressed.png" width="42" height="230"/>
@@ -534,6 +553,86 @@
         <image name="timer_clear_btn.png" width="74" height="74"/>
         <image name="timer_start_btn.png" width="74" height="74"/>
     </resources>
+    <classes>
+        <class className="BasePresentationViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/BasePresentationViewController.h"/>
+            <relationships>
+                <relationship kind="action" name="nextSlideAction:"/>
+                <relationship kind="action" name="previousSlideAction:"/>
+                <relationship kind="action" name="startConnectionModal:"/>
+                <relationship kind="outlet" name="NoteWebView" candidateClass="UIWebView"/>
+                <relationship kind="outlet" name="NotesView" candidateClass="UIView"/>
+                <relationship kind="outlet" name="clearButton" candidateClass="UIButton"/>
+                <relationship kind="outlet" name="currentSlideImageView" candidateClass="UIImageView"/>
+                <relationship kind="outlet" name="gearButton" candidateClass="UIButton"/>
+                <relationship kind="outlet" name="horizontalTableView" candidateClass="UITableView"/>
+                <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
+                <relationship kind="outlet" name="nextButton" candidateClass="UIButton"/>
+                <relationship kind="outlet" name="previousButton" candidateClass="UIButton"/>
+                <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
+                <relationship kind="outlet" name="startButton" candidateClass="UIButton"/>
+                <relationship kind="outlet" name="timeLabel" candidateClass="UILabel"/>
+                <relationship kind="outlet" name="welcome_blocking_page" candidateClass="UIView"/>
+                <relationship kind="outlet" name="welcome_connect_button" candidateClass="UIButton"/>
+                <relationship kind="outlet" name="welcome_label" candidateClass="UILabel"/>
+                <relationship kind="outlet" name="welcome_libO_icon" candidateClass="UIImageView"/>
+            </relationships>
+        </class>
+        <class className="EditableTableViewCell" superclassName="UITableViewCell">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/EditableTableViewCell.h"/>
+        </class>
+        <class className="LibONavigationController" superclassName="UINavigationController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/LibONavigationController.h"/>
+        </class>
+        <class className="MainSplitViewController" superclassName="UISplitViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/MainSplitViewController.h"/>
+        </class>
+        <class className="autoDismissKeyboardNavigationViewController" superclassName="LibONavigationController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/autoDismissKeyboardNavigationViewController.h"/>
+        </class>
+        <class className="newServerViewController" superclassName="UITableViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/newServerViewController.h"/>
+            <relationships>
+                <relationship kind="action" name="save:"/>
+                <relationship kind="outlet" name="saveButton" candidateClass="UIBarButtonItem"/>
+            </relationships>
+        </class>
+        <class className="pinValidation_vc" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/pinValidation_vc.h"/>
+            <relationships>
+                <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
+                <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
+            </relationships>
+        </class>
+        <class className="server_list_vc" superclassName="UITableViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/server_list_vc.h"/>
+            <relationships>
+                <relationship kind="outlet" name="serverTable" candidateClass="UITableView"/>
+            </relationships>
+        </class>
+        <class className="server_list_vc_ipad" superclassName="server_list_vc">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/server_list_vc_ipad.h"/>
+            <relationships>
+                <relationship kind="action" name="cancelModalView:"/>
+            </relationships>
+        </class>
+        <class className="slideShowPreviewTable_vc" superclassName="UITableViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowPreviewTable_vc.h"/>
+            <relationships>
+                <relationship kind="action" name="startPresentationAction:"/>
+                <relationship kind="outlet" name="optionsTable" candidateClass="UITableView"/>
+            </relationships>
+        </class>
+        <class className="slideShowPreviewTable_vc_ipad" superclassName="slideShowPreviewTable_vc">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowPreviewTable_vc_ipad.h"/>
+            <relationships>
+                <relationship kind="outlet" name="titleLabel" candidateClass="UILabel"/>
+            </relationships>
+        </class>
+        <class className="slideShowSwipeInList_ipad" superclassName="UITableViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowSwipeInList_ipad.h"/>
+        </class>
+    </classes>
     <simulatedMetricsContainer key="defaultSimulatedMetrics">
         <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
         <simulatedOrientationMetrics key="orientation"/>
diff --git a/ios/iosremote/iosremote.xcodeproj/project.pbxproj b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
index 2d8dc71..6ba9a7c 100644
--- a/ios/iosremote/iosremote.xcodeproj/project.pbxproj
+++ b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
@@ -63,7 +63,26 @@
 		8C0DC84717A45B160099E5AE /* libO_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C0DC84617A45B160099E5AE /* libO_icon.png */; };
 		8C0DC85117A512250099E5AE /* AppDelegate_ipad.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C0DC85017A512250099E5AE /* AppDelegate_ipad.m */; };
 		8C19F41D17B00899005BDB61 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */; };
-		8C1A16FB17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FA17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png */; };
+		8C19F41F17B02A8A005BDB61 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */; };
+		8C19F42417B02C7A005BDB61 /* PopoverView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42117B02AA9005BDB61 /* PopoverView.m */; };
+		8C19F42717B04E7C005BDB61 /* navBarBackground at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F42517B04E7C005BDB61 /* navBarBackground at 2x.png */; };
+		8C19F42817B04E7C005BDB61 /* navBarBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F42617B04E7C005BDB61 /* navBarBackground.png */; };
+		8C19F42F17B05089005BDB61 /* LibONavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42E17B05089005BDB61 /* LibONavigationController.m */; };
+		8C19F43017B0518A005BDB61 /* UINavigationController+Theme.h in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */; };
+		8C19F43117B0518A005BDB61 /* UINavigationController+Theme.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */; };
+		8C19F43317B056B3005BDB61 /* navBarButtonNormal at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43217B056B3005BDB61 /* navBarButtonNormal at 2x.png */; };
+		8C19F43617B10D49005BDB61 /* UIViewController+LibOStyling.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F43517B10D49005BDB61 /* UIViewController+LibOStyling.m */; };
+		8C19F43917B145AD005BDB61 /* backButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43717B145AD005BDB61 /* backButton.png */; };
+		8C19F43A17B145AD005BDB61 /* backButton at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43817B145AD005BDB61 /* backButton at 2x.png */; };
+		8C19F43E17B1D935005BDB61 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43C17B1D935005BDB61 /* add.png */; };
+		8C19F44117B1E961005BDB61 /* gear.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43F17B1E961005BDB61 /* gear.png */; };
+		8C19F44217B1E961005BDB61 /* gear at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44017B1E961005BDB61 /* gear at 2x.png */; };
+		8C19F44517B1F21B005BDB61 /* gear_pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44317B1F21B005BDB61 /* gear_pressed.png */; };
+		8C19F44617B1F21B005BDB61 /* gear_pressed at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44417B1F21B005BDB61 /* gear_pressed at 2x.png */; };
+		8C19F44717B1FB51005BDB61 /* iosremote_iphone_icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FA17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png */; };
+		8C19F44A17B1FEFE005BDB61 /* gear_transparent_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44817B1FEFD005BDB61 /* gear_transparent_bg.png */; };
+		8C19F44B17B1FEFE005BDB61 /* gear_transparent_bg at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44917B1FEFE005BDB61 /* gear_transparent_bg at 2x.png */; };
+		8C19F44D17B20427005BDB61 /* add at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44C17B20426005BDB61 /* add at 2x.png */; };
 		8C1A16FD17A2853700B4BB3C /* iosremote_iphone_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FC17A2853700B4BB3C /* iosremote_iphone_icon.png */; };
 		8C1A16FF17A2853F00B4BB3C /* iosremote_ipad_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FE17A2853F00B4BB3C /* iosremote_ipad_icon.png */; };
 		8C1A170117A2854300B4BB3C /* iosremote_ipad_icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A170017A2854300B4BB3C /* iosremote_ipad_icon at 2x.png */; };
@@ -167,6 +186,32 @@
 		8C0DC84F17A512250099E5AE /* AppDelegate_ipad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate_ipad.h; path = iosremote/AppDelegate_ipad.h; sourceTree = "<group>"; };
 		8C0DC85017A512250099E5AE /* AppDelegate_ipad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate_ipad.m; path = iosremote/AppDelegate_ipad.m; sourceTree = "<group>"; };
 		8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+		8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+		8C19F42017B02AA9005BDB61 /* PopoverView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PopoverView.h; sourceTree = "<group>"; };
+		8C19F42117B02AA9005BDB61 /* PopoverView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PopoverView.m; sourceTree = "<group>"; };
+		8C19F42217B02C2E005BDB61 /* PopoverView_Configuration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PopoverView_Configuration.h; sourceTree = "<group>"; };
+		8C19F42317B02C2E005BDB61 /* PopoverViewCompatibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PopoverViewCompatibility.h; sourceTree = "<group>"; };
+		8C19F42517B04E7C005BDB61 /* navBarBackground at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navBarBackground at 2x.png"; sourceTree = "<group>"; };
+		8C19F42617B04E7C005BDB61 /* navBarBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = navBarBackground.png; sourceTree = "<group>"; };
+		8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+Theme.h"; sourceTree = "<group>"; };
+		8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+Theme.m"; sourceTree = "<group>"; };
+		8C19F42B17B04EC6005BDB61 /* UIBarButtonItem+Theme.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+Theme.h"; sourceTree = "<group>"; };
+		8C19F42C17B04EC6005BDB61 /* UIBarButtonItem+Theme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+Theme.m"; sourceTree = "<group>"; };
+		8C19F42D17B05089005BDB61 /* LibONavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibONavigationController.h; path = iosremote/LibONavigationController.h; sourceTree = "<group>"; };
+		8C19F42E17B05089005BDB61 /* LibONavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LibONavigationController.m; path = iosremote/LibONavigationController.m; sourceTree = "<group>"; };
+		8C19F43217B056B3005BDB61 /* navBarButtonNormal at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "navBarButtonNormal at 2x.png"; path = "iosremote/navBarButtonNormal at 2x.png"; sourceTree = "<group>"; };
+		8C19F43417B10D48005BDB61 /* UIViewController+LibOStyling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+LibOStyling.h"; path = "iosremote/UIViewController+LibOStyling.h"; sourceTree = "<group>"; };
+		8C19F43517B10D49005BDB61 /* UIViewController+LibOStyling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+LibOStyling.m"; path = "iosremote/UIViewController+LibOStyling.m"; sourceTree = "<group>"; };
+		8C19F43717B145AD005BDB61 /* backButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = backButton.png; path = iosremote/backButton.png; sourceTree = "<group>"; };
+		8C19F43817B145AD005BDB61 /* backButton at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "backButton at 2x.png"; path = "iosremote/backButton at 2x.png"; sourceTree = "<group>"; };
+		8C19F43C17B1D935005BDB61 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add.png; path = iosremote/add.png; sourceTree = "<group>"; };
+		8C19F43F17B1E961005BDB61 /* gear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear.png; path = iosremote/gear.png; sourceTree = "<group>"; };
+		8C19F44017B1E961005BDB61 /* gear at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "gear at 2x.png"; path = "iosremote/gear at 2x.png"; sourceTree = "<group>"; };
+		8C19F44317B1F21B005BDB61 /* gear_pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear_pressed.png; path = iosremote/gear_pressed.png; sourceTree = "<group>"; };
+		8C19F44417B1F21B005BDB61 /* gear_pressed at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "gear_pressed at 2x.png"; path = "iosremote/gear_pressed at 2x.png"; sourceTree = "<group>"; };
+		8C19F44817B1FEFD005BDB61 /* gear_transparent_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear_transparent_bg.png; path = iosremote/gear_transparent_bg.png; sourceTree = "<group>"; };
+		8C19F44917B1FEFE005BDB61 /* gear_transparent_bg at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "gear_transparent_bg at 2x.png"; path = "iosremote/gear_transparent_bg at 2x.png"; sourceTree = "<group>"; };
+		8C19F44C17B20426005BDB61 /* add at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "add at 2x.png"; path = "iosremote/add at 2x.png"; sourceTree = "<group>"; };
 		8C1A16FA17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iosremote_iphone_icon at 2x.png"; sourceTree = "<group>"; };
 		8C1A16FC17A2853700B4BB3C /* iosremote_iphone_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iosremote_iphone_icon.png; sourceTree = "<group>"; };
 		8C1A16FE17A2853F00B4BB3C /* iosremote_ipad_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iosremote_ipad_icon.png; sourceTree = "<group>"; };
@@ -212,6 +257,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8C19F41F17B02A8A005BDB61 /* QuartzCore.framework in Frameworks */,
 				8C19F41D17B00899005BDB61 /* SystemConfiguration.framework in Frameworks */,
 				571102701794128E007D343B /* libz.dylib in Frameworks */,
 				57DC7007178D84490050FC58 /* CoreMotion.framework in Frameworks */,
@@ -261,6 +307,19 @@
 		57AEEDAA1788D7B2007F4F97 /* Ressources */ = {
 			isa = PBXGroup;
 			children = (
+				8C19F44C17B20426005BDB61 /* add at 2x.png */,
+				8C19F44817B1FEFD005BDB61 /* gear_transparent_bg.png */,
+				8C19F44917B1FEFE005BDB61 /* gear_transparent_bg at 2x.png */,
+				8C19F44317B1F21B005BDB61 /* gear_pressed.png */,
+				8C19F44417B1F21B005BDB61 /* gear_pressed at 2x.png */,
+				8C19F43F17B1E961005BDB61 /* gear.png */,
+				8C19F44017B1E961005BDB61 /* gear at 2x.png */,
+				8C19F43C17B1D935005BDB61 /* add.png */,
+				8C19F43717B145AD005BDB61 /* backButton.png */,
+				8C19F43817B145AD005BDB61 /* backButton at 2x.png */,
+				8C19F43217B056B3005BDB61 /* navBarButtonNormal at 2x.png */,
+				8C19F42517B04E7C005BDB61 /* navBarBackground at 2x.png */,
+				8C19F42617B04E7C005BDB61 /* navBarBackground.png */,
 				8C26E5D117A5AFE8007DA4B7 /* slideshowRail.png */,
 				8C26E5D217A5AFE8007DA4B7 /* slideshowRail at 2x.png */,
 				8C0DC84617A45B160099E5AE /* libO_icon.png */,
@@ -310,6 +369,7 @@
 		57C6E3E6175E06E800E8BC5F = {
 			isa = PBXGroup;
 			children = (
+				8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */,
 				8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */,
 				8C1A170217A28AB900B4BB3C /* Shared */,
 				8C1A170917A28E6500B4BB3C /* iPhone */,
@@ -415,6 +475,10 @@
 		8C1A170617A28DDF00B4BB3C /* Support */ = {
 			isa = PBXGroup;
 			children = (
+				8C19F42017B02AA9005BDB61 /* PopoverView.h */,
+				8C19F42217B02C2E005BDB61 /* PopoverView_Configuration.h */,
+				8C19F42317B02C2E005BDB61 /* PopoverViewCompatibility.h */,
+				8C19F42117B02AA9005BDB61 /* PopoverView.m */,
 				57B152971764703500EECC67 /* Base64.h */,
 				57B152981764703500EECC67 /* Base64.m */,
 				57CFED9717838FDC00E82E05 /* EditableTableViewCell.h */,
@@ -428,6 +492,14 @@
 				8C26E5D617A68154007DA4B7 /* stopWatch.m */,
 				8C0323A917A943720037432E /* UIImageView+setImageAnimated.h */,
 				8C0323AA17A943720037432E /* UIImageView+setImageAnimated.m */,
+				8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */,
+				8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */,
+				8C19F42B17B04EC6005BDB61 /* UIBarButtonItem+Theme.h */,
+				8C19F42C17B04EC6005BDB61 /* UIBarButtonItem+Theme.m */,
+				8C19F42D17B05089005BDB61 /* LibONavigationController.h */,
+				8C19F42E17B05089005BDB61 /* LibONavigationController.m */,
+				8C19F43417B10D48005BDB61 /* UIViewController+LibOStyling.h */,
+				8C19F43517B10D49005BDB61 /* UIViewController+LibOStyling.m */,
 			);
 			name = Support;
 			sourceTree = "<group>";
@@ -585,7 +657,6 @@
 				57DF0A85178FFFAB008B2D3D /* iPhone_autosize.storyboard in Resources */,
 				5711026D1794127E007D343B /* README.md in Resources */,
 				5711026E1794127E007D343B /* release_notes.md in Resources */,
-				8C1A16FB17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png in Resources */,
 				8C1A16FD17A2853700B4BB3C /* iosremote_iphone_icon.png in Resources */,
 				8C1A16FF17A2853F00B4BB3C /* iosremote_ipad_icon.png in Resources */,
 				8C1A170117A2854300B4BB3C /* iosremote_ipad_icon at 2x.png in Resources */,
@@ -606,6 +677,20 @@
 				8C26E5C617A5539D007DA4B7 /* UserDefaults.plist in Resources */,
 				8C26E5D317A5AFE8007DA4B7 /* slideshowRail.png in Resources */,
 				8C26E5D417A5AFE8007DA4B7 /* slideshowRail at 2x.png in Resources */,
+				8C19F42717B04E7C005BDB61 /* navBarBackground at 2x.png in Resources */,
+				8C19F42817B04E7C005BDB61 /* navBarBackground.png in Resources */,
+				8C19F43317B056B3005BDB61 /* navBarButtonNormal at 2x.png in Resources */,
+				8C19F43917B145AD005BDB61 /* backButton.png in Resources */,
+				8C19F43A17B145AD005BDB61 /* backButton at 2x.png in Resources */,
+				8C19F43E17B1D935005BDB61 /* add.png in Resources */,
+				8C19F44117B1E961005BDB61 /* gear.png in Resources */,
+				8C19F44217B1E961005BDB61 /* gear at 2x.png in Resources */,
+				8C19F44517B1F21B005BDB61 /* gear_pressed.png in Resources */,
+				8C19F44617B1F21B005BDB61 /* gear_pressed at 2x.png in Resources */,
+				8C19F44717B1FB51005BDB61 /* iosremote_iphone_icon at 2x.png in Resources */,
+				8C19F44A17B1FEFE005BDB61 /* gear_transparent_bg.png in Resources */,
+				8C19F44B17B1FEFE005BDB61 /* gear_transparent_bg at 2x.png in Resources */,
+				8C19F44D17B20427005BDB61 /* add at 2x.png in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -616,6 +701,9 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				8C19F43017B0518A005BDB61 /* UINavigationController+Theme.h in Sources */,
+				8C19F43117B0518A005BDB61 /* UINavigationController+Theme.m in Sources */,
+				8C19F42417B02C7A005BDB61 /* PopoverView.m in Sources */,
 				57C6E3FF175E06E800E8BC5F /* main.m in Sources */,
 				57C6E403175E06E800E8BC5F /* AppDelegate.m in Sources */,
 				57C6E42E175E076900E8BC5F /* Client.m in Sources */,
@@ -645,6 +733,8 @@
 				8C26E5D017A58703007DA4B7 /* HorizontalSlideCell.m in Sources */,
 				8C26E5D717A68154007DA4B7 /* stopWatch.m in Sources */,
 				8C0323AB17A943720037432E /* UIImageView+setImageAnimated.m in Sources */,
+				8C19F42F17B05089005BDB61 /* LibONavigationController.m in Sources */,
+				8C19F43617B10D49005BDB61 /* UIViewController+LibOStyling.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..7c56597
Binary files /dev/null and b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..bfffcfe
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
+	<true/>
+	<key>SnapshotAutomaticallyBeforeSignificantChanges</key>
+	<false/>
+</dict>
+</plist>
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
new file mode 100644
index 0000000..bbe3fd7
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   type = "1"
+   version = "1.0">
+   <FileBreakpoints>
+      <FileBreakpoint
+         shouldBeEnabled = "No"
+         ignoreCount = "0"
+         continueAfterRunningActions = "No"
+         filePath = "iosremote/Communication/CommunicationManager.m"
+         timestampString = "397412570.155324"
+         startingColumnNumber = "9223372036854775807"
+         endingColumnNumber = "9223372036854775807"
+         startingLineNumber = "77"
+         endingLineNumber = "77"
+         landmarkName = "-connectionStatusHandler:"
+         landmarkType = "5">
+      </FileBreakpoint>
+   </FileBreakpoints>
+</Bucket>
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme
new file mode 100644
index 0000000..5d04313
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "0460"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+               BuildableName = "Impress.app"
+               BlueprintName = "Impress"
+               ReferencedContainer = "container:iosremote.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      buildConfiguration = "Debug">
+      <Testables>
+      </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+            BuildableName = "Impress.app"
+            BlueprintName = "Impress"
+            ReferencedContainer = "container:iosremote.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </TestAction>
+   <LaunchAction
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Debug"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      allowLocationSimulation = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+            BuildableName = "Impress.app"
+            BlueprintName = "Impress"
+            ReferencedContainer = "container:iosremote.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+      <AdditionalOptions>
+      </AdditionalOptions>
+   </LaunchAction>
+   <ProfileAction
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      buildConfiguration = "Release"
+      debugDocumentVersioning = "YES">
+      <BuildableProductRunnable>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+            BuildableName = "Impress.app"
+            BlueprintName = "Impress"
+            ReferencedContainer = "container:iosremote.xcodeproj">
+         </BuildableReference>
+      </BuildableProductRunnable>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..74079c7
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>iosremote.xcscheme</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+	<key>SuppressBuildableAutocreation</key>
+	<dict>
+		<key>57C6E3EE175E06E800E8BC5F</key>
+		<dict>
+			<key>primary</key>
+			<true/>
+		</dict>
+	</dict>
+</dict>
+</plist>
diff --git a/ios/iosremote/iosremote/.DS_Store b/ios/iosremote/iosremote/.DS_Store
index df84524..8c01359 100644
Binary files a/ios/iosremote/iosremote/.DS_Store and b/ios/iosremote/iosremote/.DS_Store differ
diff --git a/ios/iosremote/iosremote/AppDelegate.m b/ios/iosremote/iosremote/AppDelegate.m
index d39331b..0475bb6 100644
--- a/ios/iosremote/iosremote/AppDelegate.m
+++ b/ios/iosremote/iosremote/AppDelegate.m
@@ -7,7 +7,7 @@
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 #import "AppDelegate.h"
-
+#import "UINavigationController+Theme.h"
 @implementation AppDelegate
 
 @synthesize window = _window;
@@ -38,14 +38,27 @@
 //        mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_autolayout" bundle:nil];
 //        NSLog(@"loading autolayout storyboard");
 //    } else {
-//        mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_autosize" bundle:nil];
+//      UIStoryboard * mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_autosize" bundle:nil];
 //        NSLog(@"Doesn't support autolayout, loading autosize");
 //    }
 //
 //    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 //    self.window.rootViewController = [mainStoryboard instantiateInitialViewController];
+//    [(UINavigationController *)self.window.rootViewController loadTheme];
 //    [self.window makeKeyAndVisible];
+    [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
+     setBackgroundImage:[UIImage imageNamed:@"navBarButtonNormal"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
     
+    NSDictionary *attributes = [NSDictionary dictionaryWithObjects:
+                                [NSArray arrayWithObjects: [UIFont boldSystemFontOfSize:15], [UIColor colorWithRed:1.0 green:0.231372549 blue:0.188235294 alpha:1.0], [UIColor clearColor], nil]
+                                                           forKeys: [NSArray arrayWithObjects:UITextAttributeFont, UITextAttributeTextColor, UITextAttributeTextShadowColor, nil]];
+    [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
+                                                forState:UIControlStateNormal];
+    attributes = [NSDictionary dictionaryWithObjects:

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list