summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiqi LIU <me@siqi.fr>2013-09-21 12:36:55 +0200
committerSiqi LIU <me@siqi.fr>2013-09-21 16:16:23 +0200
commitcd4333272dcdc76dcdb5e810c7b628d97cabcf91 (patch)
tree8280bdcc96e8ab3f0a85b91f53c2560687cf52b2
parent6f24eafb7a97c017486a24e5120d386eed6dfc8e (diff)
fix iOS7 storyboard issues&popover position
Change-Id: I6a3e03956b3616d2d43396843d852c5591423c9d
-rwxr-xr-xios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m2
-rwxr-xr-xios/iosremote/PopoverView/PopoverView.h208
-rwxr-xr-xios/iosremote/PopoverView/PopoverView.m1055
-rwxr-xr-xios/iosremote/PopoverView/PopoverViewCompatibility.h29
-rwxr-xr-xios/iosremote/PopoverView/PopoverView_Configuration.h128
-rwxr-xr-xios/iosremote/SWRevealViewController/SWRevealViewController.h180
-rwxr-xr-xios/iosremote/SWRevealViewController/SWRevealViewController.m1255
-rw-r--r--ios/iosremote/en.lproj/iPad_autosize.storyboard159
-rw-r--r--ios/iosremote/en.lproj/iPad_autosize_old.storyboard177
-rw-r--r--ios/iosremote/fr.lproj/iPad_autosize.storyboard161
-rw-r--r--ios/iosremote/fr.lproj/iPad_autosize_old.storyboard165
-rw-r--r--ios/iosremote/iosremote.xcodeproj/project.pbxproj14
-rw-r--r--ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.h14
-rw-r--r--ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.m43
-rw-r--r--ios/iosremote/iosremote/Categories/NSString+Base64.h16
-rw-r--r--ios/iosremote/iosremote/Categories/NSString+Base64.m23
-rw-r--r--ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.h15
-rw-r--r--ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.m47
-rw-r--r--ios/iosremote/iosremote/Categories/UIImage+Resize.m186
-rw-r--r--ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.h16
-rw-r--r--ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.m30
-rw-r--r--ios/iosremote/iosremote/Categories/UINavigationController+Theme.h13
-rw-r--r--ios/iosremote/iosremote/Categories/UINavigationController+Theme.m22
-rw-r--r--ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.h13
-rw-r--r--ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.m33
-rw-r--r--ios/iosremote/iosremote/Categories/UIView+Shadowing.h16
-rw-r--r--ios/iosremote/iosremote/Categories/UIView+Shadowing.m34
-rw-r--r--ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.h28
-rw-r--r--ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.m72
-rw-r--r--ios/iosremote/iosremote/Classes/AboutViewController.h15
-rw-r--r--ios/iosremote/iosremote/Classes/AboutViewController.m48
-rw-r--r--ios/iosremote/iosremote/Classes/AppDelegate.h21
-rw-r--r--ios/iosremote/iosremote/Classes/AppDelegate.m107
-rw-r--r--ios/iosremote/iosremote/Classes/AppDelegate~ipad.h16
-rw-r--r--ios/iosremote/iosremote/Classes/AppDelegate~ipad.m16
-rw-r--r--ios/iosremote/iosremote/Classes/BasePresentationViewController.h58
-rw-r--r--ios/iosremote/iosremote/Classes/BasePresentationViewController.m582
-rw-r--r--ios/iosremote/iosremote/Classes/ControlVariables.h53
-rw-r--r--ios/iosremote/iosremote/Classes/EditableTableViewCell.h14
-rw-r--r--ios/iosremote/iosremote/Classes/EditableTableViewCell.m55
-rw-r--r--ios/iosremote/iosremote/Classes/HorizontalSlideCell.h16
-rw-r--r--ios/iosremote/iosremote/Classes/HorizontalSlideCell.m64
-rw-r--r--ios/iosremote/iosremote/Classes/LibONavigationController.h13
-rw-r--r--ios/iosremote/iosremote/Classes/LibONavigationController.m44
-rw-r--r--ios/iosremote/iosremote/Classes/MainSplitViewController.h17
-rw-r--r--ios/iosremote/iosremote/Classes/MainSplitViewController.m79
-rw-r--r--ios/iosremote/iosremote/Classes/NewServerViewController.h42
-rw-r--r--ios/iosremote/iosremote/Classes/NewServerViewController.m253
-rw-r--r--ios/iosremote/iosremote/Classes/PinValidationViewController.h16
-rw-r--r--ios/iosremote/iosremote/Classes/PinValidationViewController.m77
-rw-r--r--ios/iosremote/iosremote/Classes/SWReavealMainController.h13
-rw-r--r--ios/iosremote/iosremote/Classes/SWReavealMainController.m38
-rw-r--r--ios/iosremote/iosremote/Classes/ServerListViewController.h20
-rw-r--r--ios/iosremote/iosremote/Classes/ServerListViewController.m542
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.h30
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.m107
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.h21
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.m86
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.h14
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.m58
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.h13
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.m155
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.h18
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.m307
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowViewController.h22
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowViewController.m82
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.h30
-rw-r--r--ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.m311
-rw-r--r--ios/iosremote/iosremote/Classes/StopWatch.h38
-rw-r--r--ios/iosremote/iosremote/Classes/StopWatch.m175
-rw-r--r--ios/iosremote/iosremote/Classes/Timer.h46
-rw-r--r--ios/iosremote/iosremote/Classes/Timer.m230
-rw-r--r--ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.h15
-rw-r--r--ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.m109
-rw-r--r--ios/iosremote/iosremote/Classes/WalkThroughPageViewController.h22
-rw-r--r--ios/iosremote/iosremote/Classes/WalkThroughPageViewController.m87
-rw-r--r--ios/iosremote/iosremote/Classes/slideShow_vc.m146
-rw-r--r--ios/iosremote/iosremote/Ressources/WTConnectionHotspot.pngbin0 -> 33674 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/WTPairing.pngbin0 -> 71206 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/WTPairingScreenshot.pngbin0 -> 81702 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/WTconnecting.pngbin0 -> 41955 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/WTconnection.pngbin0 -> 24521 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/WTcontrol~ipad.pngbin0 -> 146037 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/WTcontrol~iphone.pngbin0 -> 253574 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/add.pngbin0 -> 2990 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/add@2x.pngbin0 -> 2912 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/backButton.pngbin0 -> 3118 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/backButton@2x.pngbin0 -> 3574 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/buttonBackground.pngbin0 -> 2975 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/buttonBackground@2x.pngbin0 -> 3199 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/forwardButton.pngbin0 -> 3091 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/forwardButton@2x.pngbin0 -> 3439 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/gear_transparent_bg.pngbin0 -> 3337 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/gear_transparent_bg@2x.pngbin0 -> 3866 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/impress.jpegbin0 -> 7476 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/iosremote_ipad_icon.pngbin0 -> 6105 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/iosremote_ipad_icon@2x.pngbin0 -> 6857 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/iosremote_iphone_icon.pngbin0 -> 5552 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/iosremote_iphone_icon@2x.pngbin0 -> 8878 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/more_icon.pngbin0 -> 3103 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/more_icon@2x.pngbin0 -> 3135 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/more_ipad.pngbin0 -> 3251 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/more_ipad@2x.pngbin0 -> 3705 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/navBarBackground.pngbin0 -> 2933 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/navBarBackground@2x.pngbin0 -> 3488 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/navBarButtonNormal@2x.pngbin0 -> 2843 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/nextButton_normal.pngbin0 -> 3600 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/nextButton_normal@2x.pngbin0 -> 4704 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/nextButton_pressed.pngbin0 -> 3487 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/nextButton_pressed@2x.pngbin0 -> 4454 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/pointer.pngbin0 -> 4866 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/pointer_pushed.pngbin0 -> 4859 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/previousButton_normal.pngbin0 -> 3592 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/previousButton_normal@2x.pngbin0 -> 4655 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/previousButton_pressed.pngbin0 -> 3482 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/previousButton_pressed@2x.pngbin0 -> 4454 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/pushed_next_button.pngbin0 -> 6574 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/pushed_previous_button.pngbin0 -> 6687 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/released_next_button.pngbin0 -> 6592 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/released_previous_button.pngbin0 -> 6705 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/slide_finished.pngbin0 -> 11049 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_clear_btn.pngbin0 -> 3521 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_clear_btn@2x.pngbin0 -> 4442 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_clear_btn_dark.pngbin0 -> 3502 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_pause_btn.pngbin0 -> 2884 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_pause_btn@2x.pngbin0 -> 3002 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_pause_btn_dark.pngbin0 -> 2894 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_pause_btn_dark@2x.pngbin0 -> 3018 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_settime_btn.pngbin0 -> 3897 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_settime_btn@2x.pngbin0 -> 5148 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_settime_btn_dark.pngbin0 -> 4066 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_settime_btn_dark@2x.pngbin0 -> 5310 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_start_btn.pngbin0 -> 3139 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_start_btn@2x.pngbin0 -> 3728 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_start_btn_dark.pngbin0 -> 3191 bytes
-rw-r--r--ios/iosremote/iosremote/Ressources/timer_start_btn_dark@2x.pngbin0 -> 3750 bytes
-rw-r--r--ios/iosremote/iosremote/Views/WalkThroughPageViewController.xib470
-rw-r--r--ios/iosremote/iosremote/Views/WalkThroughPageViewMainImageController.xib401
-rw-r--r--ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard132
-rw-r--r--ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard132
-rw-r--r--ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard130
-rw-r--r--ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard130
-rw-r--r--ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard130
-rw-r--r--ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize_old.storyboard130
-rw-r--r--ios/iosremote/zh-Hans.lproj/iPad_autosize.storyboard161
-rw-r--r--ios/iosremote/zh-Hans.lproj/iPad_autosize_old.storyboard165
146 files changed, 9193 insertions, 1283 deletions
diff --git a/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m
index 7ae7af0ae8fc..52afa8891a22 100755
--- a/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m
+++ b/ios/iosremote/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m
@@ -358,7 +358,7 @@ CGRect IASKCGRectSwap(CGRect rect);
if ((title = [self tableView:tableView titleForHeaderInSection:section])) {
CGSize size = [title sizeWithFont:[UIFont boldSystemFontOfSize:[UIFont labelFontSize]]
constrainedToSize:CGSizeMake(tableView.frame.size.width - 2*kIASKHorizontalPaddingGroupTitles, INFINITY)
- lineBreakMode:UILineBreakModeWordWrap];
+ lineBreakMode:NSLineBreakByWordWrapping];
return size.height+kIASKVerticalPaddingGroupTitles;
}
return 0;
diff --git a/ios/iosremote/PopoverView/PopoverView.h b/ios/iosremote/PopoverView/PopoverView.h
new file mode 100755
index 000000000000..6766ab1fbccd
--- /dev/null
+++ b/ios/iosremote/PopoverView/PopoverView.h
@@ -0,0 +1,208 @@
+//
+// PopoverView
+// https://github.com/runway20/PopoverView
+//
+//(MIT Licensed)
+//
+//Copyright (c) 2012 Runway 20 Inc.
+//
+//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+//
+//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#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
+
+/******************************************************************/
+
+
+@class PopoverView;
+
+@protocol PopoverViewDelegate <NSObject>
+
+@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;
+
+@end
+
+@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;
+}
+
+@property (nonatomic, STRONG) UIView *titleView;
+
+@property (nonatomic, STRONG) UIView *contentView;
+
+@property (nonatomic, STRONG) NSArray *subviewsArray;
+
+@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;
+
+@end
diff --git a/ios/iosremote/PopoverView/PopoverView.m b/ios/iosremote/PopoverView/PopoverView.m
new file mode 100755
index 000000000000..4f810cf72df8
--- /dev/null
+++ b/ios/iosremote/PopoverView/PopoverView.m
@@ -0,0 +1,1055 @@
+//
+// PopoverView
+// https://github.com/runway20/PopoverView
+//
+//(MIT Licensed)
+//
+//Copyright (c) 2012 Runway 20 Inc.
+//
+//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+//
+//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#import "PopoverView.h"
+#import "PopoverView_Configuration.h"
+#import <QuartzCore/QuartzCore.h>
+
+#pragma mark - Implementation
+
+@implementation PopoverView
+
+@synthesize subviewsArray;
+@synthesize contentView;
+@synthesize titleView;
+@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 = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kSmallTextFontPad : kTextFontPhone;
+
+ 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 = kTextAlignmentLeft;
+ 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 = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kTextFontPad : kTextFontPhone;
+
+ 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: UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kTitleFontPad : kTitleFontPhone];
+ UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.f, 0.f, titleSize.width, titleSize.height)];
+ titleLabel.backgroundColor = [UIColor clearColor];
+ titleLabel.font = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kTitleFontPad : kTitleFontPhone;
+ 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 = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kTextFontPad : kTextFontPhone;
+
+ 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 = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kTextFontPad : kTextFontPhone;
+
+ 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 = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? kTextFontPad : kTextFontPhone;
+
+ 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];
+ }
+
+}
+
+@end
diff --git a/ios/iosremote/PopoverView/PopoverViewCompatibility.h b/ios/iosremote/PopoverView/PopoverViewCompatibility.h
new file mode 100755
index 000000000000..b53d9f94f481
--- /dev/null
+++ b/ios/iosremote/PopoverView/PopoverViewCompatibility.h
@@ -0,0 +1,29 @@
+//
+// PopoverView
+// https://github.com/runway20/PopoverView
+//
+//(MIT Licensed)
+//
+//Copyright (c) 2012 Runway 20 Inc.
+//
+//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+//
+//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#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/PopoverView_Configuration.h b/ios/iosremote/PopoverView/PopoverView_Configuration.h
new file mode 100755
index 000000000000..7b43683e6a42
--- /dev/null
+++ b/ios/iosremote/PopoverView/PopoverView_Configuration.h
@@ -0,0 +1,128 @@
+//
+// PopoverView
+// https://github.com/runway20/PopoverView
+//
+//(MIT Licensed)
+//
+//Copyright (c) 2012 Runway 20 Inc.
+//
+//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+//
+//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+//
+//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#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 YES
+
+//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 kTextFontPhone [UIFont fontWithName:@"HelveticaNeue" size:16.f]
+
+//normal text font
+#define kTextFontPad [UIFont fontWithName:@"HelveticaNeue" size:20.f]
+
+#define kSmallTextFontPad [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
+
+//normal text alignment
+#define kTextAlignmentLeft UITextAlignmentLeft
+
+//title font
+#define kTitleFontPhone [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.f]
+
+#define kTitleFontPad [UIFont fontWithName:@"HelveticaNeue-Bold" size:22.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/SWRevealViewController/SWRevealViewController.h b/ios/iosremote/SWRevealViewController/SWRevealViewController.h
new file mode 100755
index 000000000000..1610fef5d497
--- /dev/null
+++ b/ios/iosremote/SWRevealViewController/SWRevealViewController.h
@@ -0,0 +1,180 @@
+/*
+
+ Copyright (c) 2013 Joan Lluch <joan.lluch@sweetwilliamsl.com>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is furnished
+ to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+ Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)
+
+*/
+
+
+#import <UIKit/UIKit.h>
+#import "stopWatch.h"
+#import "Timer.h"
+
+@class SWRevealViewController;
+@protocol SWRevealViewControllerDelegate;
+
+#pragma mark - SWRevealViewController Class
+
+// Enum values for setFrontViewPosition:animated:
+typedef enum
+{
+ FrontViewPositionLeftSideMostRemoved,
+ FrontViewPositionLeftSideMost,
+ FrontViewPositionLeftSide,
+
+ // Left position, rear view is hidden behind front controller
+ FrontViewPositionLeft,
+
+ // Right possition, front view is presented right-offseted by rearViewRevealWidth
+ FrontViewPositionRight,
+
+ // Right most possition, front view is presented right-offseted by rearViewRevealWidth+rearViewRevealOverdraw
+ FrontViewPositionRightMost,
+
+ // Front controller is removed from view. Animated transitioning from this state will cause the same
+ // effect than animating from FrontViewPositionRightMost. Use this instead of FrontViewPositionRightMost when
+ // you intent to remove the front controller view to be removed from the view hierarchy.
+ FrontViewPositionRightMostRemoved,
+
+} FrontViewPosition;
+
+
+@interface SWRevealViewController : UIViewController <StopWatchDelegate, TimerDelegate>
+
+- (void)startTimePickerwithTimer:(Timer *) timer;
+
+// Object instance init and rear view setting
+- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController;
+
+// Rear view controller, can be nil if not used
+@property (strong, nonatomic) UIViewController *rearViewController;
+
+// Optional right view controller, can be nil if not used
+@property (strong, nonatomic) UIViewController *rightViewController;
+
+// Front view controller, can be nil on initialization but must be supplied by the time its view is loaded
+@property (strong, nonatomic) UIViewController *frontViewController;
+
+// Sets the frontViewController using a default set of chained animations consisting on moving the
+// presented frontViewController to the top most right, replacing it, and moving it back to the left position
+- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
+
+// Front view position, use this to set a particular position state on the controller
+// On initialization it is set to FrontViewPositionLeft
+@property (assign, nonatomic) FrontViewPosition frontViewPosition;
+
+// Chained animation of the frontViewController position. You can call it several times in a row to achieve
+// any set of animations you wish. Animations will be chained and performed one after the other.
+- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated;
+
+// Toogles the current state of the front controller between Left or Right and fully visible
+// Use setFrontViewPosition to set a particular position
+- (void)revealToggleAnimated:(BOOL)animated;
+- (void)rightRevealToggleAnimated:(BOOL)animated;
+
+// The following methods are meant to be directly connected to the action method of a button
+// to perform user triggered postion change of the controller views. This is ussually added to a
+// button on top left or right of the frontViewController
+- (void)revealToggle:(id)sender;
+- (void)rightRevealToggle:(id)sender;
+
+// The following method will provide a panGestureRecognizer suitable to be added to any view on the frontController
+// in order to perform usual drag and swipe gestures on the frontViewController to reveal the rear views. This
+// is usually added on the top bar of a front controller.
+- (UIPanGestureRecognizer*)panGestureRecognizer;
+
+// The following properties are provided for further customization, they are set to default values on initialization,
+// you should not generally have to set them
+
+// Defines how much of the rear view is shown, default is 260.
+@property (assign, nonatomic) CGFloat rearViewRevealWidth;
+@property (assign, nonatomic) CGFloat rightViewRevealWidth;
+
+// Defines how much of an overdraw can occur when dragging further than 'rearViewRevealWidth', default is 60.
+@property (assign, nonatomic) CGFloat rearViewRevealOverdraw;
+@property (assign, nonatomic) CGFloat rightViewRevealOverdraw;
+
+// If YES (the default) the controller will bounce to the Left position when dragging further than 'rearViewRevealWidth'
+@property (assign, nonatomic) BOOL bounceBackOnOverdraw;
+@property (assign, nonatomic) BOOL bounceBackOnLeftOverdraw;
+
+// If YES (default is NO) the controller will allow permanent dragging up to the rightMostPosition
+@property (assign, nonatomic) BOOL stableDragOnOverdraw;
+@property (assign, nonatomic) BOOL stableDragOnLeftOverdraw;
+
+// Velocity required for the controller to toggle its state based on a swipe movement, default is 300
+@property (assign, nonatomic) CGFloat quickFlickVelocity;
+
+// Default duration for the revealToggle animation, default is 0.25
+@property (assign, nonatomic) NSTimeInterval toggleAnimationDuration;
+
+// Defines the radius of the front view's shadow, default is 2.5f
+@property (assign, nonatomic) CGFloat frontViewShadowRadius;
+
+// Defines the radius of the front view's shadow offset default is {0.0f,2.5f}
+@property (assign, nonatomic) CGSize frontViewShadowOffset;
+
+// The class properly handles all the relevant calls to appearance methods on the contained controllers.
+// Moreover you can assign a delegate to let the class inform you on positions and animation activity.
+
+// Delegate
+@property (weak, nonatomic) id<SWRevealViewControllerDelegate> delegate;
+
+@end
+
+#pragma mark - SWRevealViewControllerDelegate Protocol
+
+@protocol SWRevealViewControllerDelegate<NSObject>
+
+@optional
+
+- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position;
+- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position;
+
+- (void)revealController:(SWRevealViewController *)revealController animateToPosition:(FrontViewPosition)position;
+
+- (void)revealControllerPanGestureBegan:(SWRevealViewController *)revealController;
+- (void)revealControllerPanGestureEnded:(SWRevealViewController *)revealController;
+
+@end
+
+
+#pragma mark - UIViewController(SWRevealViewController) Category
+
+// We add a category of UIViewController to let childViewControllers easily access their parent SWRevealViewController
+@interface UIViewController(SWRevealViewController)
+
+- (SWRevealViewController*)revealViewController;
+
+@end
+
+
+// This will allow the class to be defined on a storyboard
+#pragma mark - SWRevealViewControllerSegue
+
+@interface SWRevealViewControllerSegue : UIStoryboardSegue
+
+@property (strong) void(^performBlock)( SWRevealViewControllerSegue* segue, UIViewController* svc, UIViewController* dvc );
+
+@end
+
+
diff --git a/ios/iosremote/SWRevealViewController/SWRevealViewController.m b/ios/iosremote/SWRevealViewController/SWRevealViewController.m
new file mode 100755
index 000000000000..feab034b3cee
--- /dev/null
+++ b/ios/iosremote/SWRevealViewController/SWRevealViewController.m
@@ -0,0 +1,1255 @@
+/*
+
+ Copyright (c) 2013 Joan Lluch <joan.lluch@sweetwilliamsl.com>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is furnished
+ to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+ Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org)
+
+*/
+
+#import <QuartzCore/QuartzCore.h>
+#import <UIKit/UIGestureRecognizerSubclass.h>
+
+#import "SWRevealViewController.h"
+#import "SlideShowSwipeInList~iphone.h"
+#import "UIViewController+LibOStyling.h"
+
+#pragma mark - SWDirectionPanGestureRecognizer
+
+typedef enum
+{
+ SWDirectionPanGestureRecognizerVertical,
+ SWDirectionPanGestureRecognizerHorizontal
+
+} SWDirectionPanGestureRecognizerDirection;
+
+@interface SWDirectionPanGestureRecognizer : UIPanGestureRecognizer
+
+@property (nonatomic, assign) SWDirectionPanGestureRecognizerDirection direction;
+
+@end
+
+
+@implementation SWDirectionPanGestureRecognizer
+{
+ BOOL _dragging;
+ BOOL _disabled;
+ CGPoint _init;
+}
+
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [super touchesBegan:touches withEvent:event];
+
+ UITouch *touch = [touches anyObject];
+ if ([touch locationInView:self.view].x > 60.0) {
+ _disabled = YES;
+ return;
+ }
+ _disabled = NO;
+ _init = [touch locationInView:self.view];
+ _dragging = NO;
+}
+
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ if (_disabled) {
+ return;
+ }
+ [super touchesMoved:touches withEvent:event];
+
+ if (self.state == UIGestureRecognizerStateFailed)
+ return;
+
+ if ( _dragging )
+ return;
+
+ const int kDirectionPanThreshold = 5;
+
+ UITouch *touch = [touches anyObject];
+ CGPoint nowPoint = [touch locationInView:self.view];
+
+ CGFloat moveX = nowPoint.x - _init.x;
+ CGFloat moveY = nowPoint.y - _init.y;
+
+ if (abs(moveX) > kDirectionPanThreshold)
+ {
+ if (_direction == SWDirectionPanGestureRecognizerHorizontal)
+ _dragging = YES;
+ else
+ self.state = UIGestureRecognizerStateFailed;
+ }
+ else if (abs(moveY) > kDirectionPanThreshold)
+ {
+ if (_direction == SWDirectionPanGestureRecognizerVertical)
+ _dragging = YES ;
+ else
+ self.state = UIGestureRecognizerStateFailed;
+ }
+}
+
+@end
+
+
+#pragma mark - SWRevealView Class
+
+@interface SWRevealView: UIView
+{
+ __weak SWRevealViewController *_c;
+}
+
+@property (nonatomic, readonly) UIView *rearView;
+@property (nonatomic, readonly) UIView *rightView;
+@property (nonatomic, readonly) UIView *frontView;
+@property (nonatomic, assign) BOOL disableLayout;
+
+@end
+
+
+@interface SWRevealViewController()
+- (void)_getRevealWidth:(CGFloat*)pRevealWidth revealOverDraw:(CGFloat*)pRevealOverdraw forSymetry:(int)symetry;
+- (void)_getBounceBack:(BOOL*)pBounceBack pStableDrag:(BOOL*)pStableDrag forSymetry:(int)symetry;
+- (void)_getAdjustedFrontViewPosition:(FrontViewPosition*)frontViewPosition forSymetry:(int)symetry;
+@end
+
+
+@implementation SWRevealView
+
+- (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller
+{
+ self = [super initWithFrame:frame];
+ if ( self )
+ {
+ _c = controller;
+ CGRect bounds = self.bounds;
+
+ _frontView = [[UIView alloc] initWithFrame:bounds];
+ _frontView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
+
+ [self addSubview:_frontView];
+
+ CALayer *frontViewLayer = _frontView.layer;
+ frontViewLayer.masksToBounds = NO;
+ frontViewLayer.shadowColor = [UIColor blackColor].CGColor;
+ frontViewLayer.shadowOpacity = 1.0f;
+ frontViewLayer.shadowOffset = _c.frontViewShadowOffset;
+ frontViewLayer.shadowRadius = _c.frontViewShadowRadius;
+ }
+
+ return self;
+}
+
+
+- (void)layoutSubviews
+{
+ if ( _disableLayout ) return;
+
+ [self _layoutRearViews];
+
+ CGRect bounds = self.bounds;
+
+ CGFloat xPosition = [self frontLocationForPosition:_c.frontViewPosition];
+ _frontView.frame = CGRectMake(xPosition, 0.0f, bounds.size.width, bounds.size.height);
+
+ UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:_frontView.bounds];
+ _frontView.layer.shadowPath = shadowPath.CGPath;
+}
+
+
+- (void)prepareRearViewForPosition:(FrontViewPosition)newPosition
+{
+ if ( _rearView == nil )
+ {
+ _rearView = [[UIView alloc] initWithFrame:self.bounds];
+ _rearView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
+ [self insertSubview:_rearView belowSubview:_frontView];
+ }
+ [self _layoutRearViews];
+ [self _prepareForNewPosition:newPosition];
+}
+
+
+- (CGFloat)frontLocationForPosition:(FrontViewPosition)frontViewPosition
+{
+ CGFloat revealWidth;
+ CGFloat revealOverdraw;
+
+ CGFloat location = 0.0f;
+
+ int symetry = frontViewPosition<FrontViewPositionLeft? -1 : 1;
+ [_c _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry];
+ [_c _getAdjustedFrontViewPosition:&frontViewPosition forSymetry:symetry];
+
+ if ( frontViewPosition == FrontViewPositionRight )
+ location = revealWidth;
+
+ else if ( frontViewPosition > FrontViewPositionRight )
+ location = revealWidth + revealOverdraw;
+
+ return location*symetry;
+}
+
+
+- (void)dragFrontViewToXPosition:(CGFloat)xPosition
+{
+ CGRect bounds = self.bounds;
+ xPosition = [self _adjustedDragLocationForLocation:xPosition];
+ _frontView.frame = CGRectMake(xPosition, 0.0f, bounds.size.width, bounds.size.height);
+}
+
+
+- (void)prepareRightViewForPosition:(FrontViewPosition)newPosition
+{
+ if ( _rightView == nil )
+ {
+ _rightView = [[UIView alloc] initWithFrame:self.bounds];
+ _rightView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
+ [self insertSubview:_rightView belowSubview:_frontView];
+ }
+ [self _layoutRearViews];
+ [self _prepareForNewPosition:newPosition];
+}
+
+
+# pragma mark private
+
+- (void)_layoutRearViews
+{
+ CGRect bounds = self.bounds;
+
+ CGFloat rearWidth = _c.rearViewRevealWidth + _c.rearViewRevealOverdraw;
+ _rearView.frame = CGRectMake(0.0, 0.0, rearWidth, bounds.size.height);
+
+ CGFloat rightWidth = _c.rightViewRevealWidth + _c.rightViewRevealOverdraw;
+ _rightView.frame = CGRectMake(bounds.size.width-rightWidth, 0.0f, rightWidth, bounds.size.height);
+}
+
+
+- (void)_prepareForNewPosition:(FrontViewPosition)newPosition;
+{
+ if ( _rearView == nil || _rightView == nil )
+ return;
+
+ int symetry = newPosition<FrontViewPositionLeft? -1 : 1;
+
+ NSArray *subViews = self.subviews;
+ NSInteger rearIndex = [subViews indexOfObjectIdenticalTo:_rearView];
+ NSInteger rightIndex = [subViews indexOfObjectIdenticalTo:_rightView];
+
+ if ( (symetry < 0 && rightIndex < rearIndex) || (symetry > 0 && rearIndex < rightIndex) )
+ [self exchangeSubviewAtIndex:rightIndex withSubviewAtIndex:rearIndex];
+}
+
+
+- (CGFloat)_adjustedDragLocationForLocation:(CGFloat)x
+{
+ CGFloat result;
+
+ CGFloat revealWidth;
+ CGFloat revealOverdraw;
+ BOOL bounceBack;
+ BOOL stableDrag;
+ FrontViewPosition position = _c.frontViewPosition;
+
+ int symetry = x<0 ? -1 : 1;
+
+ [_c _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry];
+ [_c _getBounceBack:&bounceBack pStableDrag:&stableDrag forSymetry:symetry];
+
+ BOOL stableTrack = !bounceBack || stableDrag || position==FrontViewPositionRightMost || position==FrontViewPositionLeftSideMost;
+ if ( stableTrack )
+ {
+ revealWidth += revealOverdraw;
+ revealOverdraw = 0.0f;
+ }
+
+ x = x * symetry;
+
+ if (x <= revealWidth)
+ result = x; // Translate linearly.
+
+ else if (x <= revealWidth+2*revealOverdraw)
+ result = revealWidth + (x-revealWidth)/2; // slow down translation by halph the movement.
+
+ else
+ result = revealWidth+revealOverdraw; // keep at the rightMost location.
+
+ return result * symetry;
+}
+
+@end
+
+
+#pragma mark - SWRevealViewController Class
+
+@interface SWRevealViewController()<UIGestureRecognizerDelegate>
+{
+ SWRevealView *_contentView;
+ UIPanGestureRecognizer *_panGestureRecognizer;
+ FrontViewPosition _frontViewPosition;
+ FrontViewPosition _rearViewPosition;
+ FrontViewPosition _rightViewPosition;
+}
+@end
+
+
+@implementation SWRevealViewController
+{
+ FrontViewPosition _panInitialFrontPosition;
+ NSMutableArray *_animationQueue;
+ BOOL _userInteractionStore;
+}
+
+const int FrontViewPositionNone = 0xff;
+
+
+#pragma mark - Init
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ self = [super initWithCoder:aDecoder];
+ if ( self )
+ {
+ [self _initDefaultProperties];
+ }
+ return self;
+}
+
+
+- (id)init
+{
+ return [self initWithRearViewController:nil frontViewController:nil];
+}
+
+
+- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController;
+{
+ self = [super init];
+ if ( self )
+ {
+ [self _initDefaultProperties];
+ [self _setRearViewController:rearViewController];
+ [self _setFrontViewController:frontViewController];
+ }
+ return self;
+}
+
+
+- (void)_initDefaultProperties
+{
+ _frontViewPosition = FrontViewPositionLeft;
+ _rearViewPosition = FrontViewPositionLeft;
+ _rightViewPosition = FrontViewPositionLeft;
+ _rearViewRevealWidth = 220.0f;
+ _rearViewRevealOverdraw = 60.0f;
+ _rightViewRevealWidth = 260.0f;
+ _rightViewRevealOverdraw = 60.0f;
+ _bounceBackOnOverdraw = YES;
+ _bounceBackOnLeftOverdraw = YES;
+ _stableDragOnOverdraw = NO;
+ _stableDragOnLeftOverdraw = NO;
+ _quickFlickVelocity = 250.0f;
+ _toggleAnimationDuration = 0.25;
+ _frontViewShadowRadius = 2.5f;
+ _frontViewShadowOffset = CGSizeMake(0.0f, 2.5f);
+ _userInteractionStore = YES;
+ _animationQueue = [NSMutableArray array];
+}
+
+#pragma mark popup timer
+- (void)changeDate:(UIDatePicker *)sender {
+ NSLog(@"Time left: %f", sender.countDownDuration);
+ [[(SlideShowSwipeInList_iphone *) self.rearViewController timer] setSecondsLeft: sender.countDownDuration];
+}
+
+- (void)removeViews:(id)object {
+ [[self.view viewWithTag:89] removeFromSuperview];
+ [[self.view viewWithTag:90] removeFromSuperview];
+ [[self.view viewWithTag:91] removeFromSuperview];
+}
+
+- (void)dismissDatePicker:(id)sender {
+ CGRect toolbarTargetFrame = CGRectMake(0, self.view.bounds.size.height, 320, 44);
+ CGRect datePickerTargetFrame = CGRectMake(0, self.view.bounds.size.height+44, 320, 216);
+ [UIView beginAnimations:@"MoveOut" context:nil];
+ [self.view viewWithTag:89].alpha = 0;
+ [self.view viewWithTag:90].frame = datePickerTargetFrame;
+ [self.view viewWithTag:91].frame = toolbarTargetFrame;
+ [UIView setAnimationDelegate:self];
+ [UIView setAnimationDidStopSelector:@selector(removeViews:)];
+ [UIView commitAnimations];
+}
+
+- (IBAction)callDP:(id)sender {
+ if ([self.view viewWithTag:89]) {
+ return;
+ }
+ CGRect toolbarTargetFrame = CGRectMake(0, self.view.bounds.size.height-216-44, 320, 44);
+ CGRect datePickerTargetFrame = CGRectMake(0, self.view.bounds.size.height-216, 320, 216);
+
+ UIView *darkView = [[UIView alloc] initWithFrame:self.view.bounds];
+ darkView.alpha = 0;
+ darkView.backgroundColor = [UIColor blackColor];
+ darkView.tag = 89;
+ UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissDatePicker:)];
+ [darkView addGestureRecognizer:tapGesture];
+ [self.view addSubview:darkView];
+
+ UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height+44, 320, 216)];
+ datePicker.tag = 90;
+ [datePicker setDatePickerMode:UIDatePickerModeCountDownTimer];
+ [datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged];
+ [self.view addSubview:datePicker];
+
+ UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height, 320, 44)];
+ toolBar.tag = 91;
+ toolBar.barStyle = UIBarStyleBlackTranslucent;
+ UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
+ UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissDatePicker:)];
+ [toolBar setItems:[NSArray arrayWithObjects:spacer, doneButton, nil]];
+ [self.view addSubview:toolBar];
+
+ [UIView beginAnimations:@"MoveIn" context:nil];
+ toolBar.frame = toolbarTargetFrame;
+ datePicker.frame = datePickerTargetFrame;
+ darkView.alpha = 0.5;
+ [UIView commitAnimations];
+}
+
+- (void)startTimePickerwithTimer:(Timer *) timer
+{
+ [self callDP:self];
+}
+
+
+#pragma mark storyboard support
+
+static NSString * const SWSegueRearIdentifier = @"sw_rear";
+static NSString * const SWSegueFrontIdentifier = @"sw_front";
+static NSString * const SWSegueRightIdentifier = @"sw_right";
+
+- (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender
+{
+ // $ using a custom segue we can get access to the storyboard-loaded rear/front view controllers
+ // the trick is to define segues of type SWRevealViewControllerSegue on the storyboard
+ // connecting the SWRevealViewController to the desired front/rear controllers,
+ // and setting the identifiers to "sw_rear" and "sw_front"
+
+ // $ these segues are invoked manually in the loadView method if a storyboard
+ // was used to instantiate the SWRevealViewController
+
+ // $ none of this would be necessary if Apple exposed "relationship" segues for container view controllers.
+
+ NSString *identifier = segue.identifier;
+ if ( [segue isKindOfClass:[SWRevealViewControllerSegue class]] && sender == nil )
+ {
+ if ( [identifier isEqualToString:SWSegueRearIdentifier] )
+ {
+ segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)
+ {
+ [self _setRearViewController:dvc];
+ };
+ }
+ else if ( [identifier isEqualToString:SWSegueFrontIdentifier] )
+ {
+ segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)
+ {
+ [self _setFrontViewController:dvc];
+ };
+ }
+ else if ( [identifier isEqualToString:SWSegueRightIdentifier] )
+ {
+ segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc)
+ {
+ [self _setRightViewController:dvc];
+ };
+ }
+ }
+}
+
+
+#pragma mark - View lifecycle
+
+- (void)loadView
+{
+ // Do not call super, to prevent the apis from unfruitful looking for inexistent xibs!
+
+ // This is what Apple tells us to set as the initial frame, which is of course totally irrelevant
+ // with the modern view controller containment patterns, let's leave it for the sake of it!
+ CGRect frame = [[UIScreen mainScreen] applicationFrame];
+
+ // create a custom content view for the controller
+ _contentView = [[SWRevealView alloc] initWithFrame:frame controller:self];
+
+ // set the content view to resize along with its superview
+ [_contentView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
+
+ // set our contentView to the controllers view
+ self.view = _contentView;
+
+ // load any defined front/rear controllers from the storyboard
+ if ( self.storyboard && _rearViewController == nil )
+ {
+ @try
+ {
+ [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil];
+ [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil];
+ [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil];
+ }
+ @catch(NSException *exception)
+ {
+ //NSLog(@"Caught %@: %@", [exception name], [exception reason]);
+ }
+ }
+
+ // Apple also tells us to do this:
+ _contentView.backgroundColor = [UIColor blackColor];
+
+ // we set the current frontViewPosition to none before seting the
+ // desired initial position, this will force proper controller reload
+ FrontViewPosition initialPosition = _frontViewPosition;
+ _frontViewPosition = FrontViewPositionNone;
+ _rearViewPosition = FrontViewPositionNone;
+ _rightViewPosition = FrontViewPositionNone;
+
+ // now set the desired initial position
+ [self _setFrontViewPosition:initialPosition withDuration:0.0];
+}
+
+
+- (void)viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+
+ // Uncomment the following code if you want the child controllers
+ // to be loaded at this point.
+ //
+ // We leave this commented out because we think loading childs here is conceptually wrong.
+ // Instead, we refrain view loads until necesary, for example we may never load
+ // the rear controller view -or the front controller view- if it is never displayed.
+ //
+ // If you need to manipulate views of any of your child controllers in an override
+ // of this method, you can load yourself the views explicitly on your overriden method.
+ // However we discourage it as an app following the MVC principles should never need to do so
+
+// [_frontViewController view];
+// [_rearViewController view];
+
+ // we store at this point the view's user interaction state as we may temporarily disable it
+ // and resume it back to the previous state, it is possible to override this behaviour by
+ // intercepting it on the panGestureBegan and panGestureEnded delegates
+ _userInteractionStore = _contentView.userInteractionEnabled;
+}
+
+
+- (NSUInteger)supportedInterfaceOrientations
+{
+ return UIInterfaceOrientationMaskAll;
+}
+
+// Support for earlier than iOS 6.0
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ return YES;
+}
+
+
+
+#pragma mark - Public methods and property accessors
+
+- (void)setFrontViewController:(UIViewController *)frontViewController
+{
+ [self setFrontViewController:frontViewController animated:NO];
+}
+
+
+- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated
+{
+ if ( ![self isViewLoaded])
+ {
+ [self _setFrontViewController:frontViewController];
+ return;
+ }
+
+ [self _dispatchSetFrontViewController:frontViewController animated:animated];
+}
+
+
+- (void)setRearViewController:(UIViewController *)rightViewController
+{
+ if ( ![self isViewLoaded])
+ {
+ [self _setRearViewController:rightViewController];
+ return;
+ }
+
+ [self _dispatchSetRearViewController:rightViewController];
+}
+
+
+- (void)setRightViewController:(UIViewController *)rightViewController
+{
+ if ( ![self isViewLoaded])
+ {
+ [self _setRightViewController:rightViewController];
+ return;
+ }
+
+ [self _dispatchSetRightViewController:rightViewController];
+}
+
+
+- (void)revealToggleAnimated:(BOOL)animated
+{
+ FrontViewPosition toogledFrontViewPosition = FrontViewPositionLeft;
+ if (_frontViewPosition <= FrontViewPositionLeft)
+ toogledFrontViewPosition = FrontViewPositionRight;
+
+ [self setFrontViewPosition:toogledFrontViewPosition animated:animated];
+}
+
+- (void)rightRevealToggleAnimated:(BOOL)animated
+{
+ FrontViewPosition toogledFrontViewPosition = FrontViewPositionLeft;
+ if (_frontViewPosition >= FrontViewPositionLeft)
+ toogledFrontViewPosition = FrontViewPositionLeftSide;
+
+ [self setFrontViewPosition:toogledFrontViewPosition animated:animated];
+}
+
+
+- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition
+{
+ [self setFrontViewPosition:frontViewPosition animated:NO];
+}
+
+
+- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated
+{
+ if ( ![self isViewLoaded] )
+ {
+ _frontViewPosition = frontViewPosition;
+ _rearViewPosition = frontViewPosition;
+ _rightViewPosition = frontViewPosition;
+ return;
+ }
+
+ [self _dispatchSetFrontViewPosition:frontViewPosition animated:animated];
+}
+
+
+- (UIPanGestureRecognizer*)panGestureRecognizer
+{
+ if ( _panGestureRecognizer == nil )
+ {
+ SWDirectionPanGestureRecognizer *customRecognizer =
+ [[SWDirectionPanGestureRecognizer alloc] initWithTarget:self action:@selector(_handleRevealGesture:)];
+
+ customRecognizer.direction = SWDirectionPanGestureRecognizerHorizontal;
+ customRecognizer.delegate = self;
+ _panGestureRecognizer = customRecognizer ;
+ }
+ return _panGestureRecognizer;
+}
+
+
+#pragma mark - Provided acction methods
+
+- (void)revealToggle:(id)sender
+{
+ [self revealToggleAnimated:YES];
+}
+
+- (void)rightRevealToggle:(id)sender
+{
+ [self rightRevealToggleAnimated:YES];
+}
+
+
+#pragma mark - UserInteractionEnabling
+
+// disable userInteraction on the entire control
+- (void)_disableUserInteraction
+{
+ //_userInteractionStore = _contentView.userInteractionEnabled;
+ [_contentView setUserInteractionEnabled:NO];
+ [_contentView setDisableLayout:YES];
+
+ if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureBegan:)] )
+ [_delegate revealControllerPanGestureBegan:self];
+}
+
+// restore userInteraction on the control
+- (void)_restoreUserInteraction
+{
+ // we use the stored userInteraction state just in case a developer decided
+ // to have our view interaction disabled beforehand
+ [_contentView setUserInteractionEnabled:_userInteractionStore];
+ [_contentView setDisableLayout:NO];
+
+ if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureEnded:) ] )
+ [_delegate revealControllerPanGestureEnded:self];
+}
+
+
+#pragma mark - Symetry
+
+- (void)_getRevealWidth:(CGFloat*)pRevealWidth revealOverDraw:(CGFloat*)pRevealOverdraw forSymetry:(int)symetry
+{
+ if ( symetry < 0 ) *pRevealWidth = _rightViewRevealWidth, *pRevealOverdraw = _rightViewRevealOverdraw;
+ else *pRevealWidth = _rearViewRevealWidth, *pRevealOverdraw = _rearViewRevealOverdraw;
+}
+
+- (void)_getBounceBack:(BOOL*)pBounceBack pStableDrag:(BOOL*)pStableDrag forSymetry:(int)symetry
+{
+ if ( symetry < 0 ) *pBounceBack = _bounceBackOnLeftOverdraw, *pStableDrag = _stableDragOnLeftOverdraw;
+ else *pBounceBack = _bounceBackOnOverdraw, *pStableDrag = _stableDragOnOverdraw;
+}
+
+- (void)_getAdjustedFrontViewPosition:(FrontViewPosition*)frontViewPosition forSymetry:(int)symetry
+{
+ if ( symetry < 0 ) *frontViewPosition = FrontViewPositionLeft + symetry*(*frontViewPosition-FrontViewPositionLeft);
+}
+
+
+#pragma mark - Deferred block execution queue
+
+// Define a convenience macro to enqueue single statements
+#define _enqueue(code) [self _enqueueBlock:^{code;}];
+
+// Defers the execution of the passed in block until a paired _dequeue call is received,
+// or executes the block right away if no pending requests are present.
+- (void)_enqueueBlock:(void (^)(void))block
+{
+ [_animationQueue insertObject:block atIndex:0];
+ if ( _animationQueue.count == 1)
+ {
+ block();
+ }
+}
+
+// Removes the top most block in the queue and executes the following one if any.
+// Calls to this method must be paired with calls to _enqueueBlock, particularly it may be called
+// from within a block passed to _enqueueBlock to remove itself when done with animations.
+- (void)_dequeue
+{
+ [_animationQueue removeLastObject];
+
+ if ( _animationQueue.count > 0 )
+ {
+ void (^block)(void) = [_animationQueue lastObject];
+ block();
+ }
+}
+
+
+#pragma mark - Gesture Delegate
+
+- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
+{
+ // only allow gesture if no previous request is in process
+ return ( gestureRecognizer == _panGestureRecognizer && _animationQueue.count == 0) ;
+}
+
+
+#pragma mark - Gesture Based Reveal
+
+- (void)_handleRevealGesture:(UIPanGestureRecognizer *)recognizer
+{
+ switch ( recognizer.state )
+ {
+ case UIGestureRecognizerStateBegan:
+ [self _handleRevealGestureStateBeganWithRecognizer:recognizer];
+ break;
+
+ case UIGestureRecognizerStateChanged:
+ [self _handleRevealGestureStateChangedWithRecognizer:recognizer];
+ break;
+
+ case UIGestureRecognizerStateEnded:
+ [self _handleRevealGestureStateEndedWithRecognizer:recognizer];
+ break;
+
+ case UIGestureRecognizerStateCancelled:
+ //case UIGestureRecognizerStateFailed:
+ [self _handleRevealGestureStateCancelledWithRecognizer:recognizer];
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+- (void)_handleRevealGestureStateBeganWithRecognizer:(UIPanGestureRecognizer *)recognizer
+{
+ // we know that we will not get here unless the animationQueue is empty because the recognizer
+ // delegate prevents it, however we do not want any forthcoming programatic actions to disturb
+ // the gesture, so we just enqueue a dummy block to ensure any programatic acctions will be
+ // scheduled after the gesture is completed
+ [self _enqueueBlock:^{}]; // <-- dummy block
+
+ // we store the initial position and initialize a target position
+ _panInitialFrontPosition = _frontViewPosition;
+
+ // we disable user interactions on the views, however programatic accions will still be
+ // enqueued to be performed after the gesture completes
+ [self _disableUserInteraction];
+}
+
+
+- (void)_handleRevealGestureStateChangedWithRecognizer:(UIPanGestureRecognizer *)recognizer
+{
+ CGFloat translation = [recognizer translationInView:_contentView].x;
+
+ CGFloat baseLocation = [_contentView frontLocationForPosition:_panInitialFrontPosition];
+ CGFloat xPosition = baseLocation + translation;
+
+ if ( xPosition < 0 )
+ {
+ if ( _rightViewController == nil ) xPosition = 0;
+ [self _rightViewDeploymentForNewFrontViewPosition:FrontViewPositionLeftSide]();
+ [self _rearViewDeploymentForNewFrontViewPosition:FrontViewPositionLeftSide]();
+ }
+
+ if ( xPosition > 0 )
+ {
+ if ( _rearViewController == nil ) xPosition = 0;
+ [self _rightViewDeploymentForNewFrontViewPosition:FrontViewPositionRight]();
+ [self _rearViewDeploymentForNewFrontViewPosition:FrontViewPositionRight]();
+ }
+
+ [_contentView dragFrontViewToXPosition:xPosition];
+}
+
+
+- (void)_handleRevealGestureStateEndedWithRecognizer:(UIPanGestureRecognizer *)recognizer
+{
+ UIView *frontView = _contentView.frontView;
+
+ CGFloat xPosition = frontView.frame.origin.x;
+ CGFloat velocity = [recognizer velocityInView:_contentView].x;
+ //NSLog( @"Velocity:%1.4f", velocity);
+
+ // depending on position we compute a simetric replacement of widths and positions
+ int symetry = xPosition<0 ? -1 : 1;
+
+ // simetring computing of widths
+ CGFloat revealWidth ;
+ CGFloat revealOverdraw ;
+ BOOL bounceBack;
+ BOOL stableDrag;
+
+ [self _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry];
+ [self _getBounceBack:&bounceBack pStableDrag:&stableDrag forSymetry:symetry];
+
+ // simetric replacement of position
+ xPosition = xPosition * symetry;
+
+ // initially we assume drag to left and default duration
+ FrontViewPosition frontViewPosition = FrontViewPositionLeft;
+ NSTimeInterval duration = _toggleAnimationDuration;
+
+ // Velocity driven change:
+ if (fabsf(velocity) > _quickFlickVelocity)
+ {
+ // we may need to set the drag position and to adjust the animation duration
+ CGFloat journey = xPosition;
+ if (velocity*symetry > 0.0f)
+ {
+ frontViewPosition = FrontViewPositionRight;
+ journey = revealWidth - xPosition;
+ if (xPosition > revealWidth)
+ {
+ if (!bounceBack && stableDrag /*&& xPosition > _rearViewRevealWidth+_rearViewRevealOverdraw*0.5f*/)
+ {
+ frontViewPosition = FrontViewPositionRightMost;
+ journey = revealWidth+revealOverdraw - xPosition;
+ }
+ }
+ }
+
+ duration = fabsf(journey/velocity);
+ }
+
+ // Position driven change:
+ else
+ {
+ // we may need to set the drag position
+ if (xPosition > revealWidth*0.5f)
+ {
+ frontViewPosition = FrontViewPositionRight;
+ if (xPosition > revealWidth)
+ {
+ if (bounceBack)
+ frontViewPosition = FrontViewPositionLeft;
+
+ else if (stableDrag && xPosition > revealWidth+revealOverdraw*0.5f)
+ frontViewPosition = FrontViewPositionRightMost;
+ }
+ }
+ }
+
+ // symetric replacement of frontViewPosition
+ [self _getAdjustedFrontViewPosition:&frontViewPosition forSymetry:symetry];
+
+ // restore user interaction and animate to the final position
+ [self _restoreUserInteraction];
+ [self _setFrontViewPosition:frontViewPosition withDuration:duration];
+}
+
+
+- (void)_handleRevealGestureStateCancelledWithRecognizer:(UIPanGestureRecognizer *)recognizer
+{
+ [self _restoreUserInteraction];
+ [self _dequeue];
+}
+
+
+#pragma mark Enqueued position and controller setup
+
+- (void)_dispatchSetFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated
+{
+ NSTimeInterval duration = animated?_toggleAnimationDuration:0.0;
+ __weak SWRevealViewController *theSelf = self;
+ _enqueue( [theSelf _setFrontViewPosition:frontViewPosition withDuration:duration] );
+}
+
+
+- (void)_dispatchSetFrontViewController:(UIViewController *)newFrontViewController animated:(BOOL)animated
+{
+ int initialPosDif = FrontViewPositionRightMost - _frontViewPosition;
+
+ NSTimeInterval firstDuration ;
+ if ( initialPosDif <= 0 ) firstDuration = 0.0;
+ else if ( initialPosDif == 1 ) firstDuration = _toggleAnimationDuration*0.5;
+ else firstDuration = _toggleAnimationDuration;
+
+ NSTimeInterval duration = animated?_toggleAnimationDuration:0.0;
+
+ __weak SWRevealViewController *theSelf = self;
+ if ( animated )
+ {
+ _enqueue( [theSelf _setFrontViewPosition:FrontViewPositionRightMost withDuration:firstDuration] );
+ _enqueue( [theSelf _setFrontViewController:newFrontViewController] );
+ _enqueue( [theSelf _setFrontViewPosition:FrontViewPositionLeft withDuration:duration] );
+ }
+ else
+ {
+ _enqueue( [theSelf _setFrontViewController:newFrontViewController] );
+ }
+}
+
+
+- (void)_dispatchSetRearViewController:(UIViewController *)newRearViewController
+{
+ __weak SWRevealViewController *theSelf = self;
+ _enqueue( [theSelf _setRearViewController:newRearViewController] );
+}
+
+
+- (void)_dispatchSetRightViewController:(UIViewController *)newRightViewController
+{
+ __weak SWRevealViewController *theSelf = self;
+ _enqueue( [theSelf _setRightViewController:newRightViewController] );
+}
+
+
+#pragma mark animated view controller deployment and layout
+
+// Primitive method for view controller deployment and animated layout to the given position.
+- (void)_setFrontViewPosition:(FrontViewPosition)newPosition withDuration:(NSTimeInterval)duration
+{
+ void (^rearDeploymentCompletion)() = [self _rearViewDeploymentForNewFrontViewPosition:newPosition];
+ void (^rightDeploymentCompletion)() = [self _rightViewDeploymentForNewFrontViewPosition:newPosition];
+ void (^frontDeploymentCompletion)() = [self _frontViewDeploymentForNewFrontViewPosition:newPosition];
+
+ void (^animations)() = ^()
+ {
+ // We call the layoutSubviews method on the contentView view and send a delegate, which will
+ // occur inside of an animation block if any animated transition is being performed
+ [_contentView layoutSubviews];
+
+ if ([_delegate respondsToSelector:@selector(revealController:animateToPosition:)])
+ [_delegate revealController:self animateToPosition:_frontViewPosition];
+ };
+
+ void (^completion)(BOOL) = ^(BOOL finished)
+ {
+ rearDeploymentCompletion();
+ rightDeploymentCompletion();
+ frontDeploymentCompletion();
+ [self _dequeue];
+ };
+
+ if ( duration > 0.0f )
+ {
+ [UIView animateWithDuration:duration delay:0.0
+ options:UIViewAnimationOptionCurveEaseOut
+ animations:animations completion:completion];
+ }
+ else
+ {
+ animations();
+ completion(YES);
+ }
+}
+
+// primitive method for front controller transition
+- (void)_setFrontViewController:(UIViewController*)newFrontViewController
+{
+ UIViewController *old = _frontViewController;
+ _frontViewController = newFrontViewController;
+ [self _transitionFromViewController:old toViewController:newFrontViewController inView:_contentView.frontView]();
+ [self _dequeue];
+}
+
+
+// Primitive method for rear controller transition
+- (void)_setRearViewController:(UIViewController*)newRearViewController
+{
+ UIViewController *old = _rearViewController;
+ _rearViewController = newRearViewController;
+ [self _transitionFromViewController:old toViewController:newRearViewController inView:_contentView.frontView]();
+ [self _dequeue];
+}
+
+// Primitive method for right controller transition
+- (void)_setRightViewController:(UIViewController*)newRightViewController
+{
+ UIViewController *old = _rightViewController;
+ _rightViewController = newRightViewController;
+ [self _transitionFromViewController:old toViewController:newRightViewController inView:_contentView.rightView]();
+ [self _dequeue];
+
+// UIViewController *old = _rightViewController;
+// void (^completion)() = [self _transitionRearController:old toController:newRightViewController inView:_contentView.rightView];
+// [newRightViewController.view setAlpha:0.0];
+// [UIView animateWithDuration:_toggleAnimationDuration
+// animations:^
+// {
+// [old.view setAlpha:0.0f];
+// [newRightViewController.view setAlpha:1.0];
+// }
+// completion:^(BOOL finished)
+// {
+// completion();
+// [self _dequeue];
+// }];
+}
+
+
+#pragma mark Position based view controller deployment
+
+// Deploy/Undeploy of the front view controller following the containment principles. Returns a block
+// that must be invoked on animation completion in order to finish deployment
+- (void (^)(void))_frontViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition
+{
+ if ( (_rightViewController == nil && newPosition < FrontViewPositionLeft) ||
+ (_rearViewController == nil && newPosition > FrontViewPositionLeft) )
+ newPosition = FrontViewPositionLeft;
+
+ BOOL positionIsChanging = (_frontViewPosition != newPosition);
+
+ BOOL appear =
+ (_frontViewPosition >= FrontViewPositionRightMostRemoved || _frontViewPosition <= FrontViewPositionLeftSideMostRemoved) &&
+ (newPosition < FrontViewPositionRightMostRemoved && newPosition > FrontViewPositionLeftSideMostRemoved);
+
+ BOOL disappear =
+ (newPosition >= FrontViewPositionRightMostRemoved || newPosition <= FrontViewPositionLeftSideMostRemoved ) &&
+ (_frontViewPosition < FrontViewPositionRightMostRemoved && _frontViewPosition > FrontViewPositionLeftSideMostRemoved);
+
+ if ( positionIsChanging )
+ {
+ if ( [_delegate respondsToSelector:@selector(revealController:willMoveToPosition:)] )
+ [_delegate revealController:self willMoveToPosition:newPosition];
+ }
+
+ _frontViewPosition = newPosition;
+
+ void (^deploymentCompletion)() =
+ [self _deploymentForViewController:_frontViewController inView:_contentView.frontView appear:appear disappear:disappear];
+
+ void (^completion)() = ^()
+ {
+ deploymentCompletion();
+ if ( positionIsChanging )
+ {
+ if ( [_delegate respondsToSelector:@selector(revealController:didMoveToPosition:)] )
+ [_delegate revealController:self didMoveToPosition:newPosition];
+ }
+ };
+
+ return completion;
+}
+
+// Deploy/Undeploy of the left view controller following the containment principles. Returns a block
+// that must be invoked on animation completion in order to finish deployment
+- (void (^)(void))_rearViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition
+{
+ if ( _rearViewController == nil && newPosition > FrontViewPositionLeft )
+ newPosition = FrontViewPositionLeft;
+
+ BOOL appear = (_rearViewPosition <= FrontViewPositionLeft || _rearViewPosition == FrontViewPositionNone) && newPosition > FrontViewPositionLeft;
+ BOOL disappear = (newPosition <= FrontViewPositionLeft || newPosition == FrontViewPositionNone) && _rearViewPosition > FrontViewPositionLeft;
+
+ if ( appear )
+ [_contentView prepareRearViewForPosition:newPosition];
+
+ _rearViewPosition = newPosition;
+
+ return [self _deploymentForViewController:_rearViewController inView:_contentView.rearView appear:appear disappear:disappear];
+}
+
+// Deploy/Undeploy of the right view controller following the containment principles. Returns a block
+// that must be invoked on animation completion in order to finish deployment
+- (void (^)(void))_rightViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition
+{
+ if ( _rightViewController == nil && newPosition < FrontViewPositionLeft )
+ newPosition = FrontViewPositionLeft;
+
+ BOOL appear = _rightViewPosition >= FrontViewPositionLeft && newPosition < FrontViewPositionLeft ;
+ BOOL disappear = newPosition >= FrontViewPositionLeft && _rightViewPosition < FrontViewPositionLeft;
+
+ if ( appear )
+ [_contentView prepareRightViewForPosition:newPosition];
+
+ _rightViewPosition = newPosition;
+
+ return [self _deploymentForViewController:_rightViewController inView:_contentView.rightView appear:appear disappear:disappear];
+}
+
+
+- (void (^)(void)) _deploymentForViewController:(UIViewController*)controller inView:(UIView*)view appear:(BOOL)appear disappear:(BOOL)disappear
+{
+ if ( appear ) return [self _deployForViewController:controller inView:view];
+ if ( disappear ) return [self _undeployForViewController:controller];
+ return ^{};
+}
+
+
+#pragma mark Containment view controller deployment and transition
+
+// Containment Deploy method. Returns a block to be invoked at the
+// animation completion, or right after return in case of non-animated deployment.
+- (void (^)(void))_deployForViewController:(UIViewController*)controller inView:(UIView*)view
+{
+ if ( !controller || !view )
+ return ^(void){};
+
+ CGRect tmpFrame = view.frame;
+ view.frame = _contentView.bounds;
+
+ UIView *controllerView = controller.view;
+ controllerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ controllerView.frame = view.bounds;
+
+ [view addSubview:controllerView];
+ view.frame = tmpFrame;
+
+ void (^completionBlock)(void) = ^(void)
+ {
+ // nothing to do on completion at this stage
+ };
+
+ return completionBlock;
+}
+
+// Containment Undeploy method. Returns a block to be invoked at the
+// animation completion, or right after return in case of non-animated deployment.
+- (void (^)(void))_undeployForViewController:(UIViewController*)controller
+{
+ if (!controller)
+ return ^(void){};
+
+ // nothing to do before completion at this stage
+
+ void (^completionBlock)(void) = ^(void)
+ {
+ [controller.view removeFromSuperview];
+ };
+
+ return completionBlock;
+}
+
+// Containment Transition method. Returns a block to be invoked at the
+// animation completion, or right after return in case of non-animated transition.
+- (void(^)(void))_transitionFromViewController:(UIViewController*)fromController toViewController:(UIViewController*)toController inView:(UIView*)view
+{
+ if ( fromController == toController )
+ return ^(void){};
+
+ if ( toController ) [self addChildViewController:toController];
+
+ void (^deployCompletion)() = [self _deployForViewController:toController inView:view];
+
+ [fromController willMoveToParentViewController:nil];
+
+ void (^undeployCompletion)() = [self _undeployForViewController:fromController];
+
+ void (^completionBlock)(void) = ^(void)
+ {
+ undeployCompletion() ;
+ [fromController removeFromParentViewController];
+
+ deployCompletion() ;
+ [toController didMoveToParentViewController:self];
+ };
+ return completionBlock;
+}
+
+
+@end
+
+
+#pragma mark - UIViewController(SWRevealViewController) Category
+
+@implementation UIViewController(SWRevealViewController)
+
+- (SWRevealViewController*)revealViewController
+{
+ UIViewController *parent = self;
+ Class revealClass = [SWRevealViewController class];
+
+ while ( nil != (parent = [parent parentViewController]) && ![parent isKindOfClass:revealClass] )
+ {
+ }
+
+ return (id)parent;
+}
+
+@end
+
+
+#pragma mark - SWRevealViewControllerSegue Class
+
+@implementation SWRevealViewControllerSegue
+
+- (void)perform
+{
+ if ( _performBlock != nil )
+ {
+ _performBlock( self, self.sourceViewController, self.destinationViewController );
+ }
+}
+
+@end
+
diff --git a/ios/iosremote/en.lproj/iPad_autosize.storyboard b/ios/iosremote/en.lproj/iPad_autosize.storyboard
index ffb97be77937..57700f3c78b7 100644
--- a/ios/iosremote/en.lproj/iPad_autosize.storyboard
+++ b/ios/iosremote/en.lproj/iPad_autosize.storyboard
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
<dependencies>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--About View Controller-->
@@ -39,27 +39,26 @@
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="h0a-Zq-2vY" detailTextLabel="Fsp-wI-AAW" style="IBUITableViewCellStyleValue1" id="HZp-VJ-Pgz">
- <rect key="frame" x="0.0" y="54" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HZp-VJ-Pgz" id="5rS-B1-6zF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="h0a-Zq-2vY">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Fsp-wI-AAW">
- <rect key="frame" x="424" y="11" width="44" height="22"/>
+ <rect key="frame" x="481" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -79,7 +78,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="serverTable" destination="0vt-Sx-o55" id="Szp-pH-0rk"/>
<segue destination="m26-i1-eiL" kind="push" identifier="pinValidation" id="yUv-cB-P15"/>
@@ -108,7 +107,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Please enter the pin code above in Impress - Slide Show - Impress Remote" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="4" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9zr-53-YfP">
- <rect key="frame" x="115" y="442" width="320" height="94"/>
+ <rect key="frame" x="115" y="442" width="320" height="94.000000000000014"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Light" family="Helvetica" pointSize="15"/>
<color key="textColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
@@ -122,7 +121,7 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="V5z-WP-qrM"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="pinLabel" destination="Bp1-Dv-nt4" id="6xd-P5-J5U"/>
<segue destination="M9Q-tM-7CQ" kind="push" identifier="pinValidated" id="nkI-m0-Ps8"/>
@@ -144,22 +143,20 @@
<tableViewSection footerTitle="" id="CVG-Eq-rLd">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="b8A-jh-k26" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="30" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b8A-jh-k26" id="1PC-Os-0pl">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="jrI-wU-4NT" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="75" width="540" height="44"/>
+ <rect key="frame" x="0.0" y="79" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="0.0" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="jrI-wU-4NT" id="Ty8-vX-PiF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -176,7 +173,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="JK3-FB-UoN" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -194,7 +191,7 @@
<rect key="frame" x="0.0" y="20" width="540" height="234"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
<rect key="frame" x="20" y="20" width="500" height="194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
@@ -219,7 +216,7 @@
<action selector="startPresentationAction:" destination="M9Q-tM-7CQ" eventType="touchUpInside" id="ZcD-xo-Cvg"/>
</connections>
</button>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
<rect key="frame" x="201" y="438" width="138" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="17"/>
@@ -253,7 +250,7 @@
<objects>
<viewController storyboardIdentifier="basePresentation" id="TYh-Hw-m1Q" customClass="BasePresentationViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="qHB-hR-vFc">
- <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" id="KCA-UU-Lu1" userLabel="Preview">
@@ -311,7 +308,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="Pk1-fD-KAi" userLabel="NotesView">
- <rect key="frame" x="-13" y="595" width="794" height="303"/>
+ <rect key="frame" x="-13" y="595" width="794" height="323"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Lecturer's Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5Yn-0z-Cjz">
@@ -323,15 +320,15 @@
<nil key="highlightedColor"/>
</label>
<webView tag="4" contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="pAh-4g-JCn" userLabel="Notes">
- <rect key="frame" x="20" y="29" width="754" height="274"/>
+ <rect key="frame" x="20" y="29" width="754" height="294"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
- <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
- <rect key="frame" x="1082" y="-274" width="0.0" height="0.0"/>
+ <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
+ <rect key="frame" x="-26" y="236" width="0.0" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<connections>
@@ -340,7 +337,7 @@
</connections>
</tableView>
<view contentMode="scaleToFill" restorationIdentifier="" id="xYX-bt-wuI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="906" width="768" height="98"/>
+ <rect key="frame" x="0.0" y="926" width="768" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="DUv-gH-oAo">
@@ -503,6 +500,7 @@
<color key="backgroundColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
</view>
<toolbarItems/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="NoteWebView" destination="pAh-4g-JCn" id="h2a-iy-ahp"/>
<outlet property="NotesView" destination="Pk1-fD-KAi" id="2ZD-si-fls"/>
@@ -548,15 +546,15 @@
<scene sceneID="Abu-7b-l1S">
<objects>
<tableViewController clearsSelectionOnViewWillAppear="NO" id="VQa-vM-8pF" customClass="SlideShowSwipeInList_ipad" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
- <rect key="frame" x="0.0" y="20" width="320" height="832"/>
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="178" id="c4j-oH-LnN">
<rect key="frame" x="0.0" y="22" width="320" height="178"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="c4j-oH-LnN" id="tSG-SJ-J7C">
<rect key="frame" x="0.0" y="0.0" width="320" height="177"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
@@ -571,8 +569,7 @@
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableViewCell>
</prototypes>
@@ -582,7 +579,7 @@
</connections>
</tableView>
<navigationItem key="navigationItem" id="tG3-aQ-qyu"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EJg-kN-O5N" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -593,7 +590,8 @@
<objects>
<navigationController storyboardIdentifier="serverList" id="KDH-tS-eoR" customClass="autoDismissKeyboardNavigationViewController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="9T5-Qi-Tr9">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="9T5-Qi-Tr9">
<rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -616,7 +614,7 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="2hX-NQ-pfJ"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EWl-Cj-qdi" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -638,86 +636,7 @@
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn_dark.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </relationships>
- </class>
- <class className="BasePresentationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/BasePresentationViewController.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="popOverUp:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <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="stopWatchTimerScrollView" candidateClass="UIScrollView"/>
- <relationship kind="outlet" name="stopWatchView" candidateClass="UIView"/>
- <relationship kind="outlet" name="timeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerClearButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerSetTimeButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerStartButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerTimeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerView" candidateClass="UIView"/>
- </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="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="PinValidationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/PinValidationViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController.h"/>
- <relationships>
- <relationship kind="action" name="startPrefSettings:"/>
- <relationship kind="action" name="startPresentationAction:"/>
- <relationship kind="outlet" name="prefButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="startButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="titleLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController_ipad" superclassName="SlideShowPreviewViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController_ipad.h"/>
- </class>
- <class className="SlideShowSwipeInList_ipad" superclassName="UITableViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowSwipeInList_ipad.h"/>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- <class className="autoDismissKeyboardNavigationViewController" superclassName="LibONavigationController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/autoDismissKeyboardNavigationViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
diff --git a/ios/iosremote/en.lproj/iPad_autosize_old.storyboard b/ios/iosremote/en.lproj/iPad_autosize_old.storyboard
index c99ac1e4fe99..57700f3c78b7 100644
--- a/ios/iosremote/en.lproj/iPad_autosize_old.storyboard
+++ b/ios/iosremote/en.lproj/iPad_autosize_old.storyboard
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
<dependencies>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--About View Controller-->
@@ -30,36 +30,35 @@
</objects>
<point key="canvasLocation" x="254" y="-2200"/>
</scene>
- <!--Server list vc ipad - Connect-->
+ <!--Server List View Controller ipad - Connect-->
<scene sceneID="ydU-fu-qHI">
<objects>
- <viewController id="5QV-E7-KNT" customClass="server_list_vc_ipad" sceneMemberID="viewController">
+ <viewController id="5QV-E7-KNT" customClass="ServerListViewController_ipad" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="0vt-Sx-o55">
<rect key="frame" x="0.0" y="64" width="540" height="556"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="h0a-Zq-2vY" detailTextLabel="Fsp-wI-AAW" style="IBUITableViewCellStyleValue1" id="HZp-VJ-Pgz">
- <rect key="frame" x="0.0" y="54" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HZp-VJ-Pgz" id="5rS-B1-6zF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="h0a-Zq-2vY">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Fsp-wI-AAW">
- <rect key="frame" x="424" y="11" width="44" height="22"/>
+ <rect key="frame" x="481" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -79,7 +78,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="serverTable" destination="0vt-Sx-o55" id="Szp-pH-0rk"/>
<segue destination="m26-i1-eiL" kind="push" identifier="pinValidation" id="yUv-cB-P15"/>
@@ -108,7 +107,7 @@
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Please enter the pin code above in Impress - Slide Show - Impress Remote" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="4" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9zr-53-YfP">
- <rect key="frame" x="115" y="442" width="320" height="94"/>
+ <rect key="frame" x="115" y="442" width="320" height="94.000000000000014"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Light" family="Helvetica" pointSize="15"/>
<color key="textColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
@@ -122,7 +121,7 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="V5z-WP-qrM"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="pinLabel" destination="Bp1-Dv-nt4" id="6xd-P5-J5U"/>
<segue destination="M9Q-tM-7CQ" kind="push" identifier="pinValidated" id="nkI-m0-Ps8"/>
@@ -144,22 +143,20 @@
<tableViewSection footerTitle="" id="CVG-Eq-rLd">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="b8A-jh-k26" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="30" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b8A-jh-k26" id="1PC-Os-0pl">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="jrI-wU-4NT" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="75" width="540" height="44"/>
+ <rect key="frame" x="0.0" y="79" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="0.0" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="jrI-wU-4NT" id="Ty8-vX-PiF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -176,7 +173,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="JK3-FB-UoN" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -194,7 +191,7 @@
<rect key="frame" x="0.0" y="20" width="540" height="234"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
<rect key="frame" x="20" y="20" width="500" height="194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
@@ -219,7 +216,7 @@
<action selector="startPresentationAction:" destination="M9Q-tM-7CQ" eventType="touchUpInside" id="ZcD-xo-Cvg"/>
</connections>
</button>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
<rect key="frame" x="201" y="438" width="138" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="17"/>
@@ -253,7 +250,7 @@
<objects>
<viewController storyboardIdentifier="basePresentation" id="TYh-Hw-m1Q" customClass="BasePresentationViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="qHB-hR-vFc">
- <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" id="KCA-UU-Lu1" userLabel="Preview">
@@ -311,7 +308,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="Pk1-fD-KAi" userLabel="NotesView">
- <rect key="frame" x="-13" y="595" width="794" height="303"/>
+ <rect key="frame" x="-13" y="595" width="794" height="323"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Lecturer's Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5Yn-0z-Cjz">
@@ -323,15 +320,15 @@
<nil key="highlightedColor"/>
</label>
<webView tag="4" contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="pAh-4g-JCn" userLabel="Notes">
- <rect key="frame" x="20" y="29" width="754" height="274"/>
+ <rect key="frame" x="20" y="29" width="754" height="294"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
- <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
- <rect key="frame" x="1082" y="-274" width="0.0" height="0.0"/>
+ <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
+ <rect key="frame" x="-26" y="236" width="0.0" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<connections>
@@ -340,7 +337,7 @@
</connections>
</tableView>
<view contentMode="scaleToFill" restorationIdentifier="" id="xYX-bt-wuI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="906" width="768" height="98"/>
+ <rect key="frame" x="0.0" y="926" width="768" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="DUv-gH-oAo">
@@ -503,6 +500,7 @@
<color key="backgroundColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
</view>
<toolbarItems/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="NoteWebView" destination="pAh-4g-JCn" id="h2a-iy-ahp"/>
<outlet property="NotesView" destination="Pk1-fD-KAi" id="2ZD-si-fls"/>
@@ -548,15 +546,15 @@
<scene sceneID="Abu-7b-l1S">
<objects>
<tableViewController clearsSelectionOnViewWillAppear="NO" id="VQa-vM-8pF" customClass="SlideShowSwipeInList_ipad" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
- <rect key="frame" x="0.0" y="20" width="320" height="832"/>
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="178" id="c4j-oH-LnN">
<rect key="frame" x="0.0" y="22" width="320" height="178"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="c4j-oH-LnN" id="tSG-SJ-J7C">
<rect key="frame" x="0.0" y="0.0" width="320" height="177"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
@@ -571,8 +569,7 @@
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableViewCell>
</prototypes>
@@ -582,7 +579,7 @@
</connections>
</tableView>
<navigationItem key="navigationItem" id="tG3-aQ-qyu"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EJg-kN-O5N" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -593,7 +590,8 @@
<objects>
<navigationController storyboardIdentifier="serverList" id="KDH-tS-eoR" customClass="autoDismissKeyboardNavigationViewController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="9T5-Qi-Tr9">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="9T5-Qi-Tr9">
<rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -616,7 +614,7 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="2hX-NQ-pfJ"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EWl-Cj-qdi" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -638,100 +636,7 @@
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn_dark.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </relationships>
- </class>
- <class className="BasePresentationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/BasePresentationViewController.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="popOverUp:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <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="stopWatchTimerScrollView" candidateClass="UIScrollView"/>
- <relationship kind="outlet" name="stopWatchView" candidateClass="UIView"/>
- <relationship kind="outlet" name="timeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerClearButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerSetTimeButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerStartButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerTimeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerView" candidateClass="UIView"/>
- </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="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="PinValidationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/PinValidationViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="ServerListViewController" superclassName="UITableViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/ServerListViewController.h"/>
- <relationships>
- <relationship kind="action" name="onClickMenuButton:"/>
- <relationship kind="outlet" name="menuButton" candidateClass="UIBarButtonItem"/>
- <relationship kind="outlet" name="serverTable" candidateClass="UITableView"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController.h"/>
- <relationships>
- <relationship kind="action" name="startPrefSettings:"/>
- <relationship kind="action" name="startPresentationAction:"/>
- <relationship kind="outlet" name="prefButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="startButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="titleLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController_ipad" superclassName="SlideShowPreviewViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController_ipad.h"/>
- </class>
- <class className="SlideShowSwipeInList_ipad" superclassName="UITableViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowSwipeInList_ipad.h"/>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- <class className="autoDismissKeyboardNavigationViewController" superclassName="LibONavigationController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/autoDismissKeyboardNavigationViewController.h"/>
- </class>
- <class className="server_list_vc_ipad" superclassName="ServerListViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/server_list_vc_ipad.h"/>
- <relationships>
- <relationship kind="action" name="cancelModalView:"/>
- </relationships>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
diff --git a/ios/iosremote/fr.lproj/iPad_autosize.storyboard b/ios/iosremote/fr.lproj/iPad_autosize.storyboard
index ebeda15ee295..75e0d8d811be 100644
--- a/ios/iosremote/fr.lproj/iPad_autosize.storyboard
+++ b/ios/iosremote/fr.lproj/iPad_autosize.storyboard
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
<dependencies>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--About View Controller-->
@@ -39,27 +39,26 @@
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="h0a-Zq-2vY" detailTextLabel="Fsp-wI-AAW" style="IBUITableViewCellStyleValue1" id="HZp-VJ-Pgz">
- <rect key="frame" x="0.0" y="54" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HZp-VJ-Pgz" id="5rS-B1-6zF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="h0a-Zq-2vY">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Fsp-wI-AAW">
- <rect key="frame" x="424" y="11" width="44" height="22"/>
+ <rect key="frame" x="481" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -79,7 +78,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="serverTable" destination="0vt-Sx-o55" id="Szp-pH-0rk"/>
<segue destination="m26-i1-eiL" kind="push" identifier="pinValidation" id="yUv-cB-P15"/>
@@ -101,7 +100,7 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="3128" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Bp1-Dv-nt4">
- <rect key="frame" x="164" y="66" width="223" height="119"/>
+ <rect key="frame" x="164" y="66" width="223" height="118"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" pointSize="100"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
@@ -115,14 +114,14 @@
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" image="WTPairingScreenshot.png" id="iaB-Jl-mwG">
- <rect key="frame" x="80" y="192" width="381" height="243"/>
+ <rect key="frame" x="80" y="192" width="381" height="242"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="V5z-WP-qrM"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="pinLabel" destination="Bp1-Dv-nt4" id="6xd-P5-J5U"/>
<segue destination="M9Q-tM-7CQ" kind="push" identifier="pinValidated" id="nkI-m0-Ps8"/>
@@ -144,22 +143,20 @@
<tableViewSection footerTitle="" id="CVG-Eq-rLd">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="b8A-jh-k26" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="30" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b8A-jh-k26" id="1PC-Os-0pl">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="jrI-wU-4NT" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="75" width="540" height="44"/>
+ <rect key="frame" x="0.0" y="79" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="0.0" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="jrI-wU-4NT" id="Ty8-vX-PiF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -176,7 +173,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="JK3-FB-UoN" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -194,7 +191,7 @@
<rect key="frame" x="0.0" y="20" width="540" height="234"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
<rect key="frame" x="20" y="20" width="500" height="194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
@@ -219,7 +216,7 @@
<action selector="startPresentationAction:" destination="M9Q-tM-7CQ" eventType="touchUpInside" id="ZcD-xo-Cvg"/>
</connections>
</button>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
<rect key="frame" x="201" y="438" width="138" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="17"/>
@@ -253,7 +250,7 @@
<objects>
<viewController storyboardIdentifier="basePresentation" id="TYh-Hw-m1Q" customClass="BasePresentationViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="qHB-hR-vFc">
- <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" id="KCA-UU-Lu1" userLabel="Preview">
@@ -311,7 +308,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="Pk1-fD-KAi" userLabel="NotesView">
- <rect key="frame" x="-13" y="595" width="794" height="303"/>
+ <rect key="frame" x="-13" y="595" width="794" height="323"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5Yn-0z-Cjz">
@@ -323,15 +320,15 @@
<nil key="highlightedColor"/>
</label>
<webView tag="4" contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="pAh-4g-JCn" userLabel="Notes">
- <rect key="frame" x="20" y="29" width="754" height="274"/>
+ <rect key="frame" x="20" y="29" width="754" height="294"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
- <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
- <rect key="frame" x="-584" y="-459" width="0.0" height="0.0"/>
+ <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
+ <rect key="frame" x="-26" y="236" width="0.0" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<connections>
@@ -340,7 +337,7 @@
</connections>
</tableView>
<view contentMode="scaleToFill" restorationIdentifier="" id="xYX-bt-wuI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="906" width="768" height="98"/>
+ <rect key="frame" x="0.0" y="926" width="768" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="DUv-gH-oAo">
@@ -503,6 +500,7 @@
<color key="backgroundColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
</view>
<toolbarItems/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="NoteWebView" destination="pAh-4g-JCn" id="h2a-iy-ahp"/>
<outlet property="NotesView" destination="Pk1-fD-KAi" id="2ZD-si-fls"/>
@@ -548,15 +546,15 @@
<scene sceneID="Abu-7b-l1S">
<objects>
<tableViewController clearsSelectionOnViewWillAppear="NO" id="VQa-vM-8pF" customClass="SlideShowSwipeInList_ipad" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
- <rect key="frame" x="0.0" y="20" width="320" height="832"/>
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="178" id="c4j-oH-LnN">
<rect key="frame" x="0.0" y="22" width="320" height="178"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="c4j-oH-LnN" id="tSG-SJ-J7C">
<rect key="frame" x="0.0" y="0.0" width="320" height="177"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
@@ -571,8 +569,7 @@
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableViewCell>
</prototypes>
@@ -582,7 +579,7 @@
</connections>
</tableView>
<navigationItem key="navigationItem" id="tG3-aQ-qyu"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EJg-kN-O5N" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -593,7 +590,8 @@
<objects>
<navigationController storyboardIdentifier="serverList" id="KDH-tS-eoR" customClass="autoDismissKeyboardNavigationViewController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="9T5-Qi-Tr9">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="9T5-Qi-Tr9">
<rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -616,7 +614,7 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="2hX-NQ-pfJ"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EWl-Cj-qdi" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -638,86 +636,7 @@
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn_dark.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </relationships>
- </class>
- <class className="BasePresentationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/BasePresentationViewController.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="popOverUp:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <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="stopWatchTimerScrollView" candidateClass="UIScrollView"/>
- <relationship kind="outlet" name="stopWatchView" candidateClass="UIView"/>
- <relationship kind="outlet" name="timeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerClearButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerSetTimeButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerStartButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerTimeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerView" candidateClass="UIView"/>
- </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="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="PinValidationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/PinValidationViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController.h"/>
- <relationships>
- <relationship kind="action" name="startPrefSettings:"/>
- <relationship kind="action" name="startPresentationAction:"/>
- <relationship kind="outlet" name="prefButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="startButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="titleLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController_ipad" superclassName="SlideShowPreviewViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController_ipad.h"/>
- </class>
- <class className="SlideShowSwipeInList_ipad" superclassName="UITableViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowSwipeInList_ipad.h"/>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- <class className="autoDismissKeyboardNavigationViewController" superclassName="LibONavigationController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/autoDismissKeyboardNavigationViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
diff --git a/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard b/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard
index f68eecbb2cbc..75e0d8d811be 100644
--- a/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard
+++ b/ios/iosremote/fr.lproj/iPad_autosize_old.storyboard
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" initialViewController="XiK-Ye-iB8">
<dependencies>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--About View Controller-->
@@ -30,36 +30,35 @@
</objects>
<point key="canvasLocation" x="254" y="-2200"/>
</scene>
- <!--Server list vc - Connecter-->
+ <!--Server List View Controller ipad - Connecter-->
<scene sceneID="ydU-fu-qHI">
<objects>
- <viewController id="5QV-E7-KNT" customClass="server_list_vc" sceneMemberID="viewController">
+ <viewController id="5QV-E7-KNT" customClass="ServerListViewController_ipad" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="0vt-Sx-o55">
<rect key="frame" x="0.0" y="64" width="540" height="556"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="h0a-Zq-2vY" detailTextLabel="Fsp-wI-AAW" style="IBUITableViewCellStyleValue1" id="HZp-VJ-Pgz">
- <rect key="frame" x="0.0" y="54" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HZp-VJ-Pgz" id="5rS-B1-6zF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="h0a-Zq-2vY">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Fsp-wI-AAW">
- <rect key="frame" x="424" y="11" width="44" height="22"/>
+ <rect key="frame" x="481" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -79,7 +78,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="serverTable" destination="0vt-Sx-o55" id="Szp-pH-0rk"/>
<segue destination="m26-i1-eiL" kind="push" identifier="pinValidation" id="yUv-cB-P15"/>
@@ -101,7 +100,7 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="3128" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Bp1-Dv-nt4">
- <rect key="frame" x="164" y="66" width="223" height="119"/>
+ <rect key="frame" x="164" y="66" width="223" height="118"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" pointSize="100"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
@@ -115,14 +114,14 @@
<nil key="highlightedColor"/>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" image="WTPairingScreenshot.png" id="iaB-Jl-mwG">
- <rect key="frame" x="80" y="192" width="381" height="243"/>
+ <rect key="frame" x="80" y="192" width="381" height="242"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="V5z-WP-qrM"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="pinLabel" destination="Bp1-Dv-nt4" id="6xd-P5-J5U"/>
<segue destination="M9Q-tM-7CQ" kind="push" identifier="pinValidated" id="nkI-m0-Ps8"/>
@@ -144,22 +143,20 @@
<tableViewSection footerTitle="" id="CVG-Eq-rLd">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="b8A-jh-k26" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="30" width="540" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="1" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b8A-jh-k26" id="1PC-Os-0pl">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="jrI-wU-4NT" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="75" width="540" height="44"/>
+ <rect key="frame" x="0.0" y="79" width="540" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="31" y="0.0" width="478" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="jrI-wU-4NT" id="Ty8-vX-PiF">
+ <rect key="frame" x="0.0" y="0.0" width="540" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -176,7 +173,7 @@
</connections>
</barButtonItem>
</navigationItem>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="JK3-FB-UoN" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -194,7 +191,7 @@
<rect key="frame" x="0.0" y="20" width="540" height="234"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Presentation Title" textAlignment="center" lineBreakMode="wordWrap" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="sXT-OZ-7y3">
<rect key="frame" x="20" y="20" width="500" height="194"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="24"/>
@@ -219,7 +216,7 @@
<action selector="startPresentationAction:" destination="M9Q-tM-7CQ" eventType="touchUpInside" id="ZcD-xo-Cvg"/>
</connections>
</button>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="02F-Tj-9xO" userLabel="slideShowPreview">
<rect key="frame" x="201" y="438" width="138" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="Helvetica" family="Helvetica" pointSize="17"/>
@@ -253,7 +250,7 @@
<objects>
<viewController storyboardIdentifier="basePresentation" id="TYh-Hw-m1Q" customClass="BasePresentationViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="qHB-hR-vFc">
- <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <rect key="frame" x="0.0" y="0.0" width="768" height="1024"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" id="KCA-UU-Lu1" userLabel="Preview">
@@ -311,7 +308,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="Pk1-fD-KAi" userLabel="NotesView">
- <rect key="frame" x="-13" y="595" width="794" height="303"/>
+ <rect key="frame" x="-13" y="595" width="794" height="323"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="5Yn-0z-Cjz">
@@ -323,15 +320,15 @@
<nil key="highlightedColor"/>
</label>
<webView tag="4" contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="pAh-4g-JCn" userLabel="Notes">
- <rect key="frame" x="20" y="29" width="754" height="274"/>
+ <rect key="frame" x="20" y="29" width="754" height="294"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
- <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
- <rect key="frame" x="-584" y="-459" width="0.0" height="0.0"/>
+ <tableView contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="Iok-mu-c0T" customClass="HorizontalTableView">
+ <rect key="frame" x="-26" y="236" width="0.0" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<connections>
@@ -340,7 +337,7 @@
</connections>
</tableView>
<view contentMode="scaleToFill" restorationIdentifier="" id="xYX-bt-wuI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="906" width="768" height="98"/>
+ <rect key="frame" x="0.0" y="926" width="768" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="DUv-gH-oAo">
@@ -503,6 +500,7 @@
<color key="backgroundColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
</view>
<toolbarItems/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
<connections>
<outlet property="NoteWebView" destination="pAh-4g-JCn" id="h2a-iy-ahp"/>
<outlet property="NotesView" destination="Pk1-fD-KAi" id="2ZD-si-fls"/>
@@ -548,15 +546,15 @@
<scene sceneID="Abu-7b-l1S">
<objects>
<tableViewController clearsSelectionOnViewWillAppear="NO" id="VQa-vM-8pF" customClass="SlideShowSwipeInList_ipad" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
- <rect key="frame" x="0.0" y="20" width="320" height="832"/>
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="170" sectionHeaderHeight="22" sectionFooterHeight="22" id="U9c-sP-NVQ">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="852"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="178" id="c4j-oH-LnN">
<rect key="frame" x="0.0" y="22" width="320" height="178"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="c4j-oH-LnN" id="tSG-SJ-J7C">
<rect key="frame" x="0.0" y="0.0" width="320" height="177"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
@@ -571,8 +569,7 @@
<color key="highlightedColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableViewCell>
</prototypes>
@@ -582,7 +579,7 @@
</connections>
</tableView>
<navigationItem key="navigationItem" id="tG3-aQ-qyu"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EJg-kN-O5N" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -593,7 +590,8 @@
<objects>
<navigationController storyboardIdentifier="serverList" id="KDH-tS-eoR" customClass="autoDismissKeyboardNavigationViewController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="9T5-Qi-Tr9">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="9T5-Qi-Tr9">
<rect key="frame" x="0.0" y="0.0" width="768" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -616,7 +614,7 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="2hX-NQ-pfJ"/>
- <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackOpaque"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="lightContent"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="EWl-Cj-qdi" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
@@ -638,86 +636,7 @@
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn_dark.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </relationships>
- </class>
- <class className="BasePresentationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/BasePresentationViewController.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="popOverUp:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <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="stopWatchTimerScrollView" candidateClass="UIScrollView"/>
- <relationship kind="outlet" name="stopWatchView" candidateClass="UIView"/>
- <relationship kind="outlet" name="timeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerClearButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerSetTimeButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerStartButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="timerTimeLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="timerView" candidateClass="UIView"/>
- </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="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="PinValidationViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/PinValidationViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
- <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController.h"/>
- <relationships>
- <relationship kind="action" name="startPrefSettings:"/>
- <relationship kind="action" name="startPresentationAction:"/>
- <relationship kind="outlet" name="prefButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="startButton" candidateClass="UIButton"/>
- <relationship kind="outlet" name="titleLabel" candidateClass="UILabel"/>
- </relationships>
- </class>
- <class className="SlideShowPreviewViewController_ipad" superclassName="SlideShowPreviewViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowPreviewViewController_ipad.h"/>
- </class>
- <class className="SlideShowSwipeInList_ipad" superclassName="UITableViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowSwipeInList_ipad.h"/>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- <class className="autoDismissKeyboardNavigationViewController" superclassName="LibONavigationController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/autoDismissKeyboardNavigationViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
diff --git a/ios/iosremote/iosremote.xcodeproj/project.pbxproj b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
index e3fa067cfc40..33fce6927e84 100644
--- a/ios/iosremote/iosremote.xcodeproj/project.pbxproj
+++ b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
@@ -67,8 +67,6 @@
8C19F42717B04E7C005BDB61 /* navBarBackground@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F42517B04E7C005BDB61 /* navBarBackground@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@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43217B056B3005BDB61 /* navBarButtonNormal@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 */; };
@@ -101,6 +99,7 @@
8C3A648C17DCBE9E004A77D9 /* timer_settime_btn_dark.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C3A648517DCBE9E004A77D9 /* timer_settime_btn_dark.png */; };
8C3A648D17DCBE9E004A77D9 /* timer_settime_btn_dark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C3A648617DCBE9E004A77D9 /* timer_settime_btn_dark@2x.png */; };
8C3A648E17DCBE9E004A77D9 /* timer_start_btn_dark.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C3A648717DCBE9E004A77D9 /* timer_start_btn_dark.png */; };
+ 8C8C7FB017EDA9330022A6BD /* UINavigationController+Theme.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C8C7FAF17EDA9330022A6BD /* UINavigationController+Theme.m */; };
8C94E69617CF7BF000B4848D /* WTPairingScreenshot.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C94E69517CF7BF000B4848D /* WTPairingScreenshot.png */; };
8CAD658517A2E84A00CFB661 /* MainSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CAD658417A2E84A00CFB661 /* MainSplitViewController.m */; };
8CAD658817A2EDB200CFB661 /* SlideShowPreviewViewController~ipad.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CAD658717A2EDB200CFB661 /* SlideShowPreviewViewController~ipad.m */; };
@@ -245,8 +244,6 @@
8C19F42317B02C2E005BDB61 /* PopoverViewCompatibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PopoverViewCompatibility.h; path = PopoverView/PopoverViewCompatibility.h; sourceTree = "<group>"; };
8C19F42517B04E7C005BDB61 /* navBarBackground@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navBarBackground@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; name = "UINavigationController+Theme.h"; path = "iosremote/Categories/UINavigationController+Theme.h"; sourceTree = "<group>"; };
- 8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+Theme.m"; path = "iosremote/Categories/UINavigationController+Theme.m"; sourceTree = "<group>"; };
8C19F42D17B05089005BDB61 /* LibONavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibONavigationController.h; path = iosremote/Classes/LibONavigationController.h; sourceTree = "<group>"; };
8C19F42E17B05089005BDB61 /* LibONavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LibONavigationController.m; path = iosremote/Classes/LibONavigationController.m; sourceTree = "<group>"; };
8C19F43217B056B3005BDB61 /* navBarButtonNormal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navBarButtonNormal@2x.png"; sourceTree = "<group>"; };
@@ -290,6 +287,8 @@
8C3A648517DCBE9E004A77D9 /* timer_settime_btn_dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = timer_settime_btn_dark.png; sourceTree = "<group>"; };
8C3A648617DCBE9E004A77D9 /* timer_settime_btn_dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "timer_settime_btn_dark@2x.png"; sourceTree = "<group>"; };
8C3A648717DCBE9E004A77D9 /* timer_start_btn_dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = timer_start_btn_dark.png; sourceTree = "<group>"; };
+ 8C8C7FAE17EDA9330022A6BD /* UINavigationController+Theme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+Theme.h"; path = "iosremote/Categories/UINavigationController+Theme.h"; sourceTree = "<group>"; };
+ 8C8C7FAF17EDA9330022A6BD /* UINavigationController+Theme.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+Theme.m"; path = "iosremote/Categories/UINavigationController+Theme.m"; sourceTree = "<group>"; };
8C94E69517CF7BF000B4848D /* WTPairingScreenshot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = WTPairingScreenshot.png; sourceTree = "<group>"; };
8CAD658317A2E84A00CFB661 /* MainSplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MainSplitViewController.h; path = iosremote/Classes/MainSplitViewController.h; sourceTree = "<group>"; };
8CAD658417A2E84A00CFB661 /* MainSplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MainSplitViewController.m; path = iosremote/Classes/MainSplitViewController.m; sourceTree = "<group>"; };
@@ -615,6 +614,8 @@
8C1A170617A28DDF00B4BB3C /* Support */ = {
isa = PBXGroup;
children = (
+ 8C8C7FAE17EDA9330022A6BD /* UINavigationController+Theme.h */,
+ 8C8C7FAF17EDA9330022A6BD /* UINavigationController+Theme.m */,
57B152971764703500EECC67 /* NSString+Base64.h */,
57B152981764703500EECC67 /* NSString+Base64.m */,
57CFED9717838FDC00E82E05 /* EditableTableViewCell.h */,
@@ -630,8 +631,6 @@
8C23B46817DA158C00FB4DE6 /* UIView+Shadowing.m */,
57DC7010178E16A40050FC58 /* UIView+FadeInFadeOut.h */,
57DC7011178E16A40050FC58 /* UIView+FadeInFadeOut.m */,
- 8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */,
- 8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */,
8C19F42D17B05089005BDB61 /* LibONavigationController.h */,
8C19F42E17B05089005BDB61 /* LibONavigationController.m */,
8C19F43417B10D48005BDB61 /* UIViewController+LibOStyling.h */,
@@ -967,8 +966,6 @@
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 */,
@@ -984,6 +981,7 @@
57CFED9917838FDC00E82E05 /* EditableTableViewCell.m in Sources */,
57FE71E31785C61400B50125 /* PinValidationViewController.m in Sources */,
57FE71E917861A9000B50125 /* SlideShowPreviewViewController.m in Sources */,
+ 8C8C7FB017EDA9330022A6BD /* UINavigationController+Theme.m in Sources */,
57867A571787385800EBBE52 /* SlideShowViewController~iphone.m in Sources */,
57701742178B0A6900B99793 /* SlideShowSwipeInList~iphone.m in Sources */,
57DC7012178E16A40050FC58 /* UIView+FadeInFadeOut.m in Sources */,
diff --git a/ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.h b/ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.h
new file mode 100644
index 000000000000..22ab369db3cd
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.h
@@ -0,0 +1,14 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+#import "LibONavigationController.h"
+
+@interface autoDismissKeyboardNavigationViewController : LibONavigationController
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.m b/ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.m
new file mode 100644
index 000000000000..6ba2528cff7d
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/AutoDismissKeyboardNavigationViewController.m
@@ -0,0 +1,43 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "autoDismissKeyboardNavigationViewController.h"
+
+@interface autoDismissKeyboardNavigationViewController ()
+
+@end
+
+@implementation autoDismissKeyboardNavigationViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view.
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (BOOL)disablesAutomaticKeyboardDismissal
+{
+ return NO;
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/NSString+Base64.h b/ios/iosremote/iosremote/Categories/NSString+Base64.h
new file mode 100644
index 000000000000..f222423322da
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/NSString+Base64.h
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <Foundation/Foundation.h>
+
+
+@interface NSData (Base64)
+
++(id)dataWithBase64String:(NSString *)base64String;
+
+@end \ No newline at end of file
diff --git a/ios/iosremote/iosremote/Categories/NSString+Base64.m b/ios/iosremote/iosremote/Categories/NSString+Base64.m
new file mode 100644
index 000000000000..0adb0a2d4d8c
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/NSString+Base64.m
@@ -0,0 +1,23 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "NSString+Base64.h"
+
+@implementation NSData(Base64)
+
++ (id) dataWithBase64String:(NSString *)base64Encoding
+{
+ if ([base64Encoding length] % 4 != 0)
+ return nil;
+
+ NSString *plist = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><plist version=\"1.0\"><data>%@</data></plist>", base64Encoding];
+ return [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSASCIIStringEncoding] options:0 format:NULL error:NULL];
+}
+
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.h b/ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.h
new file mode 100644
index 000000000000..70935f9c30c2
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.h
@@ -0,0 +1,15 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+
+#import <UIKit/UIKit.h>
+
+@interface UIBarButtonItem (Theme)
++ (UIBarButtonItem *)themedDoneButtonWithTarget:(id)target andSelector:(SEL)selector;
++ (UIBarButtonItem *)themedBackButtonWithTarget:(id)target andSelector:(SEL)selector;
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.m b/ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.m
new file mode 100644
index 000000000000..ccc64150eef6
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIBarButtonItem+Theme.m
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+
+#import "UIBarButtonItem+Theme.h"
+
+@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;
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIImage+Resize.m b/ios/iosremote/iosremote/Categories/UIImage+Resize.m
new file mode 100644
index 000000000000..beed2360f31a
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIImage+Resize.m
@@ -0,0 +1,186 @@
+// UIImage+Resize.m
+// Created by Trevor Harmon on 8/5/09.
+// Free for personal or commercial use, with or without modification.
+// No warranty is expressed or implied.
+
+#import "UIImage+Resize.h"
+
+// Private helper methods
+@interface UIImage ()
+- (UIImage *)resizedImage:(CGSize)newSize
+ transform:(CGAffineTransform)transform
+ drawTransposed:(BOOL)transpose
+ interpolationQuality:(CGInterpolationQuality)quality;
+- (CGAffineTransform)transformForOrientation:(CGSize)newSize;
+@end
+
+@implementation UIImage (Resize)
+
+// Returns a copy of this image that is cropped to the given bounds.
+// The bounds will be adjusted using CGRectIntegral.
+// This method ignores the image's imageOrientation setting.
+- (UIImage *)croppedImage:(CGRect)bounds {
+ CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
+ UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
+ CGImageRelease(imageRef);
+ return croppedImage;
+}
+
+// Returns a copy of this image that is squared to the thumbnail size.
+// If transparentBorder is non-zero, a transparent border of the given size will be added around the edges of the thumbnail. (Adding a transparent border of at least one pixel in size has the side-effect of antialiasing the edges of the image when rotating it using Core Animation.)
+- (UIImage *)thumbnailImage:(NSInteger)thumbnailSize
+ transparentBorder:(NSUInteger)borderSize
+ cornerRadius:(NSUInteger)cornerRadius
+ interpolationQuality:(CGInterpolationQuality)quality {
+ UIImage *resizedImage = [self resizedImageWithContentMode:UIViewContentModeScaleAspectFill
+ bounds:CGSizeMake(thumbnailSize, thumbnailSize)
+ interpolationQuality:quality];
+
+ // Crop out any part of the image that's larger than the thumbnail size
+ // The cropped rect must be centered on the resized image
+ // Round the origin points so that the size isn't altered when CGRectIntegral is later invoked
+ CGRect cropRect = CGRectMake(round((resizedImage.size.width - thumbnailSize) / 2),
+ round((resizedImage.size.height - thumbnailSize) / 2),
+ thumbnailSize,
+ thumbnailSize);
+ UIImage *croppedImage = [resizedImage croppedImage:cropRect];
+
+ UIImage *transparentBorderImage = borderSize ? [croppedImage transparentBorderImage:borderSize] : croppedImage;
+
+ return [transparentBorderImage roundedCornerImage:cornerRadius borderSize:borderSize];
+}
+
+// Returns a rescaled copy of the image, taking into account its orientation
+// The image will be scaled disproportionately if necessary to fit the bounds specified by the parameter
+- (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality {
+ BOOL drawTransposed;
+
+ switch (self.imageOrientation) {
+ case UIImageOrientationLeft:
+ case UIImageOrientationLeftMirrored:
+ case UIImageOrientationRight:
+ case UIImageOrientationRightMirrored:
+ drawTransposed = YES;
+ break;
+
+ default:
+ drawTransposed = NO;
+ }
+
+ return [self resizedImage:newSize
+ transform:[self transformForOrientation:newSize]
+ drawTransposed:drawTransposed
+ interpolationQuality:quality];
+}
+
+// Resizes the image according to the given content mode, taking into account the image's orientation
+- (UIImage *)resizedImageWithContentMode:(UIViewContentMode)contentMode
+ bounds:(CGSize)bounds
+ interpolationQuality:(CGInterpolationQuality)quality {
+ CGFloat horizontalRatio = bounds.width / self.size.width;
+ CGFloat verticalRatio = bounds.height / self.size.height;
+ CGFloat ratio;
+
+ switch (contentMode) {
+ case UIViewContentModeScaleAspectFill:
+ ratio = MAX(horizontalRatio, verticalRatio);
+ break;
+
+ case UIViewContentModeScaleAspectFit:
+ ratio = MIN(horizontalRatio, verticalRatio);
+ break;
+
+ default:
+ [NSException raise:NSInvalidArgumentException format:@"Unsupported content mode: %d", contentMode];
+ }
+
+ CGSize newSize = CGSizeMake(self.size.width * ratio, self.size.height * ratio);
+
+ return [self resizedImage:newSize interpolationQuality:quality];
+}
+
+#pragma mark -
+#pragma mark Private helper methods
+
+// Returns a copy of the image that has been transformed using the given affine transform and scaled to the new size
+// The new image's orientation will be UIImageOrientationUp, regardless of the current image's orientation
+// If the new size is not integral, it will be rounded up
+- (UIImage *)resizedImage:(CGSize)newSize
+ transform:(CGAffineTransform)transform
+ drawTransposed:(BOOL)transpose
+ interpolationQuality:(CGInterpolationQuality)quality {
+ CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
+ CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width);
+ CGImageRef imageRef = self.CGImage;
+
+ // Build a context that's the same dimensions as the new size
+ CGContextRef bitmap = CGBitmapContextCreate(NULL,
+ newRect.size.width,
+ newRect.size.height,
+ CGImageGetBitsPerComponent(imageRef),
+ 0,
+ CGImageGetColorSpace(imageRef),
+ CGImageGetBitmapInfo(imageRef));
+
+ // Rotate and/or flip the image if required by its orientation
+ CGContextConcatCTM(bitmap, transform);
+
+ // Set the quality level to use when rescaling
+ CGContextSetInterpolationQuality(bitmap, quality);
+
+ // Draw into the context; this scales the image
+ CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef);
+
+ // Get the resized image from the context and a UIImage
+ CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
+ UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
+
+ // Clean up
+ CGContextRelease(bitmap);
+ CGImageRelease(newImageRef);
+
+ return newImage;
+}
+
+// Returns an affine transform that takes into account the image orientation when drawing a scaled image
+- (CGAffineTransform)transformForOrientation:(CGSize)newSize {
+ CGAffineTransform transform = CGAffineTransformIdentity;
+
+ switch (self.imageOrientation) {
+ case UIImageOrientationDown: // EXIF = 3
+ case UIImageOrientationDownMirrored: // EXIF = 4
+ transform = CGAffineTransformTranslate(transform, newSize.width, newSize.height);
+ transform = CGAffineTransformRotate(transform, M_PI);
+ break;
+
+ case UIImageOrientationLeft: // EXIF = 6
+ case UIImageOrientationLeftMirrored: // EXIF = 5
+ transform = CGAffineTransformTranslate(transform, newSize.width, 0);
+ transform = CGAffineTransformRotate(transform, M_PI_2);
+ break;
+
+ case UIImageOrientationRight: // EXIF = 8
+ case UIImageOrientationRightMirrored: // EXIF = 7
+ transform = CGAffineTransformTranslate(transform, 0, newSize.height);
+ transform = CGAffineTransformRotate(transform, -M_PI_2);
+ break;
+ }
+
+ switch (self.imageOrientation) {
+ case UIImageOrientationUpMirrored: // EXIF = 2
+ case UIImageOrientationDownMirrored: // EXIF = 4
+ transform = CGAffineTransformTranslate(transform, newSize.width, 0);
+ transform = CGAffineTransformScale(transform, -1, 1);
+ break;
+
+ case UIImageOrientationLeftMirrored: // EXIF = 5
+ case UIImageOrientationRightMirrored: // EXIF = 7
+ transform = CGAffineTransformTranslate(transform, newSize.height, 0);
+ transform = CGAffineTransformScale(transform, -1, 1);
+ break;
+ }
+
+ return transform;
+}
+
+@end \ No newline at end of file
diff --git a/ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.h b/ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.h
new file mode 100644
index 000000000000..5f8ca7398bbf
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.h
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <Foundation/Foundation.h>
+
+@interface UIImageView (setImageAnimated)
+
+- (void) setImage:(UIImage *)image animated:(BOOL) animated Duration:(double)duration;
+- (void) setImage:(UIImage *)image animated:(BOOL) animated;
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.m b/ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.m
new file mode 100644
index 000000000000..3a1464b90967
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIImageView+setImageAnimated.m
@@ -0,0 +1,30 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "UIImageView+setImageAnimated.h"
+
+@implementation UIImageView (setImageAnimated)
+
+- (void) setImage:(UIImage *)image animated:(BOOL) animated Duration:(double)duration
+{
+ if (animated) {
+ [UIView transitionWithView:self
+ duration:duration
+ options:UIViewAnimationOptionTransitionCrossDissolve
+ animations:^{
+ self.image = image;
+ } completion:nil];
+ } else
+ [self setImage:image];
+}
+
+- (void) setImage:(UIImage *)image animated:(BOOL) animated
+{
+ [self setImage:image animated:animated Duration:0.5];
+}
+@end
diff --git a/ios/iosremote/iosremote/Categories/UINavigationController+Theme.h b/ios/iosremote/iosremote/Categories/UINavigationController+Theme.h
new file mode 100644
index 000000000000..bcadeee1f37f
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UINavigationController+Theme.h
@@ -0,0 +1,13 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface UINavigationController (Theme)
+- (void)loadTheme;
+@end
diff --git a/ios/iosremote/iosremote/Categories/UINavigationController+Theme.m b/ios/iosremote/iosremote/Categories/UINavigationController+Theme.m
new file mode 100644
index 000000000000..bb387b892b68
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UINavigationController+Theme.m
@@ -0,0 +1,22 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#import "UINavigationController+Theme.h"
+
+@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;
+}
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.h b/ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.h
new file mode 100644
index 000000000000..6cf8fbd47f48
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.h
@@ -0,0 +1,13 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <Foundation/Foundation.h>
+
+@interface UIView (Transition)
+-(void)fadeInfadeOutwithDuration:(double)duration maxAlpha:(double)maxAlpha;
+@end \ No newline at end of file
diff --git a/ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.m b/ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.m
new file mode 100644
index 000000000000..bffa4f8487c7
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIView+FadeInFadeOut.m
@@ -0,0 +1,33 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "UIView+FadeInFadeOut.h"
+
+@implementation UIView(Transition)
+-(void)fadeInfadeOutwithDuration:(double)duration maxAlpha:(double)maxAlpha
+{
+ if (self.isHidden){
+ [self setHidden:NO];
+ self.alpha = 0.0;
+ [UIView animateWithDuration:duration animations:^{
+ self.alpha = maxAlpha;
+ } completion:^(BOOL finished) {
+ if (!finished) {
+ [self setHidden:NO];
+ }
+ }];
+ } else {
+ self.alpha = maxAlpha;
+ [UIView animateWithDuration:duration animations:^{
+ self.alpha = 0.0f;
+ } completion:^(BOOL finished) {
+ [self setHidden:YES];
+ }];
+ }
+}
+@end \ No newline at end of file
diff --git a/ios/iosremote/iosremote/Categories/UIView+Shadowing.h b/ios/iosremote/iosremote/Categories/UIView+Shadowing.h
new file mode 100644
index 000000000000..f7f28697fefb
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIView+Shadowing.h
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface UIView (Shadowing)
+
+- (void) setShadow;
+- (void) setShadowLight;
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIView+Shadowing.m b/ios/iosremote/iosremote/Categories/UIView+Shadowing.m
new file mode 100644
index 000000000000..40dfa3d3ed13
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIView+Shadowing.m
@@ -0,0 +1,34 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "UIView+Shadowing.h"
+#import <QuartzCore/CALayer.h>
+
+@implementation UIView (Shadowing)
+
+- (void) setShadow
+{
+ self.layer.shadowColor = [[UIColor blackColor] CGColor];
+ self.layer.shadowOpacity = 0.5;
+ self.layer.shadowRadius = 4.0;
+ self.layer.shadowOffset = CGSizeMake(3.0f, 3.0f);
+ self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
+ self.clipsToBounds = NO;
+}
+
+- (void) setShadowLight
+{
+ self.layer.shadowColor = [[UIColor blackColor] CGColor];
+ self.layer.shadowOpacity = 0.3;
+ self.layer.shadowRadius = 3.0;
+ self.layer.shadowOffset = CGSizeMake(4.0f, 3.0f);
+ self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
+ self.clipsToBounds = NO;
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.h b/ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.h
new file mode 100644
index 000000000000..57ed9bc86cfd
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.h
@@ -0,0 +1,28 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+
+@class Timer;
+
+typedef enum TitleLabelOwner : NSInteger TitleLabelOwner;
+enum TitleLabelOwner : NSInteger {
+ STOPWATCH,
+ TIMER
+};
+
+TitleLabelOwner owner;
+
+@interface UIViewController (LibOStyling)
+
+- (void)setTitle:(NSString *)title sender:(id)sender;
+- (void)setTitle:(NSString *)title;
+
+- (void)setOwner:(TitleLabelOwner) aOwner;
+
+@end
diff --git a/ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.m b/ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.m
new file mode 100644
index 000000000000..6219e74a4b6c
--- /dev/null
+++ b/ios/iosremote/iosremote/Categories/UIViewController+LibOStyling.m
@@ -0,0 +1,72 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "UIViewController+LibOStyling.h"
+#import "Timer.h"
+#import "stopWatch.h"
+
+@implementation UIViewController (LibOStyling)
+
+
+- (void)setTitle:(NSString *)title
+{
+ UILabel *titleView = (UILabel *)self.navigationItem.titleView;
+ if (!titleView) {
+ titleView = [[UILabel alloc] initWithFrame:CGRectZero];
+ titleView.backgroundColor = [UIColor clearColor];
+ titleView.font = kAppTitleFont;
+ titleView.shadowColor = nil;
+
+ titleView.textColor = [UIColor blackColor];
+
+ self.navigationItem.titleView = titleView;
+ }
+ titleView.text = title;
+ [titleView sizeToFit];
+}
+
+- (void)setOwner:(TitleLabelOwner) aOwner
+{
+ owner = aOwner;
+}
+
+- (void)setTitle:(NSString *)title sender:(id)sender
+{
+ switch (owner) {
+ case STOPWATCH:
+ if (![sender isKindOfClass:[StopWatch class]])
+ return;
+ break;
+ case TIMER:
+ if (![sender isKindOfClass:[Timer class]])
+ return;
+ break;
+ default:
+ break;
+ }
+ UILabel *titleView = (UILabel *)self.navigationItem.titleView;
+ if (!titleView) {
+ titleView = [[UILabel alloc] initWithFrame:CGRectZero];
+ titleView.backgroundColor = [UIColor clearColor];
+ titleView.font = kAppTitleFont;
+ titleView.shadowColor = nil;
+
+ titleView.textColor = [UIColor blackColor];
+
+ self.navigationItem.titleView = titleView;
+ }
+ titleView.text = title;
+ [titleView sizeToFit];
+}
+
+- (void) handleBack
+{
+ [self.navigationController popViewControllerAnimated:YES];
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/AboutViewController.h b/ios/iosremote/iosremote/Classes/AboutViewController.h
new file mode 100644
index 000000000000..dd26ff58c535
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/AboutViewController.h
@@ -0,0 +1,15 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface AboutViewController : UIViewController
+
+@property (weak, nonatomic) IBOutlet UIWebView *aboutWebView;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/AboutViewController.m b/ios/iosremote/iosremote/Classes/AboutViewController.m
new file mode 100644
index 000000000000..20bdf2c233bf
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/AboutViewController.m
@@ -0,0 +1,48 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "AboutViewController.h"
+
+@interface AboutViewController ()
+
+@end
+
+@implementation AboutViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Back", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
+ [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ self.navigationItem.leftBarButtonItem = backButton;
+
+ NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"licenses" ofType:@"html" inDirectory:nil]];
+ [self.aboutWebView loadRequest:[NSURLRequest requestWithURL:url]];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self setAboutWebView:nil];
+ [super viewDidUnload];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/AppDelegate.h b/ios/iosremote/iosremote/Classes/AppDelegate.h
new file mode 100644
index 000000000000..fe5d6e6ae27c
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/AppDelegate.h
@@ -0,0 +1,21 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+#import <CoreMotion/CoreMotion.h>
+
+@class ViewController;
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate> {
+}
+
+@property (strong, nonatomic) UIWindow *window;
+
+- (void) reconfigure;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/AppDelegate.m b/ios/iosremote/iosremote/Classes/AppDelegate.m
new file mode 100644
index 000000000000..d239acf8e8c2
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/AppDelegate.m
@@ -0,0 +1,107 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "AppDelegate.h"
+#import "UINavigationController+Theme.h"
+
+#define UIColorFromRGB(rgbValue) [UIColor \
+colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
+green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \
+blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
+
+@implementation AppDelegate
+
+@synthesize window = _window;
+
+- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
+{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ return UIInterfaceOrientationMaskAll;
+ else
+ return UIInterfaceOrientationMaskPortrait;
+}
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ [TestFlight takeOff:@"29f8d6f9-de56-4866-bd70-15b5305f812e"];
+
+ NSString *defaultsPath = [[NSBundle mainBundle] pathForResource:@"UserDefaults"
+ ofType:@"plist"];
+ NSDictionary *appDefaults = [NSDictionary dictionaryWithContentsOfFile:defaultsPath];
+ [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
+
+ NSString *defaultSettingsPath = [[NSBundle mainBundle] pathForResource:@"Root"
+ ofType:@"plist"];
+ NSDictionary *appDefaultSettings = [NSDictionary dictionaryWithContentsOfFile:defaultSettingsPath];
+ [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultSettings];
+
+ [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
+ setBackgroundImage:[UIImage imageNamed:@"navBarButtonNormal"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+
+ NSDictionary *attributes = [NSDictionary dictionaryWithObjects:
+ [NSArray arrayWithObjects: [UIFont boldSystemFontOfSize:15], kTintColor, [UIColor clearColor], nil]
+ forKeys: [NSArray arrayWithObjects:UITextAttributeFont, UITextAttributeTextColor, UITextAttributeTextShadowColor, nil]];
+ [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:attributes
+ forState:UIControlStateNormal];
+ attributes = [NSDictionary dictionaryWithObjects:
+ [NSArray arrayWithObjects: kAppTextFont, [UIColor grayColor], [UIColor clearColor], nil]
+ forKeys: [NSArray arrayWithObjects:UITextAttributeFont, UITextAttributeTextColor, UITextAttributeTextShadowColor, nil]];
+ [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
+ forState:UIControlStateHighlighted];
+
+ if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
+ {
+ UIPageControl *pageControl = [UIPageControl appearance];
+ pageControl.pageIndicatorTintColor = UIColorFromRGB(0x2980b9);
+ pageControl.currentPageIndicatorTintColor = UIColorFromRGB(0x1abc9c);
+ }
+
+ [self reconfigure];
+
+ return YES;
+}
+
+- (void) reconfigure
+{
+ kDefaultTimerWidget = [[NSUserDefaults standardUserDefaults] integerForKey:@"DEFAULT_TIMING_WIDGET"];
+ kCountDownTimerDefaultDuration = [[NSUserDefaults standardUserDefaults] integerForKey:@"TIMER_DEFAULT_DURATION"];
+ kStopwatchAutoStart = [[NSUserDefaults standardUserDefaults] boolForKey:@"STOPWATCH_AUTO_START"];
+ kCountDownTimerAutoStart = [[NSUserDefaults standardUserDefaults] boolForKey:@"TIMER_AUTO_START"];
+ kCountDownTimerVibration = [[NSUserDefaults standardUserDefaults] boolForKey:@"TIMER_VIBRATION"];
+
+ NSLog(@"Setting kCountDownTimerDefaultDuration to %d", kCountDownTimerDefaultDuration);
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/AppDelegate~ipad.h b/ios/iosremote/iosremote/Classes/AppDelegate~ipad.h
new file mode 100644
index 000000000000..08493813f35d
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/AppDelegate~ipad.h
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "AppDelegate.h"
+
+@class BasePresentationViewController;
+@class MainSplitViewController;
+
+@interface AppDelegate_ipad : AppDelegate
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/AppDelegate~ipad.m b/ios/iosremote/iosremote/Classes/AppDelegate~ipad.m
new file mode 100644
index 000000000000..f0de9dd4e353
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/AppDelegate~ipad.m
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "AppDelegate~ipad.h"
+#import "SlideShowSwipeInList~ipad.h"
+#import "MainSplitViewController.h"
+#import "BasePresentationViewController.h"
+
+@implementation AppDelegate_ipad
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/BasePresentationViewController.h b/ios/iosremote/iosremote/Classes/BasePresentationViewController.h
new file mode 100644
index 000000000000..16fec5c5aece
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/BasePresentationViewController.h
@@ -0,0 +1,58 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+#import "SlideShow.h"
+#import "SlideShowPreviewViewController~ipad.h"
+
+@interface BasePresentationViewController : UIViewController <UISplitViewControllerDelegate, UITableViewDelegate, UITableViewDataSource, AsyncLoadHorizontalTableDelegate>
+
+@property (weak, nonatomic) IBOutlet UIView *NotesView;
+@property (weak, nonatomic) IBOutlet UIWebView *NoteWebView;
+@property (weak, nonatomic) IBOutlet UIView *movingPointer;
+@property (weak, nonatomic) IBOutlet UIImageView *currentSlideImageView;
+@property (weak, nonatomic) IBOutlet UILabel *slideNumber;
+
+@property (weak, nonatomic) IBOutlet UIButton *previousButton;
+@property (weak, nonatomic) IBOutlet UIButton *nextButton;
+
+@property (strong, nonatomic) UIViewController * initialNavController;
+
+// Split view controller
+- (void) hideMaster:(BOOL)hideState;
+@property BOOL masterIsHiddenWhenLandscape;
+
+// Welcome page
+-(void)startConnectionModal:(id)sender;
+- (void) setWelcomePageVisible:(BOOL)visible;
+@property (strong, nonatomic) UIView *welcome_blocking_page;
+
+@property (weak, nonatomic) IBOutlet UITableView *horizontalTableView;
+
+@property (weak, nonatomic) IBOutlet UIButton *gearButton;
+- (IBAction)popOverUp:(id)sender;
+
+// Stopwatch/Timer
+
+@property (weak, nonatomic) IBOutlet UIButton *startButton;
+@property (weak, nonatomic) IBOutlet UIButton *clearButton;
+@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
+
+@property (weak, nonatomic) IBOutlet UIButton *timerStartButton;
+@property (weak, nonatomic) IBOutlet UIButton *timerClearButton;
+@property (weak, nonatomic) IBOutlet UIButton *timerSetTimeButton;
+@property (weak, nonatomic) IBOutlet UILabel *timerTimeLabel;
+
+@property (weak, nonatomic) IBOutlet UIView *stopWatchView;
+@property (weak, nonatomic) IBOutlet UIView *timerView;
+@property (weak, nonatomic) IBOutlet UIScrollView *stopWatchTimerScrollView;
+
+//Reconnection
+- (void) didReceiveDisconnection;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/BasePresentationViewController.m b/ios/iosremote/iosremote/Classes/BasePresentationViewController.m
new file mode 100644
index 000000000000..8f58f5314602
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/BasePresentationViewController.m
@@ -0,0 +1,582 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "BasePresentationViewController.h"
+#import "SlideShow.h"
+#import "CommunicationManager.h"
+#import "CommandTransmitter.h"
+#import "CommandInterpreter.h"
+#import "HorizontalSlideCell.h"
+#import "ServerListViewController.h"
+#import "MainSplitViewController.h"
+#import "stopWatch.h"
+#import "Timer.h"
+#import "PopoverView.h"
+#import "UIView+Shadowing.h"
+#import "LibONavigationController.h"
+#import "AppDelegate.h"
+#import "ControlVariables.h"
+
+#import <QuartzCore/QuartzCore.h>
+#import <CoreText/CoreText.h>
+#import <CoreMotion/CoreMotion.h>
+
+#define CURRENT_SLIDE_IMAGEVIEW 19
+#define CURRENT_SLIDE_NOTES 18
+
+@interface BasePresentationViewController () <PopoverViewDelegate, TimerDelegate, UIPopoverControllerDelegate>
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, strong) id slideShowImageNoteReadyObserver;
+@property (nonatomic, strong) id slideShowFinishedObserver;
+@property (nonatomic, strong) id slideChangedObserver;
+
+@property (nonatomic, strong) StopWatch * stopWatch;
+@property (nonatomic, strong) Timer * timer;
+@property (nonatomic, strong) UIPopoverController * popoverTimePickerController;
+
+@end
+
+@implementation BasePresentationViewController
+@synthesize masterIsHiddenWhenLandscape = _masterIsHiddenWhenLandscape;
+
+@synthesize comManager = _comManager;
+@synthesize slideShowImageNoteReadyObserver = _slideShowImageNoteReadyObserver;
+@synthesize slideShowFinishedObserver = _slideShowFinishedObserver;
+@synthesize slideChangedObserver = _slideChangedObserver;
+@synthesize popoverTimePickerController = _popoverTimePickerController;
+
+#pragma mark - UITableView delegate
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+ return [self.comManager.interpreter.slideShow size];
+}
+
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ static NSString *cellIdentifier = @"HorizontalTableSlideCell";
+
+ HorizontalSlideCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
+
+ if (cell == nil)
+ {
+ cell = [[HorizontalSlideCell alloc] initWithFrame:CGRectMake(0, 0, kCellWidth, kCellHeight)];
+ }
+
+ cell.numberLabel.text =
+ [NSString stringWithFormat:@"%u", indexPath.row+1];
+
+ [cell setTag:-indexPath.row - 1];
+ [cell.thumbnail setTag:1];
+
+ [cell.thumbnail setShadow];
+
+ [self.comManager.interpreter.slideShow getContentAtIndex:indexPath.row forView:cell];
+
+ return cell;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ if (self.horizontalTableView.isHidden)
+ return;
+ [[(HorizontalSlideCell *)[self.horizontalTableView cellForRowAtIndexPath:indexPath] numberLabel] setBackgroundColor:kHorizontalTableCellHighlightedBackgroundColor];
+ [self.comManager.transmitter gotoSlide:indexPath.row];
+}
+
+#pragma mark -
+#pragma iOS5 autorotate
+
+- (BOOL) shouldAutorotate
+{
+ return YES;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ return YES;
+}
+
+- (NSUInteger)supportedInterfaceOrientations {
+ return UIInterfaceOrientationMaskAll;
+}
+
+#pragma mark -
+#pragma SplitView hide master view tweak
+
+// FIXME This is a hack, consider replace it when a more proper method is available
+-(void)hideMaster:(BOOL)hideState
+{
+ NSLog(@"hideMasterNow");
+ _masterIsHiddenWhenLandscape = hideState;
+
+ [self.splitViewController.view setNeedsLayout];
+ self.splitViewController.delegate = nil;
+ self.splitViewController.delegate = self;
+
+ [self.splitViewController willRotateToInterfaceOrientation:[UIApplication sharedApplication].statusBarOrientation duration:0];
+}
+
+- (BOOL) splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
+{
+ if (UIInterfaceOrientationIsLandscape(orientation)){
+ return self.masterIsHiddenWhenLandscape;
+ }
+ return UIInterfaceOrientationIsPortrait(orientation);
+}
+
+#pragma mark - Pointer
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+
+ UITouch *touch = [[event allTouches] anyObject];
+ CGPoint loc = [touch locationInView:self.currentSlideImageView];
+ if (loc.x >= 0 && loc.x <= self.currentSlideImageView.frame.size.width
+ && loc.y >= 0 && loc.y <= self.currentSlideImageView.frame.size.height){
+
+ [UIView animateWithDuration:0.2 animations:^{
+ [self.previousButton setAlpha:0];
+ [self.nextButton setAlpha:0];
+ }];
+
+ CGPoint pointerInPercentage;
+ pointerInPercentage.x = loc.x / self.currentSlideImageView.frame.size.width;
+ pointerInPercentage.y = loc.y / self.currentSlideImageView.frame.size.height;
+ [self.comManager.transmitter setPointerVisibleAt:pointerInPercentage];
+
+ CGPoint p;
+ p.x = loc.x + self.currentSlideImageView.frame.origin.x;
+ p.y = loc.y + self.currentSlideImageView.frame.origin.y;
+ self.movingPointer.center = p;
+ [self.movingPointer setHidden:NO];
+ }
+}
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ static int count = 0;
+ if (count < 2){
+ ++count;
+ return;
+ }
+ count = 0;
+
+ UITouch *touch = [[event allTouches] anyObject];
+ CGPoint loc = [touch locationInView:self.currentSlideImageView];
+ if (loc.x >= 0 && loc.x <= self.currentSlideImageView.frame.size.width
+ && loc.y >= self.movingPointer.frame.size.height && loc.y <= self.currentSlideImageView.frame.size.height - self.movingPointer.frame.size.height)
+ {
+ [UIView animateWithDuration:0.2 animations:^{
+ [self.previousButton setAlpha:0];
+ [self.nextButton setAlpha:0];
+ }];
+
+ CGPoint pointerInPercentage;
+ pointerInPercentage.x = loc.x / self.currentSlideImageView.frame.size.width;
+ pointerInPercentage.y = loc.y / self.currentSlideImageView.frame.size.height;
+ [self.comManager.transmitter pointerCoordination:pointerInPercentage];
+
+ CGPoint p;
+ p.x = loc.x + self.currentSlideImageView.frame.origin.x;
+ p.y = loc.y + self.currentSlideImageView.frame.origin.y;
+ self.movingPointer.center = p;
+ }
+}
+
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [self.movingPointer setHidden:YES];
+ [self.comManager.transmitter setPointerDismissed];
+
+ [UIView animateWithDuration:0.2 animations:^{
+ [self.previousButton setAlpha:0.2];
+ [self.nextButton setAlpha:0.2];
+ }];
+}
+
+# pragma mark - welcome page
+
+-(void)startConnectionModal:(id)sender
+{
+ UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"iPad_autosize"
+ bundle: nil];
+ ServerListViewController * slvc = [mainStoryboard instantiateViewControllerWithIdentifier:@"serverList"];
+ self.initialNavController = slvc;
+ slvc.modalPresentationStyle = UIModalPresentationFormSheet;
+ slvc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
+ [self presentViewController:slvc animated:YES completion:^{}];
+}
+
+# pragma mark - system defaults
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation
+ duration:(NSTimeInterval)duration
+{
+ if (toOrientation == UIInterfaceOrientationPortrait ||
+ toOrientation == UIInterfaceOrientationPortraitUpsideDown){
+ if (self.horizontalTableView.isHidden!=NO) {
+ [self.horizontalTableView setHidden:NO];
+ }
+ [self.horizontalTableView reloadData];
+ }
+ else if (toOrientation == UIInterfaceOrientationLandscapeLeft ||
+ toOrientation == UIInterfaceOrientationLandscapeRight)
+ [self.horizontalTableView setHidden:YES];
+}
+
+- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
+{
+ if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
+ [UIView animateWithDuration:0.25 animations:^{
+ self.NotesView.frame = CGRectMake(-15.0,
+ /*self.NotesView.frame.origin.y - self.horizontalTableView.frame.size.height*/ 466.0,
+ self.NotesView.frame.size.width,
+ /*self.NotesView.frame.size.height + self.horizontalTableView.frame.size.height*/ 176.0);
+ self.horizontalTableView.bounds = CGRectMake(0, 0, 768, 0);
+ }];
+ } else {
+ [UIView animateWithDuration:0.25 animations:^{
+ self.NotesView.frame = CGRectMake(-13.0,
+ /*self.NotesView.frame.origin.y - self.horizontalTableView.frame.size.height*/ 595.0,
+ 794.0,
+ /*self.NotesView.frame.size.height + self.horizontalTableView.frame.size.height*/ 303.0);
+ self.horizontalTableView.bounds = CGRectMake(0, 0, 129, 768);
+ } completion:nil];
+ }
+ [self.popoverTimePickerController dismissPopoverAnimated:YES];
+}
+
+- (SlideShow *)slideshow
+{
+ return self.comManager.interpreter.slideShow;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.welcome_blocking_page = [[UIView alloc] initWithFrame:self.view.bounds];
+ self.welcome_blocking_page.backgroundColor = [UIColor orangeColor];
+ self.welcome_blocking_page.autoresizingMask = UIViewAutoresizingFlexibleHeight |
+ UIViewAutoresizingFlexibleWidth;
+ [self.view addSubview:self.welcome_blocking_page];
+
+ self.masterIsHiddenWhenLandscape = YES;
+ [self.currentSlideImageView setTag:CURRENT_SLIDE_IMAGEVIEW];
+ [self.NoteWebView setTag:CURRENT_SLIDE_NOTES];
+ self.slideshow.delegate = self;
+ self.comManager = [CommunicationManager sharedComManager];
+
+ if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
+ [self.horizontalTableView setHidden:YES];
+ }
+ self.comManager.interpreter.slideShow.delegate = self;
+ self.movingPointer.layer.cornerRadius = 3;
+
+ self.horizontalTableView.showsVerticalScrollIndicator = NO;
+ self.horizontalTableView.showsHorizontalScrollIndicator = NO;
+ self.horizontalTableView.transform = CGAffineTransformMakeRotation(-M_PI * 0.5);
+ [self.horizontalTableView setFrame:CGRectMake(0, 462, kTableLength - kRowHorizontalPadding, kCellHeight)];
+
+ self.horizontalTableView.rowHeight = kCellWidth;
+
+ self.horizontalTableView.backgroundColor = [UIColor colorWithRed:.674509804 green:.729411765 blue:.760784314 alpha:1.0];
+
+ self.horizontalTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+
+ self.slideChangedObserver =[[NSNotificationCenter defaultCenter] addObserverForName:MSG_SLIDE_CHANGED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ if ([self.horizontalTableView numberOfRowsInSection:0] > 0){
+ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.slideshow.currentSlide inSection:0];
+ [self.horizontalTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
+ [[(HorizontalSlideCell *)[self.horizontalTableView cellForRowAtIndexPath:indexPath] numberLabel] setBackgroundColor:kHorizontalTableCellHighlightedBackgroundColor];
+ [self.horizontalTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
+ }
+ }];
+ self.stopWatch = [[StopWatch alloc] initWithStartButton:self.startButton ClearButton:self.clearButton TimeLabel:self.timeLabel];
+ self.timer = [[Timer alloc] initWithStartButton:self.timerStartButton ClearButton:self.timerClearButton SetTimeButton:self.timerSetTimeButton TimeLabel:self.timerTimeLabel];
+ [self.stopWatchView setShadowLight];
+ [self.timerView setShadowLight];
+ self.timer.delegate = self;
+ self.stopWatchTimerScrollView.contentSize = CGSizeMake(1240, 62);
+ [self.gearButton setShadowLight];
+}
+
+- (void)viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+
+ [UIView animateWithDuration:0.2 delay:1 options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction) animations:^{
+ [self.previousButton setAlpha:0.2];
+ [self.nextButton setAlpha:0.2];
+ } completion:nil];
+
+ [UIView animateWithDuration:0.4 delay:0 options:(UIViewAnimationOptionCurveEaseIn) animations:^{
+ [self.welcome_blocking_page setAlpha:1];
+ } completion:nil];
+
+ if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
+ [UIView animateWithDuration:0.25 animations:^{
+ self.NotesView.frame = CGRectMake(-15.0,
+ /*self.NotesView.frame.origin.y - self.horizontalTableView.frame.size.height*/ 466.0,
+ self.NotesView.frame.size.width,
+ /*self.NotesView.frame.size.height + self.horizontalTableView.frame.size.height*/ 176.0);
+ }];
+ } else {
+ [UIView animateWithDuration:0.25 animations:^{
+ self.NotesView.frame = CGRectMake(-13.0,
+ /*self.NotesView.frame.origin.y - self.horizontalTableView.frame.size.height*/ 595.0,
+ 794.0,
+ /*self.NotesView.frame.size.height + self.horizontalTableView.frame.size.height*/ 303.0);
+ }];
+ }
+
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+
+ self.slideShowImageNoteReadyObserver =[center addObserverForName:MSG_SLIDE_CHANGED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.currentSlideImageView];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.NoteWebView];
+ NSLog(@"slideShowImageNoteReadyObserver:%u/%u", [self.slideshow currentSlide]+1, [self.slideshow size]);
+ [self.slideNumber setText:[NSString stringWithFormat:@"%u/%u", [self.slideshow currentSlide]+1, [self.slideshow size]]];
+ }];
+
+ self.slideShowFinishedObserver = [center addObserverForName:STATUS_CONNECTED_NOSLIDESHOW
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.stopWatch clear];
+ [self hideMaster:YES];
+ if ([self.comManager.interpreter.slideShow size] == 0)
+ [self setWelcomePageVisible:YES];
+ if (!self.presentedViewController) {
+ // We fire up the retained initialNavController which will bring back the preview view controller page.
+ self.initialNavController.modalPresentationStyle = UIModalPresentationFormSheet;
+ self.initialNavController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
+
+ [self presentViewController:self.initialNavController animated:YES completion:^{}];
+ [self.timer clear];
+ [self.stopWatch clear];
+ }
+ }];
+ [self startConnectionModal:nil];
+}
+
+- (void) setWelcomePageVisible:(BOOL)visible
+{
+ if (!visible) {
+ [self.currentSlideImageView setUserInteractionEnabled:NO];
+
+ [UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
+ self.welcome_blocking_page.alpha = 0.0;
+ } completion:^(BOOL finished) {
+ if (finished) {
+ self.welcome_blocking_page.hidden = YES;
+ [self.currentSlideImageView setUserInteractionEnabled:YES];
+ } else {
+ [self setWelcomePageVisible:visible];
+ [self.currentSlideImageView setUserInteractionEnabled:YES];
+ }
+ if (kStopwatchAutoStart)
+ [self.stopWatch start];
+ if (kCountDownTimerAutoStart)
+ [self.timer start];
+ CGRect frame = self.stopWatchTimerScrollView.frame;
+ frame.origin.x = frame.size.width * kDefaultTimerWidget;
+ frame.origin.y = 0;
+ [self.stopWatchTimerScrollView scrollRectToVisible:frame animated:YES];
+ [self.timer setSecondsLeft:kCountDownTimerDefaultDuration * 60];
+
+ }];
+ self.slideshow.delegate = self;
+ }
+ else {
+ [self.currentSlideImageView setUserInteractionEnabled:NO];
+ self.welcome_blocking_page.hidden = NO;
+
+ [UIView animateWithDuration:0.15 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
+ self.welcome_blocking_page.alpha = 1.0;
+ } completion:nil];
+ }
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+ [super viewDidDisappear:animated];
+ [self.popoverTimePickerController dismissPopoverAnimated:YES];
+}
+
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self.popoverTimePickerController dismissPopoverAnimated:YES];
+ [self setHorizontalTableView:nil];
+ [self setNotesView:nil];
+ [self setNoteWebView:nil];
+ [self setMovingPointer:nil];
+ [self setCurrentSlideImageView:nil];
+ [self setPreviousButton:nil];
+ [self setNextButton:nil];
+ [self setSlideNumber:nil];
+ [self setSlideNumber:nil];
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowFinishedObserver];
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowImageNoteReadyObserver];
+
+ [self setStartButton:nil];
+ [self setClearButton:nil];
+ [self setTimeLabel:nil];
+ [self setGearButton:nil];
+ [self setStopWatchView:nil];
+ [self setTimerView:nil];
+ [self setStopWatchTimerScrollView:nil];
+ [super viewDidUnload];
+}
+
+
+- (IBAction)nextSlideAction:(id)sender {
+
+ [[self.comManager transmitter] nextTransition];
+
+ [UIView animateWithDuration:0.4 delay:0 options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction) animations:^{
+ [self.previousButton setAlpha:0.5];
+ [self.nextButton setAlpha:0.5];
+ } completion:^(BOOL finished) {
+ [UIView animateWithDuration:0.4 delay:1 options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction) animations:^{
+ [self.previousButton setAlpha:0.2];
+ [self.nextButton setAlpha:0.2];
+ } completion:nil];
+ }];
+}
+
+- (IBAction)previousSlideAction:(id)sender {
+
+ [[self.comManager transmitter] previousTransition];
+
+ [UIView animateWithDuration:0.4 delay:0 options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction) animations:^{
+ [self.previousButton setAlpha:0.5];
+ [self.nextButton setAlpha:0.5];
+ } completion:^(BOOL finished) {
+ [UIView animateWithDuration:0.4 delay:1 options:(UIViewAnimationOptionCurveEaseInOut|UIViewAnimationOptionAllowUserInteraction) animations:^{
+ [self.previousButton setAlpha:0.2];
+ [self.nextButton setAlpha:0.2];
+ } completion:nil];
+ }];
+}
+
+static BOOL isBlank = NO;
+#pragma mark - Popover toggle
+- (IBAction)popOverUp:(id)sender {
+ if (!isBlank) {
+ [PopoverView showPopoverAtPoint:self.gearButton.frame.origin inView:self.gearButton.superview withStringArray:
+ [NSArray arrayWithObjects:NSLocalizedString(@"Stop Presentation", @"Popover option"), NSLocalizedString(@"Restart", @"Popover option"), NSLocalizedString(@"Blank Screen", @"Popover option"), nil]
+ delegate:self];
+ } else {
+ [PopoverView showPopoverAtPoint:self.gearButton.frame.origin inView:self.gearButton.superview withStringArray:
+ [NSArray arrayWithObjects:NSLocalizedString(@"Stop Presentation", @"Popover option"), NSLocalizedString(@"Restart", @"Popover option"), NSLocalizedString(@"Resume from blank Screen", @"Popover option"), nil]
+ delegate:self];
+ }
+ [UIView animateWithDuration:0.24 animations:^{
+ [self.gearButton setCenter:CGPointMake(self.gearButton.center.x - 20, self.gearButton.center.y)];
+ }];
+}
+
+- (void)popoverView:(PopoverView *)popoverView didSelectItemAtIndex:(NSInteger)index
+{
+ [popoverView dismiss];
+ switch (index) {
+ case 0:
+ [self.comManager.transmitter stopPresentation];
+ break;
+ case 1:
+ [self.comManager.transmitter gotoSlide:0];
+ break;
+ case 2:
+ if (!isBlank){
+ [self.comManager.transmitter blankScreen];
+ } else {
+ [self.comManager.transmitter resume];
+ }
+ isBlank = !isBlank;
+ break;
+ default:
+ break;
+ }
+}
+
+- (void) popoverViewDidDismiss:(PopoverView *)popoverView
+{
+ [UIView animateWithDuration:0.24 animations:^{
+ [self.gearButton setCenter:CGPointMake(self.gearButton.center.x + 20, self.gearButton.center.y)];
+ }];
+}
+
+#pragma mark - Reconnection
+- (void) didReceiveDisconnection
+{
+ //Dismiss time picker in case that users didn't have the time to tap elsewhere to dismiss it.
+ [self.popoverTimePickerController dismissPopoverAnimated:YES];
+
+ [self dismissViewControllerAnimated:YES completion:^{
+ [self startConnectionModal:nil];
+ }];
+
+ if (self.welcome_blocking_page.isHidden == YES) {
+ [self setWelcomePageVisible:YES];
+ }
+}
+
+#pragma mark TimerDelegate
+
+- (void)changeDate:(UIDatePicker *)sender {
+ [self.timer setSecondsLeft: sender.countDownDuration];
+}
+
+- (void)startTimePickerwithTimer:(Timer *) timer
+{
+ UIViewController* popoverContent = [[UIViewController alloc] init]; //ViewController
+
+ UIView *popoverView = [[UIView alloc] init]; //view
+ popoverView.backgroundColor = [UIColor blackColor];
+
+ UIDatePicker *datePicker=[[UIDatePicker alloc]init];//Date picker
+ datePicker.frame=CGRectMake(0,44,320, 216);
+ datePicker.datePickerMode = UIDatePickerModeCountDownTimer;
+ [datePicker setTag:10];
+ [datePicker addTarget:self action:@selector(changeDate:) forControlEvents:UIControlEventValueChanged];
+ [popoverView addSubview:datePicker];
+
+ popoverContent.view = popoverView;
+ self.popoverTimePickerController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
+ self.popoverTimePickerController.delegate = self;
+
+ [self.popoverTimePickerController setPopoverContentSize:CGSizeMake(320, 264) animated:NO];
+ [self.popoverTimePickerController presentPopoverFromRect:self.timerSetTimeButton.frame inView:self.timerView permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/ControlVariables.h b/ios/iosremote/iosremote/Classes/ControlVariables.h
new file mode 100644
index 000000000000..3db19f6bebc5
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/ControlVariables.h
@@ -0,0 +1,53 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef iosremote_ControlVariables_h
+#define iosremote_ControlVariables_h
+
+// Width (or length before rotation) of the table view embedded within another table view's row
+#define kTableLength 768
+
+// Width of the cells of the embedded table view (after rotation, which means it controls the rowHeight property)
+#define kCellWidth 172
+// Height of the cells of the embedded table view (after rotation, which would be the table's width)
+#define kCellHeight 129
+
+// Padding for the Cell containing the article image and title
+#define kArticleCellVerticalInnerPadding 6
+#define kArticleCellHorizontalInnerPadding 7
+
+// Padding for the title label in an article's cell
+#define kArticleTitleLabelPadding 10
+
+// Vertical padding for the embedded table view within the row
+#define kRowVerticalPadding 1
+// Horizontal padding for the embedded table view within the row
+#define kRowHorizontalPadding 1
+
+// Background color for the horizontal table view (the one embedded inside the rows of our vertical table)
+#define kHorizontalTableBackgroundColor [UIColor blackColor]
+
+// The background color on the horizontal table view for when we select a particular cell
+#define kHorizontalTableSelectedBackgroundColor [UIColor colorWithRed:0.0 green:0.59607843 blue:0.37254902 alpha:1.0]
+
+#define kHorizontalTableCellHighlightedBackgroundColor [UIColor colorWithRed:0 green:0.4745098 blue:0.29019808 alpha:0.9]
+
+#define kTintColor [UIColor orangeColor]
+
+#define kTextTintColor [UIColor colorWithRed:0 green:0.462745098 blue:1 alpha:1.0]
+
+#define kAppTitleFont [UIFont fontWithName:@"HelveticaNeue-Medium" size:20.0f]
+
+#define kAppTextFont [UIFont fontWithName:@"HelveticaNeue-Medium" size:16.0f]
+
+#define kAppSmallTextFont [UIFont fontWithName:@"HelveticaNeue" size:14.0f]
+
+int kDefaultTimerWidget, kCountDownTimerDefaultDuration;
+BOOL kStopwatchAutoStart, kCountDownTimerAutoStart, kCountDownTimerVibration;
+
+#endif
diff --git a/ios/iosremote/iosremote/Classes/EditableTableViewCell.h b/ios/iosremote/iosremote/Classes/EditableTableViewCell.h
new file mode 100644
index 000000000000..6dd16660b352
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/EditableTableViewCell.h
@@ -0,0 +1,14 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface EditableTableViewCell : UITableViewCell
+ @property (weak, nonatomic) UITextField * textField;
+ @property (weak, nonatomic) UILabel * inputLabel;
+@end
diff --git a/ios/iosremote/iosremote/Classes/EditableTableViewCell.m b/ios/iosremote/iosremote/Classes/EditableTableViewCell.m
new file mode 100644
index 000000000000..60362030c762
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/EditableTableViewCell.m
@@ -0,0 +1,55 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "EditableTableViewCell.h"
+
+@implementation EditableTableViewCell
+
+@synthesize inputLabel = _inputLabel;
+@synthesize textField = _textField;
+
+- (id)initWithStyle:(UITableViewCellStyle)style
+ reuseIdentifier:(NSString *)identifier
+{
+ self = [super initWithStyle:style reuseIdentifier:identifier];
+
+ if (self == nil)
+ {
+ return nil;
+ }
+ CGRect bounds = self.contentView.bounds;
+ if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
+ bounds.size.width += 160;
+ CGRect rect = CGRectInset(bounds, 20.0, 10.0);
+ UITextField *textField = [[UITextField alloc] initWithFrame:rect];
+
+ // Set the keyboard's return key label to 'Next'.
+ //
+ [textField setReturnKeyType:UIReturnKeyNext];
+
+ // Make the clear button appear automatically.
+ [textField setClearButtonMode:UITextFieldViewModeWhileEditing];
+ [textField setOpaque:YES];
+
+ [[self contentView] addSubview:textField];
+ [self setTextField:textField];
+
+ return self;
+}
+
+// Disable highlighting of currently selected cell.
+//
+- (void)setSelected:(BOOL)selected
+ animated:(BOOL)animated
+{
+ [super setSelected:selected animated:NO];
+
+ [self setSelectionStyle:UITableViewCellSelectionStyleNone];
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/HorizontalSlideCell.h b/ios/iosremote/iosremote/Classes/HorizontalSlideCell.h
new file mode 100644
index 000000000000..4a88fe79d117
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/HorizontalSlideCell.h
@@ -0,0 +1,16 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface HorizontalSlideCell : UITableViewCell
+
+@property (strong, nonatomic) UIImageView *thumbnail;
+@property (strong, nonatomic) UILabel *numberLabel;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/HorizontalSlideCell.m b/ios/iosremote/iosremote/Classes/HorizontalSlideCell.m
new file mode 100644
index 000000000000..c918c547e032
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/HorizontalSlideCell.m
@@ -0,0 +1,64 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "HorizontalSlideCell.h"
+
+@implementation HorizontalSlideCell
+
+@synthesize thumbnail = _thumbnail;
+@synthesize numberLabel = _numberLabel;
+
+- (NSString *)reuseIdentifier
+{
+ return @"HorizontalTableSlideCell";
+}
+
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+ if (self) {
+ // Initialization code
+ }
+ return self;
+}
+
+- (id)initWithFrame:(CGRect)frame
+{
+ self = [super initWithFrame:frame];
+
+ self.thumbnail = [[UIImageView alloc] initWithFrame:CGRectMake(kArticleCellHorizontalInnerPadding, kArticleCellVerticalInnerPadding, kCellWidth - kArticleCellHorizontalInnerPadding * 2, kCellHeight - kArticleCellVerticalInnerPadding * 2)];
+ self.thumbnail.opaque = YES;
+
+ [self.contentView addSubview:self.thumbnail];
+
+ self.numberLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.thumbnail.frame.size.width * 0.8, self.thumbnail.frame.size.height * 0.8, self.thumbnail.frame.size.width * 0.2, self.thumbnail.frame.size.height * 0.2)];
+ self.numberLabel.opaque = YES;
+ self.numberLabel.backgroundColor = kHorizontalTableCellHighlightedBackgroundColor;
+ self.numberLabel.textColor = [UIColor whiteColor];
+ self.numberLabel.font = [UIFont boldSystemFontOfSize:11];
+ self.numberLabel.textAlignment = UITextAlignmentCenter;
+ self.numberLabel.numberOfLines = 1;
+ [self.thumbnail addSubview:self.numberLabel];
+
+ self.backgroundColor = [UIColor colorWithRed:0 green:0.40784314 blue:0.21568627 alpha:1.0];
+ self.selectedBackgroundView = [[UIView alloc] initWithFrame:self.thumbnail.frame];
+ self.selectedBackgroundView.backgroundColor = kHorizontalTableSelectedBackgroundColor;
+
+ self.transform = CGAffineTransformMakeRotation(M_PI * 0.5);
+
+ return self;
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated
+{
+ [super setSelected:selected animated:animated];
+
+ // Configure the view for the selected state
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/LibONavigationController.h b/ios/iosremote/iosremote/Classes/LibONavigationController.h
new file mode 100644
index 000000000000..499f9fc9f036
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/LibONavigationController.h
@@ -0,0 +1,13 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface LibONavigationController : UINavigationController
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/LibONavigationController.m b/ios/iosremote/iosremote/Classes/LibONavigationController.m
new file mode 100644
index 000000000000..d3bda4431e13
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/LibONavigationController.m
@@ -0,0 +1,44 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "LibONavigationController.h"
+#import "UINavigationController+Theme.h"
+
+@interface LibONavigationController ()
+
+@end
+
+@implementation LibONavigationController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ [self loadTheme];
+
+ // Do any additional setup after loading the view.
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+}
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/MainSplitViewController.h b/ios/iosremote/iosremote/Classes/MainSplitViewController.h
new file mode 100644
index 000000000000..4cd3cb8abeb3
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/MainSplitViewController.h
@@ -0,0 +1,17 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+#import "SlideShowPreviewViewController~ipad.h"
+
+@interface MainSplitViewController : UISplitViewController <MainSplitViewControllerProtocol>
+
+- (void) didReceivePresentationStarted;
+
+@property (strong, nonatomic) UIViewController * splitController;
+@end
diff --git a/ios/iosremote/iosremote/Classes/MainSplitViewController.m b/ios/iosremote/iosremote/Classes/MainSplitViewController.m
new file mode 100644
index 000000000000..0df7f424d8e2
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/MainSplitViewController.m
@@ -0,0 +1,79 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "MainSplitViewController.h"
+#import "CommunicationManager.h"
+#import "BasePresentationViewController.h"
+#import "SlideShowSwipeInList~ipad.h"
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+@interface MainSplitViewController ()
+
+@property UINavigationController * masterViewController;
+@property BasePresentationViewController * detailViewController;
+
+@end
+
+@implementation MainSplitViewController
+
+# pragma mark - System defaults
+
+- (BOOL) shouldAutorotate
+{
+ return YES;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ return YES;
+}
+
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ [[[[UIApplication sharedApplication] delegate] window] setRootViewController:self];
+ // Do any additional setup after loading the view.
+
+ self.detailViewController = [self.viewControllers objectAtIndex:1];
+ self.masterViewController = [self.viewControllers objectAtIndex:0];
+
+ self.delegate = self.detailViewController;
+}
+
+-(void) viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void) didReceivePresentationStarted
+{
+ [self.detailViewController hideMaster:NO];
+ [self dismissViewControllerAnimated:YES completion:nil];
+// [(UITableView *)[(slideShowSwipeInList_ipad *)[[self viewControllers] objectAtIndex:2] view] reloadData];
+ [(SlideShowSwipeInList_ipad *)[[self viewControllers] objectAtIndex:0] didReceivePresentationStarted];
+ [(BasePresentationViewController *)[[self viewControllers] objectAtIndex:1] setWelcomePageVisible:NO];
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/NewServerViewController.h b/ios/iosremote/iosremote/Classes/NewServerViewController.h
new file mode 100644
index 000000000000..b9e55961621f
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/NewServerViewController.h
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+
+@class Server;
+@class EditableTableViewCell;
+@class CommunicationManager;
+
+// Constants representing the book's fields.
+//
+enum {
+ ServerAddr,
+ ServerName
+};
+
+// Constants representing the various sections of our grouped table view.
+//
+enum {
+ InformationSection
+};
+
+typedef NSUInteger ServerAttribute;
+
+@interface NewServerViewController : UITableViewController <UITextFieldDelegate>
+@property (nonatomic, strong) Server *server;
+@property (nonatomic, strong) EditableTableViewCell *nameCell;
+@property (nonatomic, strong) EditableTableViewCell *addrCell;
+@property (nonatomic, strong) CommunicationManager *comManager;
+
+@property (weak, nonatomic) IBOutlet UIBarButtonItem *saveButton;
+
+- (IBAction)save:(id)sender;
+
+- (EditableTableViewCell *)newDetailCellWithTag:(NSInteger)tag;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/NewServerViewController.m b/ios/iosremote/iosremote/Classes/NewServerViewController.m
new file mode 100644
index 000000000000..236e269040e1
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/NewServerViewController.m
@@ -0,0 +1,253 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "NewServerViewController.h"
+#import "CommunicationManager.h"
+#import "EditableTableViewCell.h"
+#import "UIViewController+LibOStyling.h"
+#import "ServerListViewController.h"
+#import "Server.h"
+
+@implementation NewServerViewController
+
+@synthesize server = _server;
+
+@synthesize nameCell = _nameCell;
+@synthesize addrCell = _addrCell;
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
+{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ return YES;
+ else {
+ return toInterfaceOrientation == UIInterfaceOrientationMaskPortrait;
+ }
+}
+
+- (IBAction)save:(id)sender {
+ NSString *serverName = [self.nameCell.textField text];
+ NSString *serverAddr = [self.addrCell.textField text];
+ if ([serverAddr isValidIPAddress]) {
+ if (!serverName || [serverName isEqualToString:@""]) {
+ serverName = [[CommunicationManager fetchSSIDInfo] valueForKey:@"SSID"];
+ }
+ NSLog(@"New server name:%@ ip:%@", serverName, serverAddr);
+ [self.comManager addServersWithName:serverName AtAddress:serverAddr];
+ [self.navigationController popViewControllerAnimated:YES];
+ } else {
+ UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Invalid IP Address", @"Invalid IP Address Alert title")
+ message:NSLocalizedString(@"Invalid IP Address Msg", @"Invalid IP Address Alert message")
+ delegate:nil
+ cancelButtonTitle:NSLocalizedString(@"OK", @"OK Button on Alert view")
+ otherButtonTitles:nil];
+ [message show];
+ }
+}
+
+- (EditableTableViewCell *)newDetailCellWithTag:(NSInteger)tag
+{
+ EditableTableViewCell *cell = [[EditableTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
+
+ [[cell textField] setDelegate:self];
+ [[cell textField] setTag:tag];
+
+ return cell;
+}
+
+#pragma mark -
+#pragma mark UIViewController Methods
+
+- (void) handleBack
+{
+ [self.navigationController popViewControllerAnimated:YES];
+}
+
+- (void)viewDidLoad
+{
+ self.comManager = [CommunicationManager sharedComManager];
+ [self setNameCell:[self newDetailCellWithTag:ServerName]];
+ [self setAddrCell:[self newDetailCellWithTag:ServerAddr]];
+
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ [self setTitle:NSLocalizedString(@"New Server", nil)];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
+ [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ self.navigationItem.leftBarButtonItem = backButton;
+
+}
+
+// Override this method to automatically place the insertion point in the
+// first field.
+//
+- (void)viewWillAppear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+
+ [self.comManager setDelegate:self];
+}
+
+- (void)viewDidAppear:(BOOL)animated
+{
+ EditableTableViewCell *cell = (EditableTableViewCell *)[[self tableView]
+ cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
+
+ [[cell textField] becomeFirstResponder];
+}
+
+// Force textfields to resign firstResponder so that our implementation of
+// -textFieldDidEndEditing: gets called. That will ensure that the current
+// UI values are flushed to our model object before we return to the list view.
+//
+- (void)viewWillDisappear:(BOOL)animated
+{
+ [super viewWillDisappear:animated];
+
+ for (NSUInteger section = 0; section < [[self tableView] numberOfSections]; section++)
+ {
+ for (NSUInteger row = 0; row < [[self tableView] numberOfRowsInSection:section]; row++)
+ {
+ NSUInteger indexes[] = { section, row };
+ NSIndexPath *indexPath = [NSIndexPath indexPathWithIndexes:indexes
+ length:2];
+
+ EditableTableViewCell *cell = (EditableTableViewCell *)[[self tableView]
+ cellForRowAtIndexPath:indexPath];
+ if ([[cell textField] isFirstResponder])
+ {
+ [[cell textField] resignFirstResponder];
+ }
+ }
+ }
+}
+
+- (BOOL)disablesAutomaticKeyboardDismissal {
+ return NO;
+}
+
+#pragma mark -
+#pragma mark UITextFieldDelegate Protocol
+
+// Sets the label of the keyboard's return key to 'Done' when the insertion
+// point moves to the table view's last field.
+//
+- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
+{
+ if ([textField tag] == ServerName)
+ {
+ [textField setReturnKeyType:UIReturnKeyDone];
+ }
+
+ return YES;
+}
+
+// UITextField sends this message to its delegate after resigning
+// firstResponder status. Use this as a hook to save the text field's
+// value to the corresponding property of the model object.
+//
+- (void)textFieldDidEndEditing:(UITextField *)textField
+{
+ NSString *text = [textField text];
+
+ switch ([textField tag])
+ {
+ case ServerName: [self.server setServerName:text]; break;
+ case ServerAddr: [self.server setServerAddress:text]; break;
+ }
+}
+
+// UITextField sends this message to its delegate when the return key
+// is pressed. Use this as a hook to navigate back to the list view
+// (by 'popping' the current view controller, or dismissing a modal nav
+// controller, as the case may be).
+//
+// If the user is adding a new item rather than editing an existing one,
+// respond to the return key by moving the insertion point to the next cell's
+// textField, unless we're already at the last cell.
+//
+- (BOOL)textFieldShouldReturn:(UITextField *)textField
+{
+ if ([textField returnKeyType] != UIReturnKeyDone)
+ {
+ // If this is not the last field (in which case the keyboard's
+ // return key label will currently be 'Next' rather than 'Done'),
+ // just move the insertion point to the next field.
+ //
+ // (See the implementation of -textFieldShouldBeginEditing: above.)
+ //
+ NSInteger nextTag = [textField tag] + 1;
+ UIView *nextTextField = [[self tableView] viewWithTag:nextTag];
+
+ [nextTextField becomeFirstResponder];
+ }
+ else
+ {
+ [self save:nil];
+ }
+
+ return YES;
+}
+
+#pragma mark -
+#pragma mark UITableViewDataSource Protocol
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView
+ numberOfRowsInSection:(NSInteger)section
+{
+ return 2;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView
+ cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ EditableTableViewCell *cell = nil;
+ NSString *text = nil;
+ NSString *placeholder = nil;
+ UIKeyboardType keyboardType = UIKeyboardTypeDefault;
+
+ // Pick the editable cell and the values for its textField
+ //
+ NSUInteger section = [indexPath section];
+ switch (section)
+ {
+ case InformationSection:
+ {
+ if ([indexPath row] == 1)
+ {
+ cell = [self nameCell];
+ text = [self.server serverName];
+ placeholder = NSLocalizedString(@"Name (optional)", @"EditableTableViewCell placeholder");
+ keyboardType = UIKeyboardTypeDefault;
+ }
+ else
+ {
+ cell = [self addrCell];
+ text = [self.server serverAddress];
+ placeholder = NSLocalizedString(@"IP Address", @"EditableTableViewCell placeholder");
+ keyboardType = UIKeyboardTypeNumbersAndPunctuation;
+ }
+ break;
+ }
+ }
+ [cell.textField setPlaceholder:placeholder];
+ [cell.textField setText:text];
+ [cell.textField setKeyboardType:keyboardType];
+ return cell;
+}
+
+- (void)viewDidUnload {
+ [self setSaveButton:nil];
+ [super viewDidUnload];
+}
+@end
+
diff --git a/ios/iosremote/iosremote/Classes/PinValidationViewController.h b/ios/iosremote/iosremote/Classes/PinValidationViewController.h
new file mode 100644
index 000000000000..857d678d7b8e
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/PinValidationViewController.h
@@ -0,0 +1,16 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface PinValidationViewController : UIViewController
+
+@property (weak, nonatomic) IBOutlet UILabel *pinLabel;
+@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/PinValidationViewController.m b/ios/iosremote/iosremote/Classes/PinValidationViewController.m
new file mode 100644
index 000000000000..35f165ecf34c
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/PinValidationViewController.m
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "PinValidationViewController.h"
+#import "SlideShow.h"
+#import "CommandInterpreter.h"
+#import "CommunicationManager.h"
+
+@interface PinValidationViewController ()
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, strong) id slideShowPreviewStartObserver;
+
+@end
+
+@implementation PinValidationViewController
+
+@synthesize comManager = _comManager;
+@synthesize slideShowPreviewStartObserver = _slideShowPreviewStartObserver;
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view.
+ self.comManager = [CommunicationManager sharedComManager];
+ [self.pinLabel setText:[NSString stringWithFormat:@"%@", [self.comManager getPairingPin]]];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Connect", @"Back button to the connect page on navbar") style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
+ [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ self.navigationItem.leftBarButtonItem = backButton;
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+ self.slideShowPreviewStartObserver = [[NSNotificationCenter defaultCenter] addObserverForName:STATUS_PAIRING_PAIRED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self performSegueWithIdentifier:@"pinValidated" sender:self ];
+ }];
+ [super viewDidAppear:animated];
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowPreviewStartObserver];
+ [super viewDidDisappear:animated];
+}
+
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self setPinLabel:nil];
+ [self setStatusLabel:nil];
+ [super viewDidUnload];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/SWReavealMainController.h b/ios/iosremote/iosremote/Classes/SWReavealMainController.h
new file mode 100644
index 000000000000..0f1601e9e158
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SWReavealMainController.h
@@ -0,0 +1,13 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface SWReavealMainController : UIViewController
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SWReavealMainController.m b/ios/iosremote/iosremote/Classes/SWReavealMainController.m
new file mode 100644
index 000000000000..acf91e4d0492
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SWReavealMainController.m
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "SWReavealMainController.h"
+
+@interface SWReavealMainController ()
+
+@end
+
+@implementation SWReavealMainController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view.
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/ServerListViewController.h b/ios/iosremote/iosremote/Classes/ServerListViewController.h
new file mode 100644
index 000000000000..569a52fa3874
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/ServerListViewController.h
@@ -0,0 +1,20 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface ServerListViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>
+
+@property (strong, nonatomic) IBOutlet UITableView *serverTable;
+@property (weak, nonatomic) IBOutlet UIBarButtonItem *menuButton;
+
+- (void)disableSpinner;
+- (IBAction)onClickMenuButton:(id)sender;
+- (void) startSearching;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/ServerListViewController.m b/ios/iosremote/iosremote/Classes/ServerListViewController.m
new file mode 100644
index 000000000000..e9e65836a257
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/ServerListViewController.m
@@ -0,0 +1,542 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "ServerListViewController.h"
+#import "CommunicationManager.h"
+#import "NewServerViewController.h"
+#import "Server.h"
+#import "Client.h"
+#import "PopoverView.h"
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+@interface ServerListViewController () <NSNetServiceBrowserDelegate, NSNetServiceDelegate, PopoverViewDelegate>
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, weak) NSNotificationCenter* center;
+@property (nonatomic, strong) id slideShowPreviewStartObserver;
+@property (nonatomic, strong) id pinValidationObserver;
+@property (atomic, strong) NSIndexPath *lastSpinningCellIndex;
+@property (nonatomic, strong) NSNetServiceBrowser *serviceBrowser;
+
+@property (nonatomic, strong) NSTimer *searchLabelTimer;
+@property (nonatomic, strong) NSTimer *searchTimeoutTimer;
+@property (nonatomic, strong) NSString *searchStateText;
+@property (nonatomic) UITableViewCellSelectionStyle style;
+
+@end
+
+@implementation ServerListViewController
+
+@synthesize style = _style;
+@synthesize searchStateText = _searchStateText;
+@synthesize searchLabelTimer = _searchLabelTimer;
+@synthesize center = _center;
+@synthesize comManager = _comManager;
+@synthesize lastSpinningCellIndex = _lastSpinningCellIndex;
+@synthesize slideShowPreviewStartObserver = _slideShowPreviewStartObserver;
+@synthesize pinValidationObserver = _pinValidationObserver;
+@synthesize serviceBrowser = _serviceBrowser;
+
+- (IBAction)onClickMenuButton:(id)sender {
+ [PopoverView showPopoverAtPoint:CGPointMake([[sender view] center].x, [[sender view] center].y + [[sender view] frame].size.height * 0.5) inView:[sender view].superview withStringArray:
+ [NSArray arrayWithObjects:NSLocalizedString(@"Connection Help", @"Popover option"), NSLocalizedString(@"About Impress Remote", @"Popover option"), nil]
+ delegate:self];
+}
+
+- (void)popoverView:(PopoverView *)popoverView didSelectItemAtIndex:(NSInteger)index
+{
+ [popoverView dismiss];
+ switch (index) {
+ case 0:
+ [self performSegueWithIdentifier:@"howtoSegue" sender:self];
+ break;
+ case 1:
+ [self performSegueWithIdentifier:@"aboutSegue" sender:self];
+ break;
+ default:
+ break;
+ }
+}
+
+#pragma mark - helper
+- (void) startSearching
+{
+ [self.serviceBrowser stop];
+ [self.comManager.autoDiscoveryServers removeAllObjects];
+ [self.serviceBrowser searchForServicesOfType:@"_impressremote._tcp" inDomain:@"local"];
+ [self.serviceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+}
+
+- (void) setSearchStateText:(NSString *)searchStateText
+{
+ _searchStateText = searchStateText;
+ // This doesn't work well on iOS7, might be a bug. The text will get duplicated, it seems that the older section header view was not removed
+ [self.serverTable reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
+ // [self.serverTable reloadData];
+}
+
+- (void) setStyle:(UITableViewCellSelectionStyle)style
+{
+ _style = style;
+ [self.serverTable reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
+}
+
+#pragma mark - netservice resolve delegate
+-(void) netServiceDidResolveAddress:(NSNetService *)sender
+{
+ if ([sender.addresses count]){
+ NSData * address = [[sender addresses] objectAtIndex: 0];
+ struct sockaddr_in *socketAddress = (struct sockaddr_in *) [address bytes];
+ NSString * ipString = [NSString stringWithFormat: @"%s",inet_ntoa(socketAddress->sin_addr)];
+ int port = socketAddress->sin_port;
+ NSLog(@"Resolved at %@:%u", ipString, port);
+
+ [self.comManager connectToServer:[[Server alloc] initWithProtocol:NETWORK atAddress:ipString ofName:sender.name]];
+ }
+}
+
+-(void) netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict
+{
+ NSLog(@"Failed to resolve");
+ [self.comManager.autoDiscoveryServers removeAllObjects];
+ [self startSearching];
+
+ UIAlertView *message = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Failed to reach your computer", nil)
+ message:NSLocalizedString(@"Please consider restart LibreOffice Impress on your computer.", nil)
+ delegate:self
+ cancelButtonTitle:NSLocalizedString(@"OK", nil)
+ otherButtonTitles:nil];
+ [self disableSpinner];
+ [message show];
+}
+
+#pragma mark - bonjour service discovery
+
+-(void) handleSearchTimeout
+{
+ [self.serviceBrowser stop];
+}
+
+-(void) updateSearchLabel
+{
+ static short count = 1;
+ NSString * searchText = NSLocalizedString(@"Searching", nil);
+ for (uint i = 0; i<=count; ++i) {
+ searchText = [searchText stringByAppendingString:@"."];
+ }
+ NSLog(@"Updating count = %u SearchText = %@", count, searchText);
+ self.searchStateText = searchText;
+ count++;
+ count = count % 3;
+}
+
+-(void) netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser
+{
+ NSLog(@"Will search");
+ self.comManager.searchState = SEARCHING;
+ self.searchStateText = NSLocalizedString(@"Searching", nil);
+ [self.searchLabelTimer invalidate];
+ [self.searchTimeoutTimer invalidate];
+ self.searchLabelTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
+ target:self
+ selector:@selector(updateSearchLabel)
+ userInfo:nil
+ repeats:YES];
+
+ self.searchTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
+ target:self
+ selector:@selector(handleSearchTimeout)
+ userInfo:nil
+ repeats:NO];
+
+ [[NSRunLoop currentRunLoop] addTimer:self.searchLabelTimer forMode:NSRunLoopCommonModes];
+ self.style = UITableViewCellSelectionStyleNone;
+}
+
+-(void) netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser
+{
+ NSLog(@"End search");
+ self.comManager.searchState = WAITING;
+ [self.searchLabelTimer invalidate];
+ [self.searchTimeoutTimer invalidate];
+ self.searchStateText = NSLocalizedString(@"Click to refresh", nil);
+ self.style = UITableViewCellSelectionStyleBlue;
+}
+
+- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict
+{
+ NSLog(@"search error");
+}
+
+- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser
+ didFindService:(NSNetService *)aNetService
+ moreComing:(BOOL)moreComing
+{
+ // [self.comManager.autoDiscoveryServers removeObject:aNetService];
+ [self.comManager.autoDiscoveryServers addObject:aNetService];
+
+ NSLog(@"Got service %p with hostname %@\n", aNetService,
+ [aNetService name]);
+
+ [aNetService setDelegate:self];
+
+ if(!moreComing)
+ {
+ [self.searchTimeoutTimer invalidate];
+ [self.searchLabelTimer invalidate];
+ self.comManager.searchState = WAITING;
+ [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
+ }
+}
+
+// Sent when a service disappears
+- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
+ didRemoveService:(NSNetService *)aNetService
+ moreComing:(BOOL)moreComing
+{
+ [self.comManager.autoDiscoveryServers removeObject:aNetService];
+
+ if(!moreComing)
+ {
+ // [self.tableView reloadData];
+ [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
+ [self startSearching];
+ }
+}
+
+# pragma mark - System defaults
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
+{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ return YES;
+ else {
+ return toInterfaceOrientation == UIInterfaceOrientationMaskPortrait;
+ }
+}
+
+
+- (id)initWithStyle:(UITableViewStyle)style
+{
+ self = [super initWithStyle:style];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Uncomment the following line to preserve selection between presentations.
+ // self.clearsSelectionOnViewWillAppear = NO;
+
+ // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
+ // self.navigationItem.rightBarButtonItem = self.editButtonItem;
+
+
+ self.center = [NSNotificationCenter defaultCenter];
+ self.comManager = [CommunicationManager sharedComManager];
+ self.serverTable.dataSource = self;
+ self.serverTable.delegate = self;
+ _style = UITableViewCellSelectionStyleNone;
+
+ [self setTitle:NSLocalizedString(@"Impress Remote", @"App name displayed on navbar")];
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+ self.pinValidationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:STATUS_PAIRING_PINVALIDATION
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.comManager.client stopConnectionTimeoutTimer];
+ self.comManager.state = CONNECTED;
+ [self disableSpinner];
+ [self performSegueWithIdentifier:@"pinValidation" sender:self ];
+ }];
+ self.slideShowPreviewStartObserver = [[NSNotificationCenter defaultCenter] addObserverForName:STATUS_PAIRING_PAIRED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.comManager.client stopConnectionTimeoutTimer];
+ self.comManager.state = CONNECTED;
+ [self disableSpinner];
+ [self performSegueWithIdentifier:@"SlideShowPreview" sender:self ];
+ }];
+ NSLog(@"Clear auto discovered servers");
+ [self.comManager.autoDiscoveryServers removeAllObjects];
+ // [self.serverTable reloadData];
+ [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
+ self.serviceBrowser = [[NSNetServiceBrowser alloc] init];
+ [self.serviceBrowser setDelegate:self];
+ [self startSearching];
+
+ if (![[NSUserDefaults standardUserDefaults] boolForKey:@"HOWTO_GUIDE_SEEN"])
+ {
+ UIAlertView * av = [[UIAlertView alloc] initWithTitle:@"How-To guide" message:NSLocalizedString(@"Take a tour of iOS Impress Remote?", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"No, thanks", nil) otherButtonTitles:NSLocalizedString(@"Yes", nil), nil];
+
+ [av show];
+ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HOWTO_GUIDE_SEEN"];
+ }
+
+ [super viewDidAppear:animated];
+}
+
+- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
+ if (buttonIndex == 0){
+ [alertView dismissWithClickedButtonIndex:0 animated:YES];
+ }else if (buttonIndex == 1){
+ [alertView dismissWithClickedButtonIndex:0 animated:YES];
+ [self performSegueWithIdentifier:@"howtoSegue" sender:self];
+ }
+}
+
+- (void) viewWillDisappear:(BOOL)animated
+{
+ [self disableSpinner];
+ [self.serviceBrowser stop];
+ [self.serviceBrowser removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+ [super viewWillDisappear:animated];
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowPreviewStartObserver];
+ [[NSNotificationCenter defaultCenter] removeObserver:self.pinValidationObserver];
+ [super viewDidDisappear:animated];
+}
+
+
+-(void)viewWillAppear:(BOOL)animated
+{
+ [self.comManager setDelegate:self];
+ [self.serverTable reloadData];
+ [super viewWillAppear:animated];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+#pragma mark - Table view delegate
+
+- (void)disableSpinner
+{
+ @synchronized(self.lastSpinningCellIndex){
+ if ([[self.tableView cellForRowAtIndexPath:self.lastSpinningCellIndex] respondsToSelector:@selector(accessoryView)]) {
+ if (self.tableView && [self.tableView cellForRowAtIndexPath:self.lastSpinningCellIndex]) {
+ [[self.tableView cellForRowAtIndexPath:self.lastSpinningCellIndex] setAccessoryView:nil];
+ }
+ }
+ }
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ [tableView deselectRowAtIndexPath:indexPath animated:YES];
+
+ if ([self.comManager.autoDiscoveryServers count] == 0 && indexPath.section == 0){
+ // No discovered server and not searching => in a "click to refresh" state, so we restart searching process
+ if (self.comManager.searchState == WAITING){
+ [self startSearching];
+ }
+ // Return when browser is still searching...
+ return;
+ }
+
+ // Return when nothing should be done
+ if (self.comManager.state == CONNECTING)
+ return;
+
+ UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
+
+ // Setting up the spinner to the right cell
+ self.lastSpinningCellIndex = indexPath;
+ UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
+ [activityView startAnimating];
+ [cell setAccessoryView:activityView];
+
+ if (indexPath.section == 1){
+ NSLog(@"Connecting to %@:%@", [[self.comManager.servers objectAtIndex:indexPath.row] serverName], [[self.comManager.servers objectAtIndex:indexPath.row] serverAddress]);
+ [self.comManager connectToServer:[self.comManager.servers objectAtIndex:indexPath.row]];
+ } else if (indexPath.section == 0){
+ NSLog(@"Connecting to %@", [[self.comManager.autoDiscoveryServers objectAtIndex:indexPath.row] name]);
+ [[self.comManager.autoDiscoveryServers objectAtIndex:indexPath.row] resolveWithTimeout:0.0];
+ }
+}
+
+- (void)viewDidUnload {
+ [self setServerTable:nil];
+ [self setMenuButton:nil];
+ [super viewDidUnload];
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+
+ NSString *sectionName = nil;
+
+ switch (section) {
+ case 0:
+ sectionName = [NSString stringWithFormat:NSLocalizedString(@"Detected Connections", @"Server list section title")];
+ break;
+ case 1:
+ sectionName = [NSString stringWithFormat:NSLocalizedString(@"Custom Connections", @"Server list section title")];
+ break;
+ }
+ UILabel *sectionHeader;
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
+ sectionHeader = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 310, 40)];
+ } else {
+ sectionHeader = [[UILabel alloc] initWithFrame:CGRectMake(25, 10, 295, 40)];
+ }
+ sectionHeader.backgroundColor = [UIColor clearColor];
+ sectionHeader.font = kAppTextFont;
+ sectionHeader.textColor = [UIColor darkTextColor];
+ sectionHeader.text = sectionName;
+ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, [self tableView:tableView heightForHeaderInSection:section])];
+ [view addSubview:sectionHeader];
+
+ if (self.comManager.searchState == SEARCHING && section == 0) {
+ UIActivityIndicatorView * aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
+ aiv.center = CGPointMake([sectionHeader.text sizeWithFont: sectionHeader.font].width + 2 * aiv.frame.size.width, sectionHeader.center.y);
+ [aiv startAnimating];
+ [aiv setTag:4];
+ [view addSubview:aiv];
+ }
+ return view;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
+ if ([self.comManager.servers count] == 0 && section == 1) {
+ UILabel *sectionFooter = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, tableView.frame.size.width - 50, 100)];
+ [sectionFooter setLineBreakMode:NSLineBreakByWordWrapping];
+ [sectionFooter setNumberOfLines:5];
+ sectionFooter.backgroundColor = [UIColor clearColor];
+ sectionFooter.font = kAppSmallTextFont;
+ sectionFooter.textColor = kTextTintColor;
+ sectionFooter.text = NSLocalizedString(@"Customize server config instruction", @"Displayed when no customized server is available");
+
+ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, [self tableView:tableView heightForFooterInSection:section])];
+ [view addSubview:sectionFooter];
+ return view;
+ }
+ return nil;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
+{
+ return 50.0;
+}
+
+//- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
+//{
+//// return 50.0;
+//}
+
+-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+ return 2;
+}
+
+-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ switch (section) {
+ case 0:
+ return [self.comManager.autoDiscoveryServers count] == 0 ? 1 : [self.comManager.autoDiscoveryServers count];
+ break;
+ case 1:
+ return [self.comManager.servers count];
+ default:
+ return -1;
+ break;
+ }
+}
+
+-(void)revealHelpInfo:(UIView *)sender
+{
+ if (sender) {
+ if ([[CommunicationManager fetchSSIDInfo] valueForKey:@"SSID"])
+ [PopoverView showPopoverAtPoint:CGPointMake(sender.center.x,
+ sender.frame.origin.y + sender.frame.size.height/2)
+ inView:[sender superview]
+ withText:[NSString
+ stringWithFormat:NSLocalizedString(@"* Launch Impress on your computer\n* Connect both devices to the same WiFi network\n* P.S. Your iOS device is connected to \"%@\" now", nil), [[CommunicationManager fetchSSIDInfo] valueForKey:@"SSID"]]
+ delegate:nil];
+ else {
+ [PopoverView showPopoverAtPoint:CGPointMake(sender.center.x,
+ sender.frame.origin.y + sender.frame.size.height/2)
+ inView:[sender superview]
+ withText:[NSString
+ stringWithFormat:NSLocalizedString(@"* You don't have a WiFi connection now.\n* Connect your iOS device and your computer to the same network\n* Refresh\n* hint: you may create a personal hotspot on your computer/iPhone", nil), [[CommunicationManager fetchSSIDInfo] valueForKey:@"SSID"]]
+ delegate:nil];
+ }
+ }
+}
+
+-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ static NSString *cellIdentifier = @"server_item_cell";
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
+
+ if (indexPath.section == 0){
+ if ([self.comManager.autoDiscoveryServers count] == 0){
+ cell.textLabel.text = NSLocalizedString(self.searchStateText, nil);
+ cell.textLabel.lineBreakMode = UILineBreakModeClip;
+ cell.selectionStyle = self.style;
+
+ UIButton *infoBtn = [UIButton buttonWithType:UIButtonTypeInfoDark];
+ infoBtn.frame = CGRectMake(3, 8, 30, 30);
+ [infoBtn addTarget:self action:@selector(revealHelpInfo:) forControlEvents:UIControlEventTouchUpInside];
+
+ cell.accessoryView = infoBtn;
+ } else {
+ id s = [self.comManager.autoDiscoveryServers objectAtIndex:indexPath.row];
+ [cell.textLabel setText:[s name]];
+ [cell.detailTextLabel setText:@""];
+ cell.accessoryView = nil;
+ }
+ }
+ else {
+ Server *s = [self.comManager.servers objectAtIndex:indexPath.row];
+
+ [cell.textLabel setText:[s serverName]];
+ [cell.detailTextLabel setText:[s serverAddress]];
+ }
+ return cell;
+}
+
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ if (indexPath.section == 1)
+ return YES;
+ else
+ return NO;
+}
+
+- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
+ if (indexPath.section == 1) {
+ return UITableViewCellEditingStyleDelete;
+ } else {
+ return UITableViewCellEditingStyleNone;
+ }
+}
+
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
+
+ if(editingStyle == UITableViewCellEditingStyleDelete){
+ [self.comManager removeServerAtIndex:indexPath.row];
+ [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
+ }
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.h b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.h
new file mode 100644
index 000000000000..9d498c0043c5
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.h
@@ -0,0 +1,30 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+#import "CommunicationManager.h"
+
+#define OPTION_TIMER NSLocalizedString(@"Timer auto-start", nil)
+#define OPTION_POINTER NSLocalizedString(@"Touch pointer", nil)
+#define STOPWATCH_AUTO_START @"STOPWATCH_AUTO_START"
+
+@interface SlideShowPreviewViewController : UIViewController
+
+@property (nonatomic, strong) CommunicationManager * comManager;
+
+@property (nonatomic, strong) id slideShowStartObserver;
+@property (nonatomic, strong) id titleObserver;
+
+@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+@property (weak, nonatomic) IBOutlet UIButton *startButton;
+@property (weak, nonatomic) IBOutlet UIButton *prefButton;
+
+- (IBAction)startPresentationAction:(id)sender;
+- (IBAction)startPrefSettings:(id)sender;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.m b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.m
new file mode 100644
index 000000000000..6933fd773d50
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController.m
@@ -0,0 +1,107 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "SlideShowPreviewViewController.h"
+#import "CommunicationManager.h"
+#import "CommandTransmitter.h"
+#import "CommandInterpreter.h"
+#import "SlideShow.h"
+#import "AppDelegate.h"
+#import "IASKAppSettingsViewController.h"
+
+@interface SlideShowPreviewViewController () <IASKSettingsDelegate>
+
+@property (nonatomic, strong) IASKAppSettingsViewController *appSettingsViewController;
+
+@end
+
+@implementation SlideShowPreviewViewController
+
+@synthesize startButton = _startButton;
+@synthesize titleObserver = _titleObserver;
+@synthesize appSettingsViewController = _appSettingsViewController;
+
+#pragma mark IASKSettingsDelegate
+- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender
+{
+ [(AppDelegate *)[[UIApplication sharedApplication] delegate] reconfigure];
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
+{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+ return YES;
+ else {
+ return toInterfaceOrientation == UIInterfaceOrientationMaskPortrait;
+ }
+}
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ // Setting up UIButton stretchable background
+ UIImage *backgroundImage = [UIImage imageNamed:@"buttonBackground"];
+ UIEdgeInsets insets = UIEdgeInsetsMake(20, 7, 20, 7);
+ UIImage *stretchableBackgroundImage = [backgroundImage resizableImageWithCapInsets:insets];
+ [self.startButton setBackgroundImage:stretchableBackgroundImage forState:UIControlStateNormal];
+ [self.prefButton setBackgroundImage:stretchableBackgroundImage forState:UIControlStateNormal];
+
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowStartObserver];
+ self.slideShowStartObserver = nil;
+ [super viewDidDisappear:animated];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+#pragma mark - Table view data source
+
+-(IBAction)startPresentationAction:(id)sender {
+ [[self.comManager transmitter] startPresentation];
+}
+
+- (IBAction)startPrefSettings:(id)sender {
+ self.appSettingsViewController.showDoneButton = NO;
+ [self.navigationController pushViewController:self.appSettingsViewController animated:YES];
+}
+
+#pragma mark - IN app setting
+- (IASKAppSettingsViewController*)appSettingsViewController {
+ if (!_appSettingsViewController) {
+ _appSettingsViewController = [[IASKAppSettingsViewController alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil];
+ _appSettingsViewController.delegate = self;
+ }
+ return _appSettingsViewController;
+}
+
+- (void)viewDidUnload {
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowStartObserver];
+ self.slideShowStartObserver = nil;
+ [self setStartButton:nil];
+ [self setPrefButton:nil];
+ [self setTitleLabel:nil];
+ [super viewDidUnload];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.h b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.h
new file mode 100644
index 000000000000..37937b920155
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.h
@@ -0,0 +1,21 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "SlideShowPreviewViewController.h"
+
+@protocol MainSplitViewControllerProtocol <NSObject>
+
+- (void) didReceivePresentationStarted;
+
+@end
+
+@interface SlideShowPreviewViewController_ipad : SlideShowPreviewViewController
+
+@property (strong, nonatomic) id <MainSplitViewControllerProtocol> delegate;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.m b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.m
new file mode 100644
index 000000000000..f3436653afea
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~ipad.m
@@ -0,0 +1,86 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "SlideShowPreviewViewController~ipad.h"
+#import "SlideShowPreviewViewController.h"
+#import "CommunicationManager.h"
+#import "CommandTransmitter.h"
+#import "CommandInterpreter.h"
+#import "SlideShow.h"
+#import "MainSplitViewController.h"
+#import "UIViewController+LibOStyling.h"
+
+@interface SlideShowPreviewViewController_ipad ()
+
+@end
+
+@implementation SlideShowPreviewViewController_ipad
+
+#pragma mark - System defaults
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void) viewDidLoad
+{
+ [super viewDidLoad];
+ if (self.navigationController)
+ self.delegate = (MainSplitViewController *) self.navigationController.presentingViewController;
+ else
+ self.delegate = (MainSplitViewController *) self.presentingViewController;
+ self.comManager = [CommunicationManager sharedComManager];
+ self.comManager.delegate = self;
+
+ if (self.comManager.interpreter.slideShow)
+ [self.titleLabel setText:[self.comManager.interpreter.slideShow title]];
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:SLIDESHOW_INFO_RECEIVED object:self.titleObserver queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
+ [self.titleLabel setText:self.comManager.interpreter.slideShow.title];
+ if (!self.titleLabel) {
+ NSLog(@"TitleLabel nil");
+ }
+ NSLog(@"Received: %@", self.comManager.interpreter.slideShow.title);
+ }];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Connect", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
+ [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ self.navigationItem.leftBarButtonItem = backButton;
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+ if ([self.comManager.interpreter.slideShow size] > 0){
+ [self.delegate didReceivePresentationStarted];
+ }
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+ self.slideShowStartObserver = [[NSNotificationCenter defaultCenter] addObserverForName:STATUS_CONNECTED_SLIDESHOW_RUNNING
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.delegate didReceivePresentationStarted];
+ }];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+
+- (void)viewDidUnload {
+ [super viewDidUnload];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.h b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.h
new file mode 100644
index 000000000000..ea9858451207
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.h
@@ -0,0 +1,14 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+#import "SlideShowPreviewViewController.h"
+
+@interface SlideShowPreviewViewController_iphone : SlideShowPreviewViewController
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.m b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.m
new file mode 100644
index 000000000000..e2b8e36e4750
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowPreviewViewController~iphone.m
@@ -0,0 +1,58 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "SlideShowPreviewViewController~iphone.h"
+#import "CommandInterpreter.h"
+#import "SlideShow.h"
+
+@implementation SlideShowPreviewViewController_iphone
+
+- (void) viewDidLoad
+{
+ [super viewDidLoad];
+ self.comManager = [CommunicationManager sharedComManager];
+ self.comManager.delegate = self;
+
+
+ if (self.comManager.interpreter.slideShow)
+ [self.titleLabel setText:[self.comManager.interpreter.slideShow title]];
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:SLIDESHOW_INFO_RECEIVED object:self.titleObserver queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
+ [self.titleLabel setText:self.comManager.interpreter.slideShow.title];
+ if (!self.titleLabel) {
+ NSLog(@"TitleLabel nil");
+ }
+ NSLog(@"Received: %@", self.comManager.interpreter.slideShow.title);
+ }];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Connect", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
+ [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ self.navigationItem.leftBarButtonItem = backButton;
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+
+ if ([self.comManager.interpreter.slideShow size] > 0){
+ [self performSegueWithIdentifier:@"slideShowSegue" sender:self];
+ }
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+ self.slideShowStartObserver = [[NSNotificationCenter defaultCenter] addObserverForName:STATUS_CONNECTED_SLIDESHOW_RUNNING
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self performSegueWithIdentifier:@"slideShowSegue" sender:self];
+ }];
+}
+
+- (void)viewDidUnload {
+ [self setTitleLabel:nil];
+ [super viewDidUnload];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.h b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.h
new file mode 100644
index 000000000000..58e6aa7dbe1f
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.h
@@ -0,0 +1,13 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+@interface SlideShowSwipeInList_ipad : UITableViewController
+
+- (void) didReceivePresentationStarted;
+
+@end \ No newline at end of file
diff --git a/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.m b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.m
new file mode 100644
index 000000000000..06f18c15da05
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~ipad.m
@@ -0,0 +1,155 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "SlideShowSwipeInList~ipad.h"
+#import "CommunicationManager.h"
+#import "CommandInterpreter.h"
+#import "SlideShow.h"
+#import "CommandTransmitter.h"
+#import "SWRevealViewController.h"
+#import "SlideShowPreviewViewController.h"
+#import "UIView+Shadowing.h"
+#import <QuartzCore/CALayer.h>
+
+@interface SlideShowSwipeInList_ipad ()
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, strong) SlideShow *slideshow;
+@property (nonatomic, strong) id slideChangedObserver;
+
+@end
+
+@implementation SlideShowSwipeInList_ipad
+
+@synthesize comManager = _comManager;
+@synthesize slideshow = _slideshow;
+@synthesize slideChangedObserver = _slideChangedObserver;
+
+dispatch_queue_t backgroundQueue;
+
+- (void) handleBack:(id)sender
+{
+ [self.comManager.transmitter stopPresentation];
+ [self.tableView reloadData];
+}
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (SlideShow *)slideshow
+{
+ return self.comManager.interpreter.slideShow;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.comManager = [CommunicationManager sharedComManager];
+ self.slideshow.secondaryDelegate = self;
+
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+ self.slideChangedObserver =[center addObserverForName:MSG_SLIDE_CHANGED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ if ([self.tableView numberOfRowsInSection:0] > 0){
+ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.slideshow.currentSlide inSection:0];
+ [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
+ [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
+ }
+ }];
+ self.tableView.backgroundColor = [UIColor colorWithRed:.674509804 green:.729411765 blue:.760784314 alpha:1.0];
+}
+
+- (void)viewDidUnload
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideChangedObserver];
+ [super viewDidUnload];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void) viewWillAppear:(BOOL)animated
+{
+ [self.tableView reloadData];
+ [super viewWillAppear:animated];
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ if ([self.comManager.interpreter.slideShow size] > 0) {
+ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.slideshow.currentSlide
+ inSection:0];
+ [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
+ [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
+ }
+}
+
+- (void) didReceivePresentationStarted
+{
+ self.slideshow.secondaryDelegate = self;
+ [self.tableView reloadData];
+}
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+ return 1;
+}
+
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+ return [self.slideshow size];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ static NSString *CellIdentifier = @"slide";
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
+ UILabel * slideNumber = (UILabel *)[cell viewWithTag:2];
+ UIImageView * thumbnail = (UIImageView *)[cell viewWithTag:1];
+
+ [thumbnail setShadow];
+ // Starting 20, all tags are used for thumbnails in this sidebar
+ [cell setTag:20+indexPath.row];
+ [self.slideshow getContentAtIndex:indexPath.row forView:cell];
+ [slideNumber setText:[NSString stringWithFormat:@"%u", indexPath.row+1]];
+ return cell;
+}
+
+- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
+ // Otherwise selection will disable background color and make slide number unreadable
+ if(cell.selected){
+ UILabel *label = (UILabel *)[cell viewWithTag:2];
+ if ([label backgroundColor]!=[UIColor lightGrayColor]) {
+ [label setBackgroundColor:[UIColor lightGrayColor]];
+ }
+ }
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ [self.comManager.transmitter gotoSlide:indexPath.row];
+ [[[self.tableView cellForRowAtIndexPath:indexPath] viewWithTag:2] setBackgroundColor:[UIColor lightGrayColor]];
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.h b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.h
new file mode 100644
index 000000000000..062b8f4fbcc1
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.h
@@ -0,0 +1,18 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#import <UIKit/UIKit.h>
+
+@class StopWatch;
+@class Timer;
+
+@interface SlideShowSwipeInList_iphone : UITableViewController <UITableViewDataSource, UITableViewDelegate>
+
+@property (nonatomic, strong) StopWatch *stopWatch;
+@property (nonatomic, strong) Timer *timer;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.m b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.m
new file mode 100644
index 000000000000..b4fd205bcb70
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowSwipeInList~iphone.m
@@ -0,0 +1,307 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import "SlideShowSwipeInList~iphone.h"
+#import "CommunicationManager.h"
+#import "CommandInterpreter.h"
+#import "SlideShow.h"
+#import "CommandTransmitter.h"
+#import "SWRevealViewController.h"
+#import "SlideShowPreviewViewController.h"
+#import "StopWatch.h"
+#import "Timer.h"
+#import "UIImageView+setImageAnimated.h"
+#import "UIView+Shadowing.h"
+#import "UIViewController+LibOStyling.h"
+#import <QuartzCore/CALayer.h>
+#import <QuartzCore/QuartzCore.h>
+
+@interface SlideShowSwipeInList_iphone () <UIScrollViewDelegate>
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, strong) SlideShow *slideshow;
+@property NSInteger currentPage;
+
+@end
+
+@implementation SlideShowSwipeInList_iphone
+
+@synthesize comManager = _comManager;
+@synthesize currentPage = _currentPage;
+@synthesize slideshow = _slideshow;
+@synthesize timer = _timer;
+@synthesize stopWatch = _stopWatch;
+
+dispatch_queue_t backgroundQueue;
+
+
+- (void) viewDidLoad
+{
+ [super viewDidLoad];
+
+ self.comManager = [CommunicationManager sharedComManager];
+ self.slideshow = self.comManager.interpreter.slideShow;
+ self.slideshow.secondaryDelegate = self;
+
+ self.clearsSelectionOnViewWillAppear = NO;
+ // set stopwatch as default, users may swipe for a timer
+ self.currentPage = kDefaultTimerWidget;
+ [self.revealViewController setOwner:kDefaultTimerWidget];
+
+ // Instanciate stopwatch and start if autostart is set
+ self.stopWatch = [[StopWatch alloc] init];
+ if (kStopwatchAutoStart) {
+ [self.stopWatch start];
+ }
+
+ // Instanciate timer and start if autostart is set
+ self.timer = [[Timer alloc] init];
+ if (kCountDownTimerAutoStart){
+ [self.timer start];
+ }
+
+ self.tableView.backgroundColor = [UIColor colorWithRed:.674509804 green:.729411765 blue:.760784314 alpha:1.0];
+}
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ if (!self.stopWatch.set) {
+ [self.stopWatch setupWithTableViewCell:[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]];
+ }
+ if (!self.timer.set) {
+ [self.timer setupWithTableViewCell:[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]];
+ }
+ [self.stopWatch updateStartButtonIcon];
+ [self.timer updateStartButtonIcon];
+ if ([self.comManager.interpreter.slideShow size] > 0) {
+ NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.slideshow.currentSlide
+ inSection:1];
+ [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
+ [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
+ }
+}
+
+- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
+{
+ // configure the segue.
+ // in this case we dont swap out the front view controller, which is a UINavigationController.
+ // but we could..
+ if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] )
+ {
+ SWRevealViewControllerSegue* rvcs = (SWRevealViewControllerSegue*) segue;
+
+ SWRevealViewController* rvc = self.revealViewController;
+ NSAssert( rvc != nil, @"oops! must have a revealViewController" );
+
+ NSAssert( [rvc.frontViewController isKindOfClass: [UINavigationController class]], @"oops! for this segue we want a permanent navigation controller in the front!" );
+
+ rvcs.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
+
+ UINavigationController* nc = (UINavigationController*)rvc.frontViewController;
+ [nc setViewControllers: @[ dvc ] animated: YES ];
+
+ [rvc setFrontViewPosition: FrontViewPositionLeft animated: YES];
+ };
+ }
+}
+
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+ return 2;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+ // Section one used for stopwatch
+ if (section == 0)
+ return 1;
+ else
+ return [self.slideshow size];
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
+ return 23;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+
+ NSString *sectionTitle;
+ switch (section) {
+ case 0:
+ switch (self.currentPage) {
+ case 0:
+ sectionTitle = NSLocalizedString(@"Stop Watch", @"Sidebar section header");
+ break;
+ case 1:
+ sectionTitle = NSLocalizedString(@"Timer", @"Sidebar section header");
+ break;
+ default:
+ break;
+ }
+ break;
+ case 1:
+ sectionTitle = NSLocalizedString(@"Slides", @"Sidebar section header");
+ default:
+ break;
+ }
+
+ UILabel *label = [[UILabel alloc] init];
+ label.frame = CGRectMake(10, 0, 284, 23);
+ label.textColor = [UIColor whiteColor];
+ label.font = [UIFont boldSystemFontOfSize:14.0];
+ label.text = sectionTitle;
+ label.backgroundColor = [UIColor clearColor];
+
+ // Create header view and add label as a subview
+ UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 23)];
+ view.backgroundColor = [UIColor colorWithRed:1.0 green:0.662745098 blue:0.074509804 alpha:0.9];
+
+ [view addSubview:label];
+
+ if (section == 0)
+ {
+ UIPageControl * pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(self.revealViewController.rearViewRevealWidth - 20, view.frame.origin.y + 3, 40, 20)];
+ pageControl.numberOfPages = 2;
+ pageControl.currentPage = self.currentPage;
+
+ if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
+ {
+ pageControl.currentPageIndicatorTintColor = [UIColor whiteColor];
+ pageControl.pageIndicatorTintColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.7];
+ }
+ pageControl.tag = -100;
+ view.tag = -99;
+ label.tag = -98;
+ [view addSubview:pageControl];
+ }
+
+ return view;
+}
+
+- (void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
+{
+ [self performSegueWithIdentifier: @"sw_customized_segue" sender: [tableView cellForRowAtIndexPath: indexPath]];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ if (indexPath.section == 0) {
+ static NSString *CellIdentifier = @"stopWatch";
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
+ [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
+ UIView * view = [cell viewWithTag:8];
+ [view.layer setCornerRadius:5.0f];
+ view.layer.masksToBounds = YES;
+ view.clipsToBounds = YES;
+ [view setShadow];
+
+ view = [cell viewWithTag:9];
+ [view.layer setCornerRadius:5.0f];
+ view.layer.masksToBounds = YES;
+ view.clipsToBounds = YES;
+ [view setShadow];
+
+ UIScrollView * scroll = (UIScrollView *) [cell viewWithTag:7];
+ scroll.contentSize = CGSizeMake(412, 120);
+
+ CGRect frame = scroll.frame;
+ frame.origin.x = frame.size.width * self.currentPage;
+ frame.origin.y = 0;
+ [scroll scrollRectToVisible:frame animated:YES];
+
+ cell.contentView.backgroundColor = [UIColor colorWithRed:.674509804-0.02 * indexPath.row green:.729411765-0.02 * indexPath.row blue:.760784314-0.02 * indexPath.row alpha:1.0];
+
+ return cell;
+ } else {
+ static NSString *CellIdentifier = @"slide";
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
+ UILabel * slideNumber = (UILabel *)[cell viewWithTag:2];
+ UIImageView * image = (UIImageView *)[cell viewWithTag:1];
+
+ // Starting 20, all tags are used for thumbnails in this sidebar
+ [cell setTag:20+indexPath.row];
+ [self.slideshow getContentAtIndex:indexPath.row forView:cell];
+ [slideNumber setText:[NSString stringWithFormat:@"%u", indexPath.row+1]];
+
+ [image setShadow];
+
+ cell.contentView.backgroundColor = [UIColor colorWithRed:.674509804-0.02 * indexPath.row green:.729411765-0.02 * indexPath.row blue:.760784314-0.02 * indexPath.row alpha:1.0];
+
+ return cell;
+ }
+}
+
+- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
+ // Otherwise selection will disable background color and make slide number unreadable
+ if(indexPath.section == 1 && cell.selected){
+ UILabel *label = (UILabel *)[cell viewWithTag:2];
+ if ([label backgroundColor]!=[UIColor lightGrayColor]) {
+ [label setBackgroundColor:[UIColor lightGrayColor]];
+ }
+ }
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ if (indexPath.section == 0)
+ return;
+ [self.comManager.transmitter gotoSlide:indexPath.row];
+ [[[self.tableView cellForRowAtIndexPath:indexPath] viewWithTag:2] setBackgroundColor:[UIColor lightGrayColor]];
+ [self.revealViewController revealToggle: self];
+}
+
+- (void)viewDidUnload {
+ [self setStopWatch:nil];
+ [self setTimer:nil];
+ [super viewDidUnload];
+}
+
+#pragma mark scrollview delegate
+
+- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
+{
+ if (scrollView.tag == 7) {
+ CGFloat pageWidth = scrollView.frame.size.width;
+ float fractionalPage = scrollView.contentOffset.x / pageWidth;
+ NSInteger page = lround(fractionalPage);
+ if (self.currentPage != page) {
+ UIPageControl * pageControl = (UIPageControl *) ([[self.tableView viewWithTag:-99] viewWithTag:-100]);
+ UILabel * label = (UILabel *) ([[self.tableView viewWithTag:-99] viewWithTag:-98]);
+
+ CATransition *animation = [CATransition animation];
+ animation.duration = 0.5;
+ animation.type = kCATransitionMoveIn;
+ animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
+ [label.layer addAnimation:animation forKey:@"changeTextTransition"];
+
+ switch (page) {
+ case 0:
+ [label setText:NSLocalizedString(@"Stop Watch", @"Sidebar section header")];
+ [self.revealViewController setTitle:@""];
+ [self.revealViewController setOwner:STOPWATCH];
+ break;
+ case 1:
+ [label setText:NSLocalizedString(@"Timer", @"Sidebar section header")];
+ [self.revealViewController setTitle:@""];
+ [self.revealViewController setOwner:TIMER];
+ break;
+ default:
+ break;
+ }
+ [pageControl setCurrentPage:page];
+ self.currentPage = page;
+ }
+ }
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowViewController.h b/ios/iosremote/iosremote/Classes/SlideShowViewController.h
new file mode 100644
index 000000000000..f915d65b666c
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowViewController.h
@@ -0,0 +1,22 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#import <UIKit/UIKit.h>
+#import "SlideShow.h"
+
+@interface slideShowViewController : UIViewController
+
+@property (weak, nonatomic) IBOutlet UIImageView *image;
+@property (weak, nonatomic) IBOutlet UIWebView *lecturer_notes;
+
+@property (nonatomic, strong) SlideShow* slideshow;
+@property (nonatomic, strong) id slideShowImageReadyObserver;
+@property (nonatomic, strong) id slideShowNoteReadyObserver;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowViewController.m b/ios/iosremote/iosremote/Classes/SlideShowViewController.m
new file mode 100644
index 000000000000..5892ab983b35
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowViewController.m
@@ -0,0 +1,82 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "slideShowViewController.h"
+#import "SlideShow.h"
+#import "CommandTransmitter.h"
+#import "CommunicationManager.h"
+
+@interface slideShowViewController ()
+
+@property (nonatomic, strong) CommunicationManager* comManager;
+
+@end
+
+@implementation slideShowViewController
+
+@synthesize slideshow = _slideshow;
+@synthesize slideShowImageReadyObserver = _slideShowImageReadyObserver;
+@synthesize slideShowNoteReadyObserver = _slideShowNoteReadyObserver;
+@synthesize comManager = _comManager;
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+
+ self.slideShowImageReadyObserver =[center addObserverForName:MSG_SLIDE_CHANGED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ NSLog(@"Getting slide: %u image to display: %@", self.slideshow.currentSlide, [self.slideshow getImageAtIndex:self.slideshow.currentSlide]);
+
+ [self.image setImage:[self.slideshow getImageAtIndex:self.slideshow.currentSlide]];
+ [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:self.slideshow.currentSlide]baseURL:nil];
+ }];
+
+ self.slideShowNoteReadyObserver = [center addObserverForName:STATUS_CONNECTED_NOSLIDESHOW
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.navigationController popViewControllerAnimated:YES];
+ }];
+
+ self.comManager = [CommunicationManager sharedComManager];
+}
+
+- (IBAction)nextSlide:(id)sender {
+ [self.comManager.transmitter nextTransition];
+}
+
+- (IBAction)previousSlide:(id)sender {
+ [self.comManager.transmitter previousTransition];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self setImage:nil];
+ [self setLecturer_notes:nil];
+ [super viewDidUnload];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.h b/ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.h
new file mode 100644
index 000000000000..1ee4ea0dd6e3
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.h
@@ -0,0 +1,30 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#import <UIKit/UIKit.h>
+#import "SlideShow.h"
+
+@interface SlideShowViewController_iphone : UIViewController <AsyncLoadHorizontalTableDelegate>
+
+- (IBAction)nextSlideAction:(id)sender;
+- (IBAction)previousSlideAction:(id)sender;
+- (IBAction)pointerAction:(id)sender;
+
+@property (weak, nonatomic) IBOutlet UIView *notesView;
+@property (weak, nonatomic) IBOutlet UIWebView *lecturer_notes;
+@property (weak, nonatomic) IBOutlet UIImageView *slideView;
+@property (weak, nonatomic) IBOutlet UIImageView *secondarySlideView;
+@property (weak, nonatomic) IBOutlet UILabel *slideNumber;
+
+@property (weak, nonatomic) IBOutlet UIView *movingPointer;
+@property (weak, nonatomic) IBOutlet UIImageView *touchPointerImage;
+@property (weak, nonatomic) IBOutlet UIView *blockingView;
+@property (weak, nonatomic) IBOutlet UIView *bottomView;
+@property (weak, nonatomic) IBOutlet UIButton *pointerBtn;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.m b/ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.m
new file mode 100644
index 000000000000..f50af87d5a2e
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/SlideShowViewController~iphone.m
@@ -0,0 +1,311 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#import "SlideShowPreviewViewController~iphone.h"
+#import "PopoverView.h"
+#import "SlideShow.h"
+#import "UIView+FadeInFadeOut.h"
+#import "CommunicationManager.h"
+#import "SWRevealViewController.h"
+#import "SlideShowViewController~iphone.h"
+#import "CommandInterpreter.h"
+#import "stopWatch.h"
+#import "CommandTransmitter.h"
+#import "SlideShowPreviewViewController.h"
+#import "SlideShowSwipeInList~iphone.h"
+#import <QuartzCore/QuartzCore.h>
+#import "UIImageView+setImageAnimated.h"
+#import "UIView+Shadowing.h"
+#import <CoreMotion/CoreMotion.h>
+
+
+#define CURRENT_SLIDE_IMAGEVIEW 1
+#define NEXT_SLIDE_IMAGEVIEW 2
+#define TOUCH_POINTER_VIEW 3
+#define CURRENT_SLIDE_NOTES 4
+
+@interface SlideShowViewController_iphone () <PopoverViewDelegate>
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, strong) id slideShowImageNoteReadyObserver;
+@property (nonatomic, strong) id slideShowFinishedObserver;
+@property (nonatomic, strong) SlideShow* slideshow;
+
+@property CGPoint refLeftUpperGravity;
+@property CGPoint refRightUpperGravity;
+@property CGPoint refRightLowerGravity;
+
+// SWReveal Controller
+@property (readwrite) IBOutlet UIBarButtonItem* revealButtonItem;
+
+@end
+
+@implementation SlideShowViewController_iphone
+
+@synthesize comManager = _comManager;
+@synthesize slideShowImageNoteReadyObserver = _slideShowImageNoteReadyObserver;
+@synthesize slideShowFinishedObserver = _slideShowFinishedObserver;
+@synthesize slideshow = _slideshow;
+
+#pragma mark - Pointer
+
+- (IBAction)pointerAction:(id)sender {
+ if ([self.touchPointerImage isHidden]){
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.touchPointerImage];
+ CGPoint p = self.view.center;
+ p.y -= 50;
+ self.touchPointerImage.center = p;
+ [self.view removeGestureRecognizer:self.revealViewController.panGestureRecognizer];
+ } else {
+ [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
+ }
+ [self.touchPointerImage fadeInfadeOutwithDuration:0.0 maxAlpha:1.0];
+ [self.blockingView fadeInfadeOutwithDuration:0.0 maxAlpha:0.7];
+}
+
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+ UITouch *touch = [[event allTouches] anyObject];
+ if (!self.touchPointerImage.isHidden){
+ CGPoint loc = [touch locationInView:self.touchPointerImage];
+ if (loc.x >= 0 && loc.x <= self.touchPointerImage.frame.size.width
+ && loc.y >= 0 && loc.y <= self.touchPointerImage.frame.size.height){
+ CGPoint pointerInPercentage;
+ pointerInPercentage.x = loc.x / self.touchPointerImage.frame.size.width;
+ pointerInPercentage.y = loc.y / self.touchPointerImage.frame.size.height;
+ [self.comManager.transmitter setPointerVisibleAt:pointerInPercentage];
+
+ CGPoint p;
+ p.x = loc.x + self.touchPointerImage.frame.origin.x;
+ p.y = loc.y + self.touchPointerImage.frame.origin.y;
+ self.movingPointer.center = p;
+ [self.movingPointer setHidden:NO];
+ }
+ }
+
+ if ([touch view] == self.secondarySlideView)
+ {
+ // Change to the next slide when secondary slide is clicked
+ [self.comManager.transmitter gotoSlide:self.slideshow.currentSlide + 1];
+ }
+}
+
+- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ static int count = 0;
+ if (count < 1){
+ ++count;
+ return;
+ }
+ count = 0;
+ if (!self.touchPointerImage.isHidden){
+ UITouch *touch = [[event allTouches] anyObject];
+ CGPoint loc = [touch locationInView:self.touchPointerImage];
+ if (loc.x >= 0 && loc.x <= self.touchPointerImage.frame.size.width
+ && loc.y >= self.movingPointer.frame.size.height && loc.y <= self.touchPointerImage.frame.size.height - self.movingPointer.frame.size.height)
+ {
+ CGPoint pointerInPercentage;
+ pointerInPercentage.x = loc.x / self.touchPointerImage.frame.size.width;
+ pointerInPercentage.y = loc.y / self.touchPointerImage.frame.size.height;
+ [self.comManager.transmitter pointerCoordination:pointerInPercentage];
+
+ CGPoint p;
+ p.x = loc.x + self.touchPointerImage.frame.origin.x;
+ p.y = loc.y + self.touchPointerImage.frame.origin.y;
+ self.movingPointer.center = p;
+ }
+ }
+}
+
+- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ [self.movingPointer setHidden:YES];
+ [self.comManager.transmitter setPointerDismissed];
+}
+
+#pragma mark - System defaults
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
+{
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+
+- (NSUInteger) supportedInterfaceOrientations
+{
+ return UIInterfaceOrientationMaskPortrait;
+}
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (SlideShow *)slideshow
+{
+ return self.comManager.interpreter.slideShow;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ // Unique tag assignment. Don't use 0 as it's default. 0-10 for central VC
+ [self.slideView setTag:CURRENT_SLIDE_IMAGEVIEW];
+ [self.secondarySlideView setTag:NEXT_SLIDE_IMAGEVIEW];
+ [self.lecturer_notes setTag:CURRENT_SLIDE_NOTES];
+ [self.touchPointerImage setTag:TOUCH_POINTER_VIEW];
+
+ self.comManager = [CommunicationManager sharedComManager];
+ self.slideshow.delegate = self;
+
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.slideView];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide+1 forView:self.secondarySlideView];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.lecturer_notes];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.touchPointerImage];
+ [self.slideNumber setText:[NSString stringWithFormat:@"%u/%u", [self.slideshow currentSlide]+1, [self.slideshow size]]];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"gear_transparent_bg"]
+ style:UIBarButtonItemStyleBordered
+ target:self
+ action:@selector(popOverStart:)];
+
+ self.revealViewController.navigationItem.rightBarButtonItem = backButton;
+
+ self.revealButtonItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"more_icon"]
+ style:UIBarButtonItemStyleBordered
+ target:self.revealViewController
+ action:@selector( revealToggle: )];
+ self.revealViewController.navigationItem.leftBarButtonItem = self.revealButtonItem;
+
+ self.movingPointer.layer.cornerRadius = 3;
+
+ [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
+}
+
+- (void) popOverStart:(id)sender
+{
+ if (!isBlank) {
+ [PopoverView showPopoverAtPoint: CGPointMake([[sender view] center].x, [[sender view] center].y + [[sender view] frame].size.height * 0.5)
+ inView:[sender view].superview
+ withStringArray:[NSArray arrayWithObjects:NSLocalizedString(@"Stop Presentation", nil), NSLocalizedString(@"Restart", nil), NSLocalizedString(@"Blank Screen", nil), nil]
+ delegate:self];
+ } else {
+ [PopoverView showPopoverAtPoint: CGPointMake([[sender view] center].x, [[sender view] center].y + [[sender view] frame].size.height * 0.5)
+ inView:[sender view].superview
+ withStringArray:[NSArray arrayWithObjects:NSLocalizedString(@"Stop Presentation", nil), NSLocalizedString(@"Restart", nil), NSLocalizedString(@"Resume from blank screen", nil), nil]
+ delegate:self];
+ }
+}
+
+- (void) viewWillAppear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+}
+
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+
+ [[(SlideShowSwipeInList_iphone *)self.revealViewController.rearViewController stopWatch] setDelegate:self.revealViewController];
+
+ [[(SlideShowSwipeInList_iphone *)self.revealViewController.rearViewController timer] setDelegate:self.revealViewController];
+
+ self.slideShowImageNoteReadyObserver =[center addObserverForName:MSG_SLIDE_CHANGED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.slideView];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.touchPointerImage];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide+1 forView:self.secondarySlideView];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.lecturer_notes];
+ [self.slideNumber setText:[NSString stringWithFormat:@"%u/%u", [self.slideshow currentSlide]+1, [self.slideshow size]]];
+
+ }];
+
+ self.slideShowFinishedObserver = [center addObserverForName:STATUS_CONNECTED_NOSLIDESHOW
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.navigationController popViewControllerAnimated:YES];
+ }];
+ [self.slideView setShadow];
+ [self.secondarySlideView setShadow];
+
+ [super viewDidAppear:animated];
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowFinishedObserver];
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowImageNoteReadyObserver];
+ [[(SlideShowSwipeInList_iphone *)self.revealViewController.rearViewController timer] clear];
+ [super viewDidDisappear:animated];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self setLecturer_notes:nil];
+ [self setSlideView:nil];
+ [self setSlideNumber:nil];
+ [self setSecondarySlideView:nil];
+ [self setNotesView:nil];
+ [self setMovingPointer:nil];
+ [self setBlockingView:nil];
+ [self setBottomView:nil];
+ [self setPointerBtn:nil];
+ [super viewDidUnload];
+}
+
+#pragma mark - Slides Control
+- (IBAction)nextSlideAction:(id)sender {
+ [[self.comManager transmitter] nextTransition];
+}
+
+- (IBAction)previousSlideAction:(id)sender {
+ [[self.comManager transmitter] previousTransition];
+}
+
+static BOOL isBlank = NO;
+#pragma mark - PopOver delegates
+- (void) popoverView:(PopoverView *)popoverView didSelectItemAtIndex:(NSInteger)index
+{
+ [popoverView dismiss];
+ switch (index) {
+ case 0:
+ // Stop Presentation
+ [self.comManager.transmitter stopPresentation];
+ [self.navigationController popViewControllerAnimated:YES];
+ break;
+ case 1:
+ [self.comManager.transmitter gotoSlide:0];
+ break;
+ case 2:
+ if (!isBlank) {
+ [self.comManager.transmitter blankScreen];
+ } else {
+ [self.comManager.transmitter resume];
+ }
+ isBlank = !isBlank;
+ break;
+ default:
+ NSLog(@"Pop over didSelectItemAtIndex out of bound, should not happen");
+ break;
+ }
+}
+
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/StopWatch.h b/ios/iosremote/iosremote/Classes/StopWatch.h
new file mode 100644
index 000000000000..0c4c5c5ed90d
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/StopWatch.h
@@ -0,0 +1,38 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <Foundation/Foundation.h>
+
+#define TIMER_STATE_RUNNING 0
+#define TIMER_STATE_PAUSED 1
+#define TIMER_STATE_CLEARED 2
+
+@protocol StopWatchDelegate <NSObject>
+
+- (void) setTitle:(NSString *) title sender:(id)sender;
+
+@end
+
+@interface StopWatch : NSObject
+
+// StopWatch
+@property (strong, nonatomic) NSTimer *stopWatchTimer;
+@property (strong, nonatomic) NSDate *startDate;
+@property BOOL set;
+@property (weak, nonatomic) id<StopWatchDelegate> delegate;
+
+- (StopWatch *) initWithStartButton:(UIButton *)startButton
+ ClearButton:(UIButton *)clearButton
+ TimeLabel:(UILabel *)timeLabel;
+- (void) setupWithTableViewCell:(UITableViewCell *)cell;
+
+- (void) start;
+- (void) clear;
+- (void) updateStartButtonIcon;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/StopWatch.m b/ios/iosremote/iosremote/Classes/StopWatch.m
new file mode 100644
index 000000000000..bb3612f265c6
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/StopWatch.m
@@ -0,0 +1,175 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "stopWatch.h"
+
+@interface StopWatch ()
+
+@property NSTimeInterval lastInterval;
+@property int state;
+@property (weak, nonatomic) UIButton * startButton;
+@property (weak, nonatomic) UIButton * clearButton;
+@property (weak, nonatomic) UILabel * timeLabel;
+
+@end
+
+@implementation StopWatch
+@synthesize startButton = _startButton;
+@synthesize clearButton = _clearButton;
+@synthesize timeLabel = _timeLabel;
+
+@synthesize lastInterval = _lastInterval;
+
+
+- (StopWatch *) init
+{
+ self = [super init];
+ self.state = TIMER_STATE_CLEARED;
+ self.set = NO;
+
+ return self;
+}
+
+- (StopWatch *) initWithStartButton:(UIButton *)startButton
+ ClearButton:(UIButton *)clearButton
+ TimeLabel:(UILabel *)timeLabel
+{
+ self = [self init];
+
+ self.startButton = startButton;
+ self.clearButton = clearButton;
+ self.timeLabel = timeLabel;
+
+ [self setupActions];
+ return self;
+}
+
+- (void) setupWithTableViewCell:(UITableViewCell *)cell
+{
+ self.startButton = (UIButton *)[[cell viewWithTag:8] viewWithTag:2];
+ self.clearButton = (UIButton *)[[cell viewWithTag:8] viewWithTag:3];
+ self.timeLabel = (UILabel *)[[cell viewWithTag:8] viewWithTag:1];
+
+ [self setupActions];
+}
+
+- (void) setupActions
+{
+ [self.startButton addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
+ [self.clearButton addTarget:self action:@selector(clear) forControlEvents:UIControlEventTouchUpInside];
+ self.set = YES;
+}
+
+- (void)updateTimer
+{
+ // Create date from the elapsed time
+ NSDate *currentDate = [NSDate date];
+ NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.startDate] + self.lastInterval;
+ NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
+
+ // Create a date formatter
+ NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
+ [dateFormatter setDateFormat:@"HH:mm:ss"];
+ [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
+
+ // Format the elapsed time and set it to the label
+ NSString *timeString = [dateFormatter stringFromDate:timerDate];
+ self.timeLabel.text = timeString;
+ [self.delegate setTitle:timeString sender:self];
+}
+
+
+- (void) start
+{
+ switch (self.state) {
+ case TIMER_STATE_RUNNING:
+ self.state = TIMER_STATE_PAUSED;
+ [self.stopWatchTimer invalidate];
+ [self.delegate setTitle:@"" sender:self];
+ self.lastInterval += [[NSDate date] timeIntervalSinceDate:self.startDate];
+ break;
+ case TIMER_STATE_PAUSED:
+ self.state = TIMER_STATE_RUNNING;
+ self.startDate = [NSDate date];
+ self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
+ target:self
+ selector:@selector(updateTimer)
+ userInfo:nil
+ repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:self.stopWatchTimer forMode:NSRunLoopCommonModes];
+ break;
+ case TIMER_STATE_CLEARED:
+ self.state = TIMER_STATE_RUNNING;
+ self.startDate = [NSDate date];
+ // Create the stop watch timer that fires every 100 ms
+ self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
+ target:self
+ selector:@selector(updateTimer)
+ userInfo:nil
+ repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:self.stopWatchTimer forMode:NSRunLoopCommonModes];
+ break;
+ default:
+ break;
+ }
+
+ [self updateStartButtonIcon];
+}
+
+- (void) updateStartButtonIcon
+{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
+ switch (self.state) {
+ case TIMER_STATE_RUNNING:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_pause_btn_dark"] forState:UIControlStateNormal];
+ [self.startButton setTitle:NSLocalizedString(@"Pause", @"Update button text in diffrent states") forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_PAUSED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn_dark"] forState:UIControlStateNormal];
+ [self.startButton setTitle:NSLocalizedString(@"Start", @"Update button text in diffrent states") forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_CLEARED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn_dark"] forState:UIControlStateNormal];
+ [self.startButton setTitle:NSLocalizedString(@"Start", @"Update button text in diffrent states") forState:UIControlStateNormal];
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (self.state) {
+ case TIMER_STATE_RUNNING:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_pause_btn"] forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_PAUSED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn"] forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_CLEARED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn"] forState:UIControlStateNormal];
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+- (void) clear
+{
+ [self.stopWatchTimer invalidate];
+ self.stopWatchTimer = nil;
+ self.startDate = [NSDate date];
+ self.lastInterval = 0;
+ self.state = TIMER_STATE_CLEARED;
+
+ [self updateStartButtonIcon];
+
+ [self updateTimer];
+ [self.delegate setTitle:@"" sender:self];
+}
+
+@end
+
diff --git a/ios/iosremote/iosremote/Classes/Timer.h b/ios/iosremote/iosremote/Classes/Timer.h
new file mode 100644
index 000000000000..8e3e6a673d30
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/Timer.h
@@ -0,0 +1,46 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <Foundation/Foundation.h>
+
+#define TIMER_STATE_RUNNING 0
+#define TIMER_STATE_PAUSED 1
+#define TIMER_STATE_CLEARED 2
+
+@class Timer;
+
+@protocol TimerDelegate <NSObject>
+
+- (void) startTimePickerwithTimer:(Timer *) timer;
+
+@optional
+- (void) setTitle:(NSString *) title sender:(id)sender;
+
+@end
+
+@interface Timer : NSObject
+
+// Timer
+@property (strong, nonatomic) NSTimer *timerTimer;
+@property BOOL set;
+@property (weak, nonatomic) id<TimerDelegate> delegate;
+
+- (Timer *) initWithStartButton:(UIButton *)startButton
+ ClearButton:(UIButton *)clearButton
+ SetTimeButton:(UIButton *)setTimeButton
+ TimeLabel:(UILabel *)timeLabel;
+- (void) setupWithTableViewCell:(UITableViewCell *)cell;
+
+- (void) start;
+- (void) clear;
+- (void) updateStartButtonIcon;
+
+- (void) setSecondsLeft:(NSTimeInterval)duration;
+
+@end
+
diff --git a/ios/iosremote/iosremote/Classes/Timer.m b/ios/iosremote/iosremote/Classes/Timer.m
new file mode 100644
index 000000000000..e493a9681d72
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/Timer.m
@@ -0,0 +1,230 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "Timer.h"
+#import <AudioToolbox/AudioServices.h>
+
+@interface Timer ()
+
+@property int state;
+@property (weak, nonatomic) UIButton * startButton;
+@property (weak, nonatomic) UIButton * clearButton;
+@property (weak, nonatomic) UIButton * setTimeButton;
+@property (weak, nonatomic) UILabel * timeLabel;
+
+@end
+
+@implementation Timer
+
+@synthesize startButton = _startButton;
+@synthesize clearButton = _clearButton;
+@synthesize timeLabel = _timeLabel;
+@synthesize setTimeButton = _setTimeButton;
+
+int hours, minutes, seconds;
+int secondsLeft;
+int initSecondsLeft;
+int vibrationCount;
+
+- (Timer *) init
+{
+ self = [super init];
+ self.state = TIMER_STATE_CLEARED;
+ self.set = NO;
+ secondsLeft = kCountDownTimerDefaultDuration * 60;
+ initSecondsLeft = secondsLeft;
+
+ return self;
+}
+
+- (Timer *) initWithStartButton:(UIButton *)startButton
+ ClearButton:(UIButton *)clearButton
+ SetTimeButton:(UIButton *)setTimeButton
+ TimeLabel:(UILabel *)timeLabel
+{
+ self = [self init];
+
+ self.startButton = startButton;
+ self.clearButton = clearButton;
+ self.setTimeButton = setTimeButton;
+ self.timeLabel = timeLabel;
+
+ [self setupActions];
+ return self;
+}
+
+- (void) setupWithTableViewCell:(UITableViewCell *)cell
+{
+ self.startButton = (UIButton *)[[cell viewWithTag:9] viewWithTag:2];
+ self.clearButton = (UIButton *)[[cell viewWithTag:9] viewWithTag:3];
+ self.setTimeButton = (UIButton *)[[cell viewWithTag:9] viewWithTag:4];
+ self.timeLabel = (UILabel *)[[cell viewWithTag:9] viewWithTag:1];
+
+ [self setupActions];
+// [self clear];
+}
+
+- (void) setupActions
+{
+ [self.startButton addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
+ [self.clearButton addTarget:self action:@selector(clear) forControlEvents:UIControlEventTouchUpInside];
+ // Sending the sender as well, so that we get a handle on the Timer itself ---> allow us to update seconds left
+ [self.setTimeButton addTarget:self action:@selector(startTimePickerwithTimer) forControlEvents:UIControlEventTouchUpInside];
+ self.set = YES;
+}
+
+- (void)startTimePickerwithTimer
+{
+ if (self.state == TIMER_STATE_RUNNING) {
+ // If running, we switch it to pause before setting a new duration
+ [self start];
+ }
+ [self.delegate startTimePickerwithTimer:self];
+}
+
+- (void)updateTimer
+{
+ // Create date from the elapsed time
+ if (secondsLeft > 0) {
+ secondsLeft--;
+ hours = secondsLeft / 3600;
+ minutes = (secondsLeft % 3600) / 60;
+ seconds = (secondsLeft %3600) % 60;
+ self.timeLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
+ [self.delegate setTitle:[NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds] sender:self];
+ } else {
+ // flash timer label in red
+ static BOOL disappear = NO;
+ if (!disappear) {
+ disappear = YES;
+ self.timeLabel.text = @"";
+ [self.delegate setTitle:@"" sender:self];
+ } else {
+ disappear = NO;
+ self.timeLabel.text = @"00:00:00";
+ [self.delegate setTitle:@"00:00:00" sender:self];
+ // Vibrate the phone if supported (i.e. this works on iPhone but not iPad)
+ // On ipad this just get ignored
+ if (kCountDownTimerVibration && vibrationCount < 3){
+ vibrationCount++;
+ AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
+ }
+ }
+ }
+}
+
+
+- (void) start
+{
+ // Reset vibration count to 0 on each start so that we vibrate 3 times maxi.
+ vibrationCount = 0;
+ switch (self.state) {
+ case TIMER_STATE_RUNNING:
+ self.state = TIMER_STATE_PAUSED;
+ [self.timerTimer invalidate];
+ if (secondsLeft == 0) {
+ [self.timeLabel setText:@"00:00:00"];
+ }
+ [self.delegate setTitle:@"" sender:self];
+ break;
+ case TIMER_STATE_PAUSED:
+ self.state = TIMER_STATE_RUNNING;
+ self.timerTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
+ target:self
+ selector:@selector(updateTimer)
+ userInfo:nil
+ repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:self.timerTimer forMode:NSRunLoopCommonModes];
+ break;
+ case TIMER_STATE_CLEARED:
+ self.state = TIMER_STATE_RUNNING;
+ secondsLeft++;
+ [self updateTimer];
+ // Create the stop watch timer that fires every 100 ms
+ [self.timerTimer invalidate];
+ self.timerTimer = nil;
+ self.timerTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
+ target:self
+ selector:@selector(updateTimer)
+ userInfo:nil
+ repeats:YES];
+ [[NSRunLoop currentRunLoop] addTimer:self.timerTimer forMode:NSRunLoopCommonModes];
+ initSecondsLeft = secondsLeft;
+ break;
+ default:
+ break;
+ }
+
+ [self updateStartButtonIcon];
+}
+
+- (void) updateStartButtonIcon
+{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
+ switch (self.state) {
+ case TIMER_STATE_RUNNING:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_pause_btn_dark"] forState:UIControlStateNormal];
+ [self.startButton setTitle:NSLocalizedString(@"Pause", @"Update button text in diffrent states") forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_PAUSED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn_dark"] forState:UIControlStateNormal];
+ [self.startButton setTitle:NSLocalizedString(@"Start", @"Update button text in diffrent states") forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_CLEARED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn_dark"] forState:UIControlStateNormal];
+ [self.startButton setTitle:NSLocalizedString(@"Start", @"Update button text in diffrent states") forState:UIControlStateNormal];
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (self.state) {
+ case TIMER_STATE_RUNNING:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_pause_btn"] forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_PAUSED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn"] forState:UIControlStateNormal];
+ break;
+ case TIMER_STATE_CLEARED:
+ [self.startButton setImage:[UIImage imageNamed:@"timer_start_btn"] forState:UIControlStateNormal];
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+- (void) clear
+{
+ [self.timerTimer invalidate];
+ self.timerTimer = nil;
+ self.state = TIMER_STATE_CLEARED;
+
+ [self updateStartButtonIcon];
+ [self.delegate setTitle:@"" sender:self];
+
+ secondsLeft = initSecondsLeft;
+
+ hours = secondsLeft / 3600;
+ minutes = (secondsLeft % 3600) / 60;
+ seconds = (secondsLeft %3600) % 60;
+ self.timeLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
+}
+
+- (void) setSecondsLeft:(NSTimeInterval)duration
+{
+ secondsLeft = (int) duration;
+ initSecondsLeft = secondsLeft;
+ hours = secondsLeft / 3600;
+ minutes = (secondsLeft % 3600) / 60;
+ seconds = (secondsLeft %3600) % 60;
+ self.timeLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
+}
+
+@end
+
diff --git a/ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.h b/ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.h
new file mode 100644
index 000000000000..1474d166463a
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.h
@@ -0,0 +1,15 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface WalkThroughContainerViewController : UIViewController <UIPageViewControllerDataSource>
+
+@property (strong, nonatomic) UIPageViewController *pageController;
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.m b/ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.m
new file mode 100644
index 000000000000..ace14fcca3d9
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/WalkThroughContainerViewController.m
@@ -0,0 +1,109 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "WalkThroughContainerViewController.h"
+#import "WalkThroughPageViewController.h"
+#import <QuartzCore/QuartzCore.h>
+
+@interface WalkThroughContainerViewController ()
+
+@end
+
+@implementation WalkThroughContainerViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
+
+ self.pageController.dataSource = self;
+ [[self.pageController view] setFrame:[[self view] bounds]];
+ WalkThroughPageViewController *initialPageViewController = [self viewControllerAtIndex:0];
+ NSArray *viewControllers = [NSArray arrayWithObject:initialPageViewController];
+
+ [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
+ [self addChildViewController:self.pageController];
+ [[self view] addSubview:self.pageController.view];
+ [self.pageController didMoveToParentViewController:self];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Ok, thanks", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)];
+ [backButton setBackgroundImage:[UIImage imageNamed:@"backButton"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ self.navigationItem.leftBarButtonItem = backButton;
+
+ [self setTitle:NSLocalizedString(@"How-to", nil)];
+
+ self.navigationController.navigationBar.translucent = NO;
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+#pragma mark UIPageViewControllerDataSource methods
+
+- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
+{
+ NSUInteger index = [(WalkThroughPageViewController *)viewController index];
+
+ if (index == 0) {
+ return nil;
+ }
+
+ index--;
+
+ return [self viewControllerAtIndex:index];
+}
+
+- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
+{
+ NSUInteger index = [(WalkThroughPageViewController *)viewController index];
+
+ index++;
+
+ if (index == 3) {
+ return nil;
+ }
+
+ return [self viewControllerAtIndex:index];
+}
+
+- (WalkThroughPageViewController *)viewControllerAtIndex:(NSUInteger)index {
+
+ WalkThroughPageViewController *childViewController;
+ if (index == 2) {
+ childViewController = [[WalkThroughPageViewController alloc] initWithNibName:@"WalkThroughPageViewMainImageController" bundle:nil];
+ } else {
+ childViewController = [[WalkThroughPageViewController alloc] initWithNibName:@"WalkThroughPageViewController" bundle:nil];
+ }
+ childViewController.index = index;
+
+ return childViewController;
+}
+
+- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
+ // The number of items reflected in the page indicator.
+ return 3;
+}
+
+- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
+ // The selected item reflected in the page indicator.
+ return 0;
+}
+
+@end
diff --git a/ios/iosremote/iosremote/Classes/WalkThroughPageViewController.h b/ios/iosremote/iosremote/Classes/WalkThroughPageViewController.h
new file mode 100644
index 000000000000..08b293ac146f
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/WalkThroughPageViewController.h
@@ -0,0 +1,22 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import <UIKit/UIKit.h>
+
+@interface WalkThroughPageViewController : UIViewController
+@property (weak, nonatomic) IBOutlet UIImageView *image;
+@property (weak, nonatomic) IBOutlet UILabel *instructionTitle;
+@property (weak, nonatomic) IBOutlet UILabel *instructionText;
+@property (weak, nonatomic) IBOutlet UIImageView *hintImage;
+@property (weak, nonatomic) IBOutlet UILabel *instructionHint;
+@property (weak, nonatomic) IBOutlet UILabel *indexLabl;
+@property (weak, nonatomic) IBOutlet UIButton *okButton;
+
+- (IBAction)okButtonHandleBack:(id)sender;
+@property (assign, nonatomic) NSInteger index;
+@end
diff --git a/ios/iosremote/iosremote/Classes/WalkThroughPageViewController.m b/ios/iosremote/iosremote/Classes/WalkThroughPageViewController.m
new file mode 100644
index 000000000000..a53ccf5eefbe
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/WalkThroughPageViewController.m
@@ -0,0 +1,87 @@
+// -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+//
+// This file is part of the LibreOffice project.
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#import "WalkThroughPageViewController.h"
+
+@interface WalkThroughPageViewController ()
+
+@end
+
+@implementation WalkThroughPageViewController
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view from its nib.
+
+ switch (self.index) {
+ case 0:
+ [self.image setImage:[UIImage imageNamed:@"WTconnection"]];
+ self.instructionText.text = @"Connect your devices to the same WiFi network.";
+ self.instructionHint.text = @"Create a personal hotspot on your iPhone if needed.";
+ self.instructionTitle.text = @"Connection";
+ [self.hintImage setImage:[UIImage imageNamed:@"WTConnectionHotspot"]];
+ break;
+ case 1:
+ [self.image setImage:[UIImage imageNamed:@"WTconnecting"]];
+ self.instructionText.text = @"Launch Impress & select your computer.";
+ self.instructionHint.text = @"Enter the PIN code in SlideShow - Impress Remote";
+ self.instructionTitle.text = @"Pairing";
+ [self.hintImage setImage:[UIImage imageNamed:@"WTPairing"]];
+ break;
+ case 2:{
+ if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
+ [self.image setImage:[UIImage imageNamed:@"WTcontrol~iphone"]];
+ else
+ [self.image setImage:[UIImage imageNamed:@"WTcontrol~ipad"]];
+// self.instructionText.text = @"Control your presentation at your fingertips!";
+ self.instructionTitle.text = @"Control";
+ UIImage *backgroundImage = [UIImage imageNamed:@"buttonBackground"];
+ UIEdgeInsets insets = UIEdgeInsetsMake(20, 7, 20, 7);
+ UIImage *stretchableBackgroundImage = [backgroundImage resizableImageWithCapInsets:insets];
+
+ [self.okButton setBackgroundImage:stretchableBackgroundImage forState:UIControlStateNormal];
+
+ self.okButton.hidden = NO;
+ break;
+ }
+ default:
+ break;
+ }
+ self.indexLabl.text = [NSString stringWithFormat:@"%d", self.index+1];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self setImage:nil];
+ [self setInstructionText:nil];
+ [self setInstructionTitle:nil];
+ [self setOkButton:nil];
+ [self setInstructionHint:nil];
+ [self setIndexLabl:nil];
+ [self setHintImage:nil];
+ [super viewDidUnload];
+}
+- (IBAction)okButtonHandleBack:(id)sender {
+ [self.navigationController popToRootViewControllerAnimated:YES];
+}
+@end
diff --git a/ios/iosremote/iosremote/Classes/slideShow_vc.m b/ios/iosremote/iosremote/Classes/slideShow_vc.m
new file mode 100644
index 000000000000..3fc86167d1d6
--- /dev/null
+++ b/ios/iosremote/iosremote/Classes/slideShow_vc.m
@@ -0,0 +1,146 @@
+/
+// slideShow_vc.m
+// iosremote
+//
+// Created by Liu Siqi on 7/5/13.
+// Copyright (c) 2013 libreoffice. All rights reserved.
+//
+
+#import "slideShow_vc.h"
+#import "SlideShow.h"
+#import "CommunicationManager.h"
+#import "CommandInterpreter.h"
+#import "CommandTransmitter.h"
+#import <QuartzCore/QuartzCore.h>
+
+
+#define CURRENT_SLIDE_IMAGEVIEW 1
+#define NEXT_SLIDE_IMAGEVIEW 2
+#define CURRENT_SLIDE_NOTES 2
+
+@interface slideShow_vc ()
+
+@property (nonatomic, strong) CommunicationManager *comManager;
+@property (nonatomic, strong) id slideShowImageNoteReadyObserver;
+@property (nonatomic, strong) id slideShowFinishedObserver;
+@property (nonatomic, strong) SlideShow* slideshow;
+
+@end
+
+@implementation slideShow_vc
+
+@synthesize comManager = _comManager;
+@synthesize slideShowImageNoteReadyObserver = _slideShowImageNoteReadyObserver;
+@synthesize slideShowFinishedObserver = _slideShowFinishedObserver;
+@synthesize slideshow = _slideshow;
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+ if (self) {
+ // Custom initialization
+ }
+ return self;
+}
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ self.comManager = [CommunicationManager sharedComManager];
+ self.slideshow = [self.comManager.interpreter slideShow];
+ self.slideshow.delegate = self;
+
+ [self.slideView setImage:[self.slideshow getImageAtIndex:self.slideshow.currentSlide]];
+ [self.lecturer_notes loadHTMLString: [self.slideshow getNotesAtIndex:self.slideshow.currentSlide]baseURL:nil];
+ [self.slideNumber setText:[NSString stringWithFormat:@"%u/%u", [self.slideshow currentSlide]+1, [self.slideshow size]]];
+
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"End"
+ style:UIBarButtonItemStyleBordered
+ target:self
+ action:@selector(handleBack:)];
+ self.navigationItem.leftBarButtonItem = backButton;
+}
+
+- (void) handleBack:(id)sender
+{
+ [self.comManager.transmitter stopPresentation];
+ [self.navigationController popViewControllerAnimated:YES];
+}
+
+
+- (void) viewDidAppear:(BOOL)animated
+{
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+ NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
+
+ self.slideShowImageNoteReadyObserver =[center addObserverForName:MSG_SLIDE_CHANGED
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ NSLog(@"Getting slide: %u image to display: %@", self.slideshow.currentSlide, [self.slideshow getImageAtIndex:self.slideshow.currentSlide]);
+
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.slideshow];
+ [self.slideshow getContentAtIndex:self.slideshow.currentSlide forView:self.lecturer_notes];
+
+ [self.slideNumber setText:[NSString stringWithFormat:@"%u/%u", [self.slideshow currentSlide]+1, [self.slideshow size]]];
+
+ }];
+
+ self.slideShowFinishedObserver = [center addObserverForName:STATUS_CONNECTED_NOSLIDESHOW
+ object:nil
+ queue:mainQueue
+ usingBlock:^(NSNotification *note) {
+ [self.navigationController popViewControllerAnimated:YES];
+ }];
+ self.slideView.layer.shadowColor = [[UIColor blackColor] CGColor];
+ self.slideView.layer.shadowOpacity = 0.5;
+ self.slideView.layer.shadowRadius = 4.0;
+ self.slideView.layer.shadowOffset = CGSizeMake(3.0f, 3.0f);
+ self.slideView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.slideView.bounds].CGPath;
+ self.slideView.clipsToBounds = NO;
+
+ self.secondarySlideView.layer.shadowColor = [[UIColor blackColor] CGColor];
+ self.secondarySlideView.layer.shadowOpacity = 0.5;
+ self.secondarySlideView.layer.shadowRadius = 4.0;
+ self.secondarySlideView.layer.shadowOffset = CGSizeMake(3.0f, 3.0f);
+ self.secondarySlideView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.secondarySlideView.bounds].CGPath;
+ self.secondarySlideView.clipsToBounds = NO;
+
+ [super viewDidAppear:animated];
+}
+
+- (void) viewDidDisappear:(BOOL)animated
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowFinishedObserver];
+ [[NSNotificationCenter defaultCenter] removeObserver:self.slideShowImageNoteReadyObserver];
+ [super viewDidDisappear:animated];
+}
+
+
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+- (void)viewDidUnload {
+ [self setLecturer_notes:nil];
+ [self setSlideView:nil];
+ [self setSlideNumber:nil];
+ [self setSecondarySlideView:nil];
+ [self setNotesView:nil];
+ [super viewDidUnload];
+}
+
+- (IBAction)nextSlideAction:(id)sender {
+ [[self.comManager transmitter] nextTransition];
+}
+
+- (IBAction)previousSlideAction:(id)sender {
+ [[self.comManager transmitter] previousTransition];
+}
+
+- (IBAction)pointerAction:(id)sender {
+}
+@end
diff --git a/ios/iosremote/iosremote/Ressources/WTConnectionHotspot.png b/ios/iosremote/iosremote/Ressources/WTConnectionHotspot.png
new file mode 100644
index 000000000000..36fa62305dfb
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTConnectionHotspot.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/WTPairing.png b/ios/iosremote/iosremote/Ressources/WTPairing.png
new file mode 100644
index 000000000000..3cc2be9242b2
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTPairing.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/WTPairingScreenshot.png b/ios/iosremote/iosremote/Ressources/WTPairingScreenshot.png
new file mode 100644
index 000000000000..0c05c1998ccd
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTPairingScreenshot.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/WTconnecting.png b/ios/iosremote/iosremote/Ressources/WTconnecting.png
new file mode 100644
index 000000000000..cd61d40706b4
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTconnecting.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/WTconnection.png b/ios/iosremote/iosremote/Ressources/WTconnection.png
new file mode 100644
index 000000000000..84acd1225cf8
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTconnection.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/WTcontrol~ipad.png b/ios/iosremote/iosremote/Ressources/WTcontrol~ipad.png
new file mode 100644
index 000000000000..7b97a6d532c5
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTcontrol~ipad.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/WTcontrol~iphone.png b/ios/iosremote/iosremote/Ressources/WTcontrol~iphone.png
new file mode 100644
index 000000000000..139de227a311
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/WTcontrol~iphone.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/add.png b/ios/iosremote/iosremote/Ressources/add.png
new file mode 100644
index 000000000000..c8045fb1be91
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/add.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/add@2x.png b/ios/iosremote/iosremote/Ressources/add@2x.png
new file mode 100644
index 000000000000..04054f908f62
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/add@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/backButton.png b/ios/iosremote/iosremote/Ressources/backButton.png
new file mode 100644
index 000000000000..84b8d662cfc6
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/backButton.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/backButton@2x.png b/ios/iosremote/iosremote/Ressources/backButton@2x.png
new file mode 100644
index 000000000000..27e6632ac2d6
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/backButton@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/buttonBackground.png b/ios/iosremote/iosremote/Ressources/buttonBackground.png
new file mode 100644
index 000000000000..f015ee682239
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/buttonBackground.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/buttonBackground@2x.png b/ios/iosremote/iosremote/Ressources/buttonBackground@2x.png
new file mode 100644
index 000000000000..7d5720090bbf
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/buttonBackground@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/forwardButton.png b/ios/iosremote/iosremote/Ressources/forwardButton.png
new file mode 100644
index 000000000000..aa71d1c2fa7d
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/forwardButton.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/forwardButton@2x.png b/ios/iosremote/iosremote/Ressources/forwardButton@2x.png
new file mode 100644
index 000000000000..ea1664245224
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/forwardButton@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/gear_transparent_bg.png b/ios/iosremote/iosremote/Ressources/gear_transparent_bg.png
new file mode 100644
index 000000000000..6aef9d0d455d
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/gear_transparent_bg.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/gear_transparent_bg@2x.png b/ios/iosremote/iosremote/Ressources/gear_transparent_bg@2x.png
new file mode 100644
index 000000000000..0457b5f79d52
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/gear_transparent_bg@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/impress.jpeg b/ios/iosremote/iosremote/Ressources/impress.jpeg
new file mode 100644
index 000000000000..89923c66db27
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/impress.jpeg
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/iosremote_ipad_icon.png b/ios/iosremote/iosremote/Ressources/iosremote_ipad_icon.png
new file mode 100644
index 000000000000..33dda09636b9
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/iosremote_ipad_icon.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/iosremote_ipad_icon@2x.png b/ios/iosremote/iosremote/Ressources/iosremote_ipad_icon@2x.png
new file mode 100644
index 000000000000..1fce03ca7f18
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/iosremote_ipad_icon@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/iosremote_iphone_icon.png b/ios/iosremote/iosremote/Ressources/iosremote_iphone_icon.png
new file mode 100644
index 000000000000..84e23cd5809b
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/iosremote_iphone_icon.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/iosremote_iphone_icon@2x.png b/ios/iosremote/iosremote/Ressources/iosremote_iphone_icon@2x.png
new file mode 100644
index 000000000000..c3a41c22bed6
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/iosremote_iphone_icon@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/more_icon.png b/ios/iosremote/iosremote/Ressources/more_icon.png
new file mode 100644
index 000000000000..ac826b35a7c9
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/more_icon.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/more_icon@2x.png b/ios/iosremote/iosremote/Ressources/more_icon@2x.png
new file mode 100644
index 000000000000..8ba3cf86d476
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/more_icon@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/more_ipad.png b/ios/iosremote/iosremote/Ressources/more_ipad.png
new file mode 100644
index 000000000000..1747c8bf59ad
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/more_ipad.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/more_ipad@2x.png b/ios/iosremote/iosremote/Ressources/more_ipad@2x.png
new file mode 100644
index 000000000000..44a5393669e6
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/more_ipad@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/navBarBackground.png b/ios/iosremote/iosremote/Ressources/navBarBackground.png
new file mode 100644
index 000000000000..53480551dc2f
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/navBarBackground.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/navBarBackground@2x.png b/ios/iosremote/iosremote/Ressources/navBarBackground@2x.png
new file mode 100644
index 000000000000..d18e81e92f17
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/navBarBackground@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/navBarButtonNormal@2x.png b/ios/iosremote/iosremote/Ressources/navBarButtonNormal@2x.png
new file mode 100644
index 000000000000..e8c0d3145274
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/navBarButtonNormal@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/nextButton_normal.png b/ios/iosremote/iosremote/Ressources/nextButton_normal.png
new file mode 100644
index 000000000000..b3a48886da66
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/nextButton_normal.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/nextButton_normal@2x.png b/ios/iosremote/iosremote/Ressources/nextButton_normal@2x.png
new file mode 100644
index 000000000000..dbe6dbd58a04
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/nextButton_normal@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/nextButton_pressed.png b/ios/iosremote/iosremote/Ressources/nextButton_pressed.png
new file mode 100644
index 000000000000..8ed46c1c5171
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/nextButton_pressed.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/nextButton_pressed@2x.png b/ios/iosremote/iosremote/Ressources/nextButton_pressed@2x.png
new file mode 100644
index 000000000000..48e5b3184a01
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/nextButton_pressed@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/pointer.png b/ios/iosremote/iosremote/Ressources/pointer.png
new file mode 100644
index 000000000000..8e92445d18ba
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/pointer.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/pointer_pushed.png b/ios/iosremote/iosremote/Ressources/pointer_pushed.png
new file mode 100644
index 000000000000..c8f73d41cb1b
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/pointer_pushed.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/previousButton_normal.png b/ios/iosremote/iosremote/Ressources/previousButton_normal.png
new file mode 100644
index 000000000000..6292ac9acb0f
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/previousButton_normal.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/previousButton_normal@2x.png b/ios/iosremote/iosremote/Ressources/previousButton_normal@2x.png
new file mode 100644
index 000000000000..b8f2ac7fd9b3
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/previousButton_normal@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/previousButton_pressed.png b/ios/iosremote/iosremote/Ressources/previousButton_pressed.png
new file mode 100644
index 000000000000..5759e70bc6bf
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/previousButton_pressed.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/previousButton_pressed@2x.png b/ios/iosremote/iosremote/Ressources/previousButton_pressed@2x.png
new file mode 100644
index 000000000000..7c10564226e0
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/previousButton_pressed@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/pushed_next_button.png b/ios/iosremote/iosremote/Ressources/pushed_next_button.png
new file mode 100644
index 000000000000..0ad839d0e0a2
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/pushed_next_button.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/pushed_previous_button.png b/ios/iosremote/iosremote/Ressources/pushed_previous_button.png
new file mode 100644
index 000000000000..cb5ef4aa2e41
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/pushed_previous_button.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/released_next_button.png b/ios/iosremote/iosremote/Ressources/released_next_button.png
new file mode 100644
index 000000000000..b80f2104789f
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/released_next_button.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/released_previous_button.png b/ios/iosremote/iosremote/Ressources/released_previous_button.png
new file mode 100644
index 000000000000..abb188ff8bb7
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/released_previous_button.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/slide_finished.png b/ios/iosremote/iosremote/Ressources/slide_finished.png
new file mode 100644
index 000000000000..8f57eaa6169a
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/slide_finished.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_clear_btn.png b/ios/iosremote/iosremote/Ressources/timer_clear_btn.png
new file mode 100644
index 000000000000..bde789acf730
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_clear_btn.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_clear_btn@2x.png b/ios/iosremote/iosremote/Ressources/timer_clear_btn@2x.png
new file mode 100644
index 000000000000..d7260d38ef61
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_clear_btn@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_clear_btn_dark.png b/ios/iosremote/iosremote/Ressources/timer_clear_btn_dark.png
new file mode 100644
index 000000000000..fe620cde740c
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_clear_btn_dark.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_pause_btn.png b/ios/iosremote/iosremote/Ressources/timer_pause_btn.png
new file mode 100644
index 000000000000..a2599c42652b
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_pause_btn.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_pause_btn@2x.png b/ios/iosremote/iosremote/Ressources/timer_pause_btn@2x.png
new file mode 100644
index 000000000000..f71fd9800e06
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_pause_btn@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_pause_btn_dark.png b/ios/iosremote/iosremote/Ressources/timer_pause_btn_dark.png
new file mode 100644
index 000000000000..7131406b28dd
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_pause_btn_dark.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_pause_btn_dark@2x.png b/ios/iosremote/iosremote/Ressources/timer_pause_btn_dark@2x.png
new file mode 100644
index 000000000000..c02ed8eae2d4
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_pause_btn_dark@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_settime_btn.png b/ios/iosremote/iosremote/Ressources/timer_settime_btn.png
new file mode 100644
index 000000000000..5db2f3226de7
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_settime_btn.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_settime_btn@2x.png b/ios/iosremote/iosremote/Ressources/timer_settime_btn@2x.png
new file mode 100644
index 000000000000..9fcbd62f802b
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_settime_btn@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_settime_btn_dark.png b/ios/iosremote/iosremote/Ressources/timer_settime_btn_dark.png
new file mode 100644
index 000000000000..abafec9c702d
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_settime_btn_dark.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_settime_btn_dark@2x.png b/ios/iosremote/iosremote/Ressources/timer_settime_btn_dark@2x.png
new file mode 100644
index 000000000000..56375417caac
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_settime_btn_dark@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_start_btn.png b/ios/iosremote/iosremote/Ressources/timer_start_btn.png
new file mode 100644
index 000000000000..0beff7bf31d3
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_start_btn.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_start_btn@2x.png b/ios/iosremote/iosremote/Ressources/timer_start_btn@2x.png
new file mode 100644
index 000000000000..78febe32ba4f
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_start_btn@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_start_btn_dark.png b/ios/iosremote/iosremote/Ressources/timer_start_btn_dark.png
new file mode 100644
index 000000000000..e3accb9c1be5
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_start_btn_dark.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Ressources/timer_start_btn_dark@2x.png b/ios/iosremote/iosremote/Ressources/timer_start_btn_dark@2x.png
new file mode 100644
index 000000000000..91d276e788a7
--- /dev/null
+++ b/ios/iosremote/iosremote/Ressources/timer_start_btn_dark@2x.png
Binary files differ
diff --git a/ios/iosremote/iosremote/Views/WalkThroughPageViewController.xib b/ios/iosremote/iosremote/Views/WalkThroughPageViewController.xib
new file mode 100644
index 000000000000..759294476081
--- /dev/null
+++ b/ios/iosremote/iosremote/Views/WalkThroughPageViewController.xib
@@ -0,0 +1,470 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1280</int>
+ <string key="IBDocument.SystemVersion">12F37</string>
+ <string key="IBDocument.InterfaceBuilderVersion">4510</string>
+ <string key="IBDocument.AppKitVersion">1187.39</string>
+ <string key="IBDocument.HIToolboxVersion">626.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">3742</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIButton</string>
+ <string>IBUIImageView</string>
+ <string>IBUILabel</string>
+ <string>IBUIView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="36157550">
+ <object class="IBProxyObject" id="284074690">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="49636071">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="826207736">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">1330</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIImageView" id="685443561">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">1330</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{20, 115}, {280, 114}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <reference key="NSNextKeyView" ref="654792355"/>
+ <int key="IBUIContentMode">1</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUILabel" id="941134962">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">1330</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{20, 66}, {280, 47}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <reference key="NSNextKeyView" ref="685443561"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">Select the APPChildViewController.xib file just created. Change the background of the view to Black and reduce the vertical size of the view to 512 points to leave some free space for the dots of the page controller (which has a default </string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4yNTg4MjM1Mjk0IDAuNDM1Mjk0MTE3NiAwLjkwOTgwMzkyMTYAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <float key="IBUIMinimumScaleFactor">0.89999997615814209</float>
+ <int key="IBUINumberOfLines">2</int>
+ <int key="IBUILineBreakMode">0</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <string key="name">Helvetica</string>
+ <string key="family">Helvetica</string>
+ <int key="traits">0</int>
+ <double key="pointSize">16</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">16</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <double key="preferredMaxLayoutWidth">280</double>
+ </object>
+ <object class="IBUILabel" id="337391083">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">1318</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{20, 20}, {250, 38}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <reference key="NSNextKeyView" ref="452997759"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">Connection</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4yMTE3NjQ3MDU5IDAuODE1Njg2Mjc0NSAwLjc4MDM5MjE1NjkAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">0</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <string key="name">STHeitiSC-Medium</string>
+ <string key="family">Heiti SC</string>
+ <int key="traits">2</int>
+ <double key="pointSize">22</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">STHeitiSC-Medium</string>
+ <double key="NSSize">22</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
+ <object class="IBUIButton" id="292993655">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">-2147482359</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{194, 373.00000000000006}, {106, 44}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIContentHorizontalAlignment">0</int>
+ <int key="IBUIContentVerticalAlignment">0</int>
+ <double key="IBUITitleEdgeInsets.top">0.0</double>
+ <double key="IBUITitleEdgeInsets.bottom">0.0</double>
+ <double key="IBUITitleEdgeInsets.left">-24</double>
+ <double key="IBUITitleEdgeInsets.right">0.0</double>
+ <double key="IBUIImageEdgeInsets.top">0.0</double>
+ <double key="IBUIImageEdgeInsets.bottom">0.0</double>
+ <double key="IBUIImageEdgeInsets.left">80</double>
+ <double key="IBUIImageEdgeInsets.right">0.0</double>
+ <object class="NSColor" key="IBUINormalTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAwLjUwMTk2MDc4NDMgMAA</bytes>
+ </object>
+ <object class="NSColor" key="IBUIHighlightedTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC45MjE1Njg2Mjc1IDAuNDM5MjE1Njg2MyAwAA</bytes>
+ </object>
+ <string key="IBUIHighlightedTitle">Get started!</string>
+ <string key="IBUINormalTitle">Get started</string>
+ <object class="NSColor" key="IBUIHighlightedTitleShadowColor" id="591734419">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwAA</bytes>
+ </object>
+ <reference key="IBUINormalTitleShadowColor" ref="591734419"/>
+ <object class="NSCustomResource" key="IBUINormalImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">forwardButton.png</string>
+ </object>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">2</int>
+ <double key="pointSize">14</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">HelveticaNeue-Bold</string>
+ <double key="NSSize">14</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ </object>
+ <object class="IBUILabel" id="654792355">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">1310</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{20, 237}, {83, 167.00000000000006}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <reference key="NSNextKeyView" ref="712287771"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">dwdwdaijiajwodjiawjdioajwidjawiodjiawjdiajwidjwijdiawjdiajwd</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4yNTg4MjM1Mjk0IDAuNDM1Mjk0MTE3NiAwLjkwOTgwMzkyMTYAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">0</int>
+ <int key="IBUINumberOfLines">10</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <string key="name">Helvetica-Oblique</string>
+ <string key="family">Helvetica</string>
+ <int key="traits">1</int>
+ <double key="pointSize">15</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica-Oblique</string>
+ <double key="NSSize">15</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ <double key="preferredMaxLayoutWidth">83</double>
+ </object>
+ <object class="IBUILabel" id="452997759">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">1313</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{278, 28}, {22, 21}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <reference key="NSNextKeyView" ref="941134962"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAwLjUwMTk2MDc4NDMgMAA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">1</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAxIDEAA</bytes>
+ <object class="NSColorSpace" key="NSCustomColorSpace">
+ <int key="NSID">1</int>
+ </object>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">0</int>
+ <int key="IBUITextAlignment">1</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">1</int>
+ <double key="pointSize">17</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">HelveticaNeue</string>
+ <double key="NSSize">17</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
+ <object class="IBUIImageView" id="712287771">
+ <reference key="NSNextResponder" ref="826207736"/>
+ <int key="NSvFlags">1307</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{111, 237}, {189, 167}}</string>
+ <reference key="NSSuperview" ref="826207736"/>
+ <reference key="NSNextKeyView" ref="292993655"/>
+ <int key="IBUIContentMode">1</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{0, 20}, {320, 424.00000000000006}}</string>
+ <reference key="NSNextKeyView" ref="337391083"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <object class="IBUISimulatedSizeMetrics" key="IBUISimulatedDestinationMetrics">
+ <string key="IBUISimulatedSizeMetricsClass">IBUISimulatedFreeformSizeMetricsSentinel</string>
+ <string key="IBUIDisplayName">Freeform</string>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <bool key="usesAutoincrementingIDs">NO</bool>
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">hintImage</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="712287771"/>
+ </object>
+ <string key="id">25</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">image</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="685443561"/>
+ </object>
+ <string key="id">9</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">indexLabl</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="452997759"/>
+ </object>
+ <string key="id">23</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">instructionHint</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="654792355"/>
+ </object>
+ <string key="id">18</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">instructionText</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="941134962"/>
+ </object>
+ <string key="id">13</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">instructionTitle</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="337391083"/>
+ </object>
+ <string key="id">12</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">okButton</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="292993655"/>
+ </object>
+ <string key="id">15</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="284074690"/>
+ <reference key="destination" ref="826207736"/>
+ </object>
+ <string key="id">3</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchEventConnection" key="connection">
+ <string key="label">okButtonHandleBack:</string>
+ <reference key="source" ref="292993655"/>
+ <reference key="destination" ref="284074690"/>
+ <int key="IBEventType">7</int>
+ </object>
+ <string key="id">16</string>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <string key="id">0</string>
+ <array key="object" id="0"/>
+ <reference key="children" ref="36157550"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">-1</string>
+ <reference key="object" ref="284074690"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">-2</string>
+ <reference key="object" ref="49636071"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">1</string>
+ <reference key="object" ref="826207736"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="685443561"/>
+ <reference ref="941134962"/>
+ <reference ref="337391083"/>
+ <reference ref="292993655"/>
+ <reference ref="654792355"/>
+ <reference ref="452997759"/>
+ <reference ref="712287771"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">6</string>
+ <reference key="object" ref="685443561"/>
+ <reference key="parent" ref="826207736"/>
+ <string key="objectName">Image</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">7</string>
+ <reference key="object" ref="941134962"/>
+ <reference key="parent" ref="826207736"/>
+ <string key="objectName">Instructions</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">8</string>
+ <reference key="object" ref="337391083"/>
+ <reference key="parent" ref="826207736"/>
+ <string key="objectName">Title</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">14</string>
+ <reference key="object" ref="292993655"/>
+ <reference key="parent" ref="826207736"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">17</string>
+ <reference key="object" ref="654792355"/>
+ <reference key="parent" ref="826207736"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">22</string>
+ <reference key="object" ref="452997759"/>
+ <reference key="parent" ref="826207736"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">24</string>
+ <reference key="object" ref="712287771"/>
+ <reference key="parent" ref="826207736"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">WalkThroughPageViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="-1.showNotes"/>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="-2.showNotes"/>
+ <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="1.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="1.showNotes"/>
+ <string key="14.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="14.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="14.showNotes"/>
+ <string key="17.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="17.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="17.showNotes"/>
+ <string key="22.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="22.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="22.showNotes"/>
+ <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="24.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="24.showNotes"/>
+ <string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="6.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="6.showNotes"/>
+ <string key="7.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="7.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="7.showNotes"/>
+ <string key="8.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="8.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="8.showNotes"/>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes"/>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">YES</bool>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+ <real value="1280" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
+ <integer value="4600" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NS.key.0">forwardButton.png</string>
+ <string key="NS.object.0">{11, 26}</string>
+ </object>
+ <string key="IBCocoaTouchPluginVersion">3742</string>
+ </data>
+</archive>
diff --git a/ios/iosremote/iosremote/Views/WalkThroughPageViewMainImageController.xib b/ios/iosremote/iosremote/Views/WalkThroughPageViewMainImageController.xib
new file mode 100644
index 000000000000..dddc15e91193
--- /dev/null
+++ b/ios/iosremote/iosremote/Views/WalkThroughPageViewMainImageController.xib
@@ -0,0 +1,401 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1552</int>
+ <string key="IBDocument.SystemVersion">12E55</string>
+ <string key="IBDocument.InterfaceBuilderVersion">3084</string>
+ <string key="IBDocument.AppKitVersion">1187.39</string>
+ <string key="IBDocument.HIToolboxVersion">626.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="NS.object.0">2083</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>IBProxyObject</string>
+ <string>IBUIButton</string>
+ <string>IBUIImageView</string>
+ <string>IBUILabel</string>
+ <string>IBUIView</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="805147820">
+ <object class="IBProxyObject" id="1063073909">
+ <string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBProxyObject" id="125952564">
+ <string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUIView" id="486816108">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">1330</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="IBUIImageView" id="449803563">
+ <reference key="NSNextResponder" ref="486816108"/>
+ <int key="NSvFlags">1298</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{0, 70}, {320, 308}}</string>
+ <reference key="NSSuperview" ref="486816108"/>
+ <reference key="NSNextKeyView" ref="879400829"/>
+ <int key="IBUIContentMode">1</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ <object class="IBUILabel" id="373486653">
+ <reference key="NSNextResponder" ref="486816108"/>
+ <int key="NSvFlags">1334</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{20, 20}, {250, 38}}</string>
+ <reference key="NSSuperview" ref="486816108"/>
+ <reference key="NSNextKeyView" ref="314594708"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">Connection</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC4yMTE3NjQ3MDU5IDAuODE1Njg2Mjc0NSAwLjc4MDM5MjE1NjkAA</bytes>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">0</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <string key="name">STHeitiSC-Medium</string>
+ <string key="family">Heiti SC</string>
+ <int key="traits">2</int>
+ <double key="pointSize">22</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">STHeitiSC-Medium</string>
+ <double key="NSSize">22</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
+ <object class="IBUIButton" id="879400829">
+ <reference key="NSNextResponder" ref="486816108"/>
+ <int key="NSvFlags">-2147482359</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{173, 396}, {127, 44}}</string>
+ <reference key="NSSuperview" ref="486816108"/>
+ <bool key="IBUIOpaque">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIContentHorizontalAlignment">0</int>
+ <int key="IBUIContentVerticalAlignment">0</int>
+ <string key="IBUIHighlightedTitle">Get started</string>
+ <string key="IBUINormalTitle">Get started</string>
+ <object class="NSColor" key="IBUIHighlightedTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MC40MTE3NjQ3MDU5IDAuNDE1Njg2Mjc0NSAwLjQyMzUyOTQxMTgAA</bytes>
+ </object>
+ <object class="NSColor" key="IBUINormalTitleColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAwLjUwMTk2MDc4NDMgMAA</bytes>
+ </object>
+ <object class="NSColor" key="IBUIHighlightedTitleShadowColor" id="238497645">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwAA</bytes>
+ </object>
+ <reference key="IBUINormalTitleShadowColor" ref="238497645"/>
+ <object class="NSCustomResource" key="IBUINormalBackgroundImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">buttonBackground.png</string>
+ </object>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">2</int>
+ <double key="pointSize">18</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica-Bold</string>
+ <double key="NSSize">18</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ </object>
+ <object class="IBUILabel" id="314594708">
+ <reference key="NSNextResponder" ref="486816108"/>
+ <int key="NSvFlags">1313</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{278, 28}, {22, 21}}</string>
+ <reference key="NSSuperview" ref="486816108"/>
+ <reference key="NSNextKeyView" ref="449803563"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAwLjUwMTk2MDc4NDMgMAA</bytes>
+ </object>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">1</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAxIDEAA</bytes>
+ <object class="NSColorSpace" key="NSCustomColorSpace">
+ <int key="NSID">1</int>
+ </object>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">0</int>
+ <int key="IBUITextAlignment">1</int>
+ <object class="IBUIFontDescription" key="IBUIFontDescription">
+ <int key="type">1</int>
+ <double key="pointSize">17</double>
+ </object>
+ <object class="NSFont" key="IBUIFont">
+ <string key="NSName">Helvetica</string>
+ <double key="NSSize">17</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
+ </array>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{0, 20}, {320, 460}}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSNextKeyView" ref="373486653"/>
+ <object class="NSColor" key="IBUIBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
+ <object class="IBUIScreenMetrics" key="IBUISimulatedDestinationMetrics">
+ <string key="IBUISimulatedSizeMetricsClass">IBUIScreenMetrics</string>
+ <object class="NSMutableDictionary" key="IBUINormalizedOrientationToSizeMap">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <array key="dict.sortedKeys">
+ <integer value="1"/>
+ <integer value="3"/>
+ </array>
+ <array key="dict.values">
+ <string>{320, 480}</string>
+ <string>{480, 320}</string>
+ </array>
+ </object>
+ <string key="IBUITargetRuntime">IBCocoaTouchFramework</string>
+ <string key="IBUIDisplayName">Retina 3.5 Full Screen</string>
+ <int key="IBUIType">0</int>
+ </object>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <bool key="usesAutoincrementingIDs">NO</bool>
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">image</string>
+ <reference key="source" ref="1063073909"/>
+ <reference key="destination" ref="449803563"/>
+ </object>
+ <string key="id">9</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">indexLabl</string>
+ <reference key="source" ref="1063073909"/>
+ <reference key="destination" ref="314594708"/>
+ </object>
+ <string key="id">23</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">instructionTitle</string>
+ <reference key="source" ref="1063073909"/>
+ <reference key="destination" ref="373486653"/>
+ </object>
+ <string key="id">12</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">okButton</string>
+ <reference key="source" ref="1063073909"/>
+ <reference key="destination" ref="879400829"/>
+ </object>
+ <string key="id">15</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="1063073909"/>
+ <reference key="destination" ref="486816108"/>
+ </object>
+ <string key="id">3</string>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchEventConnection" key="connection">
+ <string key="label">okButtonHandleBack:</string>
+ <reference key="source" ref="879400829"/>
+ <reference key="destination" ref="1063073909"/>
+ <int key="IBEventType">7</int>
+ </object>
+ <string key="id">16</string>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <string key="id">0</string>
+ <array key="object" id="0"/>
+ <reference key="children" ref="805147820"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">-1</string>
+ <reference key="object" ref="1063073909"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">-2</string>
+ <reference key="object" ref="125952564"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">1</string>
+ <reference key="object" ref="486816108"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="449803563"/>
+ <reference ref="373486653"/>
+ <reference ref="879400829"/>
+ <reference ref="314594708"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">6</string>
+ <reference key="object" ref="449803563"/>
+ <reference key="parent" ref="486816108"/>
+ <string key="objectName">Image</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">8</string>
+ <reference key="object" ref="373486653"/>
+ <reference key="parent" ref="486816108"/>
+ <string key="objectName">Title</string>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">14</string>
+ <reference key="object" ref="879400829"/>
+ <reference key="parent" ref="486816108"/>
+ </object>
+ <object class="IBObjectRecord">
+ <string key="id">22</string>
+ <reference key="object" ref="314594708"/>
+ <reference key="parent" ref="486816108"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.CustomClassName">WalkThroughPageViewController</string>
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="-1.showNotes"/>
+ <string key="-2.CustomClassName">UIResponder</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="-2.showNotes"/>
+ <string key="1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="1.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="1.showNotes"/>
+ <string key="14.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="14.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="14.showNotes"/>
+ <string key="22.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="22.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="22.showNotes"/>
+ <string key="6.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="6.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="6.showNotes"/>
+ <string key="8.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <reference key="8.IBUserGuides" ref="0"/>
+ <boolean value="NO" key="8.showNotes"/>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">WalkThroughPageViewController</string>
+ <string key="superclassName">UIViewController</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">okButtonHandleBack:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="NSMutableDictionary" key="actionInfosByName">
+ <string key="NS.key.0">okButtonHandleBack:</string>
+ <object class="IBActionInfo" key="NS.object.0">
+ <string key="name">okButtonHandleBack:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </object>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="hintImage">UIImageView</string>
+ <string key="image">UIImageView</string>
+ <string key="indexLabl">UILabel</string>
+ <string key="instructionHint">UILabel</string>
+ <string key="instructionText">UILabel</string>
+ <string key="instructionTitle">UILabel</string>
+ <string key="okButton">UIButton</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="hintImage">
+ <string key="name">hintImage</string>
+ <string key="candidateClassName">UIImageView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="image">
+ <string key="name">image</string>
+ <string key="candidateClassName">UIImageView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="indexLabl">
+ <string key="name">indexLabl</string>
+ <string key="candidateClassName">UILabel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="instructionHint">
+ <string key="name">instructionHint</string>
+ <string key="candidateClassName">UILabel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="instructionText">
+ <string key="name">instructionText</string>
+ <string key="candidateClassName">UILabel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="instructionTitle">
+ <string key="name">instructionTitle</string>
+ <string key="candidateClassName">UILabel</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="okButton">
+ <string key="name">okButton</string>
+ <string key="candidateClassName">UIButton</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/WalkThroughPageViewController.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
+ <integer value="4600" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NS.key.0">buttonBackground.png</string>
+ <string key="NS.object.0">{45, 45}</string>
+ </object>
+ <string key="IBCocoaTouchPluginVersion">2083</string>
+ </data>
+</archive>
diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
index f0bbf253012e..a1f8d5c093d8 100644
--- a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
+++ b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
<dependencies>
- <deployment version="1552" identifier="iOS"/>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment version="1552" defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--Walk Through Container View Controller-->
@@ -30,27 +29,26 @@
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="Rg3-PU-OuS" detailTextLabel="9Mc-gD-acc" style="IBUITableViewCellStyleValue1" id="Pvl-Uw-Ghs">
- <rect key="frame" x="0.0" y="46" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Pvl-Uw-Ghs" id="prv-TX-VSv">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Rg3-PU-OuS">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9Mc-gD-acc">
- <rect key="frame" x="246" y="11" width="44" height="22"/>
+ <rect key="frame" x="261" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -116,22 +114,22 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="3128" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="f2u-bG-5ak">
- <rect key="frame" x="79" y="49" width="163" height="81"/>
+ <rect key="frame" x="79" y="55" width="163" height="81"/>
<autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" pointSize="73"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Please enter the pin code above in Impress - Slide Show - Impress Remote" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="upW-oF-qOa">
- <rect key="frame" x="29" y="419" width="271" height="65.000000000000028"/>
+ <rect key="frame" x="29" y="418.99999999999994" width="271" height="65"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Light" family="Helvetica" pointSize="15"/>
<color key="textColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
<nil key="highlightedColor"/>
</label>
- <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" image="WTPairingScreenshot.png" id="hNY-aX-xhu">
- <rect key="frame" x="15" y="144" width="291" height="215"/>
- <autoresizingMask key="autoresizingMask"/>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="WTPairingScreenshot.png" id="yrL-B0-LB4">
+ <rect key="frame" x="17" y="144" width="287" height="190"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@@ -150,7 +148,7 @@
<scene sceneID="tlJ-c5-Jp2">
<objects>
<tableViewController id="maT-Bx-l5y" customClass="NewServerViewController" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
@@ -158,22 +156,20 @@
<tableViewSection footerTitle="" id="46W-NE-CYW">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="EN9-tY-k4P" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="10" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EN9-tY-k4P" id="99N-qW-3gb">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="qeE-95-2Gh" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="55" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="79" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="0.0" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="qeE-95-2Gh" id="JOF-3e-sdr">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -285,15 +281,15 @@
<objects>
<tableViewController id="5d0-J5-Cal" customClass="SlideShowSwipeInList_iphone" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="132" sectionHeaderHeight="22" sectionFooterHeight="22" id="Ke1-ze-r00">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<gestureRecognizers/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="stopWatch" rowHeight="126" id="hig-YG-1Lg">
<rect key="frame" x="0.0" y="22" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="125"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hig-YG-1Lg" id="uuK-VB-c8S">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="Yo8-Hd-Io6">
@@ -396,22 +392,21 @@
</connections>
</scrollView>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="132" id="dDp-H3-HyL">
<rect key="frame" x="0.0" y="148" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="131"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dDp-H3-HyL" id="hZ8-k9-kNE">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="1" contentMode="scaleToFill" image="Default-568h.png" id="del-Hz-TZI">
- <rect key="frame" x="20" y="5" width="182" height="122"/>
+ <rect key="frame" x="20" y="5.5" width="182" height="122"/>
</imageView>
<label clipsSubviews="YES" userInteractionEnabled="NO" tag="2" contentMode="left" text="1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="1" highlighted="YES" id="yWM-Nx-KmF">
- <rect key="frame" x="173" y="106" width="29" height="21"/>
+ <rect key="frame" x="173" y="107" width="29" height="21"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" none="YES" selected="YES" staticText="YES"/>
@@ -421,8 +416,7 @@
<nil key="highlightedColor"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -443,7 +437,7 @@
<objects>
<viewController id="Ivv-3X-Nhr" customClass="SlideShowViewController_iphone" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Xty-aF-WDv">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" id="YvB-Gp-Fvr" userLabel="Preview">
@@ -451,7 +445,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" verticalCompressionResistancePriority="1000" id="bZq-z2-OKU">
- <rect key="frame" x="3" y="8" width="220" height="167"/>
+ <rect key="frame" x="3.0000000000000031" y="8" width="220" height="167"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</imageView>
@@ -479,7 +473,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="evg-Ah-Kcw" userLabel="NotesView">
- <rect key="frame" x="-13" y="191" width="346" height="269"/>
+ <rect key="frame" x="-13" y="191" width="346" height="289"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Lecturer's Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Y23-iV-GJx">
@@ -491,7 +485,7 @@
<nil key="highlightedColor"/>
</label>
<webView contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="xGi-A7-hat" userLabel="Notes">
- <rect key="frame" x="20" y="21" width="306" height="248"/>
+ <rect key="frame" x="20" y="21" width="306" height="268"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
@@ -499,7 +493,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view hidden="YES" opaque="NO" userInteractionEnabled="NO" alpha="0.60000000000000009" contentMode="scaleToFill" id="uSh-Ne-BdH" userLabel="blockview">
- <rect key="frame" x="0.0" y="-46" width="320" height="640"/>
+ <rect key="frame" x="0.0" y="-46" width="320" height="660"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<accessibility key="accessibilityConfiguration">
@@ -511,11 +505,11 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES"/>
</imageView>
<view hidden="YES" contentMode="scaleToFill" id="iCc-m2-vR5" userLabel="pointer">
- <rect key="frame" x="157" y="272" width="5" height="5"/>
+ <rect key="frame" x="157" y="282" width="5" height="5"/>
<color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
</view>
<view contentMode="scaleToFill" restorationIdentifier="" id="3od-5c-yzI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="460" width="320" height="88"/>
+ <rect key="frame" x="0.0" y="480" width="320" height="88"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="bottom" lineBreakMode="middleTruncation" id="vh9-Zy-DPu">
@@ -592,7 +586,8 @@
<objects>
<navigationController modalTransitionStyle="flipHorizontal" id="qoG-TN-hN0" customClass="LibONavigationController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="WJT-Yy-XZ0">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="WJT-Yy-XZ0">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -623,55 +618,14 @@
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </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="SWRevealViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SWRevealViewController.h"/>
- <relationships>
- <relationship kind="action" name="callDP:"/>
- </relationships>
- </class>
- <class className="SlideShowViewController_iphone" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowViewController_iphone.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="pointerAction:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <relationship kind="outlet" name="blockingView" candidateClass="UIView"/>
- <relationship kind="outlet" name="bottomView" candidateClass="UIView"/>
- <relationship kind="outlet" name="lecturer_notes" candidateClass="UIWebView"/>
- <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
- <relationship kind="outlet" name="notesView" candidateClass="UIView"/>
- <relationship kind="outlet" name="pointerBtn" candidateClass="UIButton"/>
- <relationship kind="outlet" name="revealButtonItem" candidateClass="UIBarButtonItem"/>
- <relationship kind="outlet" name="secondarySlideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
- <relationship kind="outlet" name="slideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="touchPointerImage" candidateClass="UIImageView"/>
- </relationships>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="5gZ-R8-9y7"/>
<segue reference="eIY-4P-1sI"/>
+ <segue reference="5gZ-R8-9y7"/>
</inferredMetricsTieBreakers>
</document> \ No newline at end of file
diff --git a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard
index f0bbf253012e..a1f8d5c093d8 100644
--- a/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard
+++ b/ios/iosremote/iosremote/en.lproj/iPhone_autoSize_old.storyboard
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
<dependencies>
- <deployment version="1552" identifier="iOS"/>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment version="1552" defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--Walk Through Container View Controller-->
@@ -30,27 +29,26 @@
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="Rg3-PU-OuS" detailTextLabel="9Mc-gD-acc" style="IBUITableViewCellStyleValue1" id="Pvl-Uw-Ghs">
- <rect key="frame" x="0.0" y="46" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Pvl-Uw-Ghs" id="prv-TX-VSv">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Rg3-PU-OuS">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9Mc-gD-acc">
- <rect key="frame" x="246" y="11" width="44" height="22"/>
+ <rect key="frame" x="261" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -116,22 +114,22 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="3128" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="f2u-bG-5ak">
- <rect key="frame" x="79" y="49" width="163" height="81"/>
+ <rect key="frame" x="79" y="55" width="163" height="81"/>
<autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" pointSize="73"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Please enter the pin code above in Impress - Slide Show - Impress Remote" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="upW-oF-qOa">
- <rect key="frame" x="29" y="419" width="271" height="65.000000000000028"/>
+ <rect key="frame" x="29" y="418.99999999999994" width="271" height="65"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Light" family="Helvetica" pointSize="15"/>
<color key="textColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
<nil key="highlightedColor"/>
</label>
- <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" image="WTPairingScreenshot.png" id="hNY-aX-xhu">
- <rect key="frame" x="15" y="144" width="291" height="215"/>
- <autoresizingMask key="autoresizingMask"/>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="WTPairingScreenshot.png" id="yrL-B0-LB4">
+ <rect key="frame" x="17" y="144" width="287" height="190"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@@ -150,7 +148,7 @@
<scene sceneID="tlJ-c5-Jp2">
<objects>
<tableViewController id="maT-Bx-l5y" customClass="NewServerViewController" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
@@ -158,22 +156,20 @@
<tableViewSection footerTitle="" id="46W-NE-CYW">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="EN9-tY-k4P" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="10" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EN9-tY-k4P" id="99N-qW-3gb">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="qeE-95-2Gh" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="55" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="79" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="0.0" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="qeE-95-2Gh" id="JOF-3e-sdr">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -285,15 +281,15 @@
<objects>
<tableViewController id="5d0-J5-Cal" customClass="SlideShowSwipeInList_iphone" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="132" sectionHeaderHeight="22" sectionFooterHeight="22" id="Ke1-ze-r00">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<gestureRecognizers/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="stopWatch" rowHeight="126" id="hig-YG-1Lg">
<rect key="frame" x="0.0" y="22" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="125"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hig-YG-1Lg" id="uuK-VB-c8S">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="Yo8-Hd-Io6">
@@ -396,22 +392,21 @@
</connections>
</scrollView>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="132" id="dDp-H3-HyL">
<rect key="frame" x="0.0" y="148" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="131"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dDp-H3-HyL" id="hZ8-k9-kNE">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="1" contentMode="scaleToFill" image="Default-568h.png" id="del-Hz-TZI">
- <rect key="frame" x="20" y="5" width="182" height="122"/>
+ <rect key="frame" x="20" y="5.5" width="182" height="122"/>
</imageView>
<label clipsSubviews="YES" userInteractionEnabled="NO" tag="2" contentMode="left" text="1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="1" highlighted="YES" id="yWM-Nx-KmF">
- <rect key="frame" x="173" y="106" width="29" height="21"/>
+ <rect key="frame" x="173" y="107" width="29" height="21"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" none="YES" selected="YES" staticText="YES"/>
@@ -421,8 +416,7 @@
<nil key="highlightedColor"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -443,7 +437,7 @@
<objects>
<viewController id="Ivv-3X-Nhr" customClass="SlideShowViewController_iphone" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Xty-aF-WDv">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" id="YvB-Gp-Fvr" userLabel="Preview">
@@ -451,7 +445,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" verticalCompressionResistancePriority="1000" id="bZq-z2-OKU">
- <rect key="frame" x="3" y="8" width="220" height="167"/>
+ <rect key="frame" x="3.0000000000000031" y="8" width="220" height="167"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</imageView>
@@ -479,7 +473,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="evg-Ah-Kcw" userLabel="NotesView">
- <rect key="frame" x="-13" y="191" width="346" height="269"/>
+ <rect key="frame" x="-13" y="191" width="346" height="289"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Lecturer's Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Y23-iV-GJx">
@@ -491,7 +485,7 @@
<nil key="highlightedColor"/>
</label>
<webView contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="xGi-A7-hat" userLabel="Notes">
- <rect key="frame" x="20" y="21" width="306" height="248"/>
+ <rect key="frame" x="20" y="21" width="306" height="268"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
@@ -499,7 +493,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view hidden="YES" opaque="NO" userInteractionEnabled="NO" alpha="0.60000000000000009" contentMode="scaleToFill" id="uSh-Ne-BdH" userLabel="blockview">
- <rect key="frame" x="0.0" y="-46" width="320" height="640"/>
+ <rect key="frame" x="0.0" y="-46" width="320" height="660"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<accessibility key="accessibilityConfiguration">
@@ -511,11 +505,11 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES"/>
</imageView>
<view hidden="YES" contentMode="scaleToFill" id="iCc-m2-vR5" userLabel="pointer">
- <rect key="frame" x="157" y="272" width="5" height="5"/>
+ <rect key="frame" x="157" y="282" width="5" height="5"/>
<color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
</view>
<view contentMode="scaleToFill" restorationIdentifier="" id="3od-5c-yzI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="460" width="320" height="88"/>
+ <rect key="frame" x="0.0" y="480" width="320" height="88"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="bottom" lineBreakMode="middleTruncation" id="vh9-Zy-DPu">
@@ -592,7 +586,8 @@
<objects>
<navigationController modalTransitionStyle="flipHorizontal" id="qoG-TN-hN0" customClass="LibONavigationController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="WJT-Yy-XZ0">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="WJT-Yy-XZ0">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -623,55 +618,14 @@
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </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="SWRevealViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SWRevealViewController.h"/>
- <relationships>
- <relationship kind="action" name="callDP:"/>
- </relationships>
- </class>
- <class className="SlideShowViewController_iphone" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowViewController_iphone.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="pointerAction:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <relationship kind="outlet" name="blockingView" candidateClass="UIView"/>
- <relationship kind="outlet" name="bottomView" candidateClass="UIView"/>
- <relationship kind="outlet" name="lecturer_notes" candidateClass="UIWebView"/>
- <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
- <relationship kind="outlet" name="notesView" candidateClass="UIView"/>
- <relationship kind="outlet" name="pointerBtn" candidateClass="UIButton"/>
- <relationship kind="outlet" name="revealButtonItem" candidateClass="UIBarButtonItem"/>
- <relationship kind="outlet" name="secondarySlideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
- <relationship kind="outlet" name="slideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="touchPointerImage" candidateClass="UIImageView"/>
- </relationships>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="5gZ-R8-9y7"/>
<segue reference="eIY-4P-1sI"/>
+ <segue reference="5gZ-R8-9y7"/>
</inferredMetricsTieBreakers>
</document> \ No newline at end of file
diff --git a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard
index 8f1fdd6675d8..ab31681b9c40 100644
--- a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard
+++ b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize.storyboard
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
<dependencies>
- <deployment version="1552" identifier="iOS"/>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment version="1552" defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--Walk Through Container View Controller-->
@@ -30,27 +29,26 @@
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="Rg3-PU-OuS" detailTextLabel="9Mc-gD-acc" style="IBUITableViewCellStyleValue1" id="Pvl-Uw-Ghs">
- <rect key="frame" x="0.0" y="46" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Pvl-Uw-Ghs" id="prv-TX-VSv">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Rg3-PU-OuS">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9Mc-gD-acc">
- <rect key="frame" x="246" y="11" width="44" height="22"/>
+ <rect key="frame" x="261" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -118,22 +116,22 @@ Contrôle Distant</string>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="3128" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="f2u-bG-5ak">
- <rect key="frame" x="79" y="49" width="163" height="81"/>
+ <rect key="frame" x="79" y="55" width="163" height="81"/>
<autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" pointSize="73"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Veuillez entrer le code ci-dessus dans le fenêtre Impress - Slide Show - Impress Remote" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="upW-oF-qOa">
- <rect key="frame" x="29" y="419" width="271" height="65"/>
+ <rect key="frame" x="29" y="419.00000000000006" width="271" height="65"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Light" family="Helvetica" pointSize="15"/>
<color key="textColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
<nil key="highlightedColor"/>
</label>
- <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" image="WTPairingScreenshot.png" id="hNY-aX-xhu">
- <rect key="frame" x="15" y="144" width="291" height="215"/>
- <autoresizingMask key="autoresizingMask"/>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="WTPairingScreenshot.png" id="yrL-B0-LB4">
+ <rect key="frame" x="17" y="144" width="287" height="190"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@@ -152,7 +150,7 @@ Contrôle Distant</string>
<scene sceneID="tlJ-c5-Jp2">
<objects>
<tableViewController id="maT-Bx-l5y" customClass="NewServerViewController" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
@@ -160,22 +158,20 @@ Contrôle Distant</string>
<tableViewSection footerTitle="" id="46W-NE-CYW">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="EN9-tY-k4P" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="10" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EN9-tY-k4P" id="99N-qW-3gb">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="qeE-95-2Gh" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="55" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="79" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="0.0" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="qeE-95-2Gh" id="JOF-3e-sdr">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -287,15 +283,15 @@ Contrôle Distant</string>
<objects>
<tableViewController id="5d0-J5-Cal" customClass="SlideShowSwipeInList_iphone" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="132" sectionHeaderHeight="22" sectionFooterHeight="22" id="Ke1-ze-r00">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<gestureRecognizers/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="stopWatch" rowHeight="126" id="hig-YG-1Lg">
<rect key="frame" x="0.0" y="22" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="125"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hig-YG-1Lg" id="uuK-VB-c8S">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="Yo8-Hd-Io6">
@@ -398,22 +394,21 @@ Contrôle Distant</string>
</connections>
</scrollView>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="132" id="dDp-H3-HyL">
<rect key="frame" x="0.0" y="148" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="131"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dDp-H3-HyL" id="hZ8-k9-kNE">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="1" contentMode="scaleToFill" image="Default-568h.png" id="del-Hz-TZI">
- <rect key="frame" x="20" y="5" width="182" height="122"/>
+ <rect key="frame" x="20" y="5.5" width="182" height="122"/>
</imageView>
<label clipsSubviews="YES" userInteractionEnabled="NO" tag="2" contentMode="left" text="1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="1" highlighted="YES" id="yWM-Nx-KmF">
- <rect key="frame" x="173" y="106" width="29" height="21"/>
+ <rect key="frame" x="173" y="107" width="29" height="21"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" none="YES" selected="YES" staticText="YES"/>
@@ -423,8 +418,7 @@ Contrôle Distant</string>
<nil key="highlightedColor"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -445,7 +439,7 @@ Contrôle Distant</string>
<objects>
<viewController id="Ivv-3X-Nhr" customClass="SlideShowViewController_iphone" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Xty-aF-WDv">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" id="YvB-Gp-Fvr" userLabel="Preview">
@@ -481,7 +475,7 @@ Contrôle Distant</string>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="evg-Ah-Kcw" userLabel="NotesView">
- <rect key="frame" x="-13" y="191" width="346" height="269"/>
+ <rect key="frame" x="-13" y="191" width="346" height="289"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Y23-iV-GJx">
@@ -493,7 +487,7 @@ Contrôle Distant</string>
<nil key="highlightedColor"/>
</label>
<webView contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="xGi-A7-hat" userLabel="Notes">
- <rect key="frame" x="20" y="21" width="306" height="248"/>
+ <rect key="frame" x="20" y="21" width="306" height="268"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
@@ -501,7 +495,7 @@ Contrôle Distant</string>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view hidden="YES" opaque="NO" userInteractionEnabled="NO" alpha="0.60000000000000009" contentMode="scaleToFill" id="uSh-Ne-BdH" userLabel="blockview">
- <rect key="frame" x="0.0" y="-46" width="320" height="640"/>
+ <rect key="frame" x="0.0" y="-46" width="320" height="660"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<accessibility key="accessibilityConfiguration">
@@ -513,11 +507,11 @@ Contrôle Distant</string>
<autoresizingMask key="autoresizingMask" widthSizable="YES"/>
</imageView>
<view hidden="YES" contentMode="scaleToFill" id="iCc-m2-vR5" userLabel="pointer">
- <rect key="frame" x="157" y="272" width="5" height="5"/>
+ <rect key="frame" x="157" y="282" width="5" height="5"/>
<color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
</view>
<view contentMode="scaleToFill" restorationIdentifier="" id="3od-5c-yzI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="460" width="320" height="88"/>
+ <rect key="frame" x="0.0" y="480" width="320" height="88"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="bottom" lineBreakMode="middleTruncation" id="vh9-Zy-DPu">
@@ -594,7 +588,8 @@ Contrôle Distant</string>
<objects>
<navigationController modalTransitionStyle="flipHorizontal" id="qoG-TN-hN0" customClass="LibONavigationController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="WJT-Yy-XZ0">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="WJT-Yy-XZ0">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -625,55 +620,14 @@ Contrôle Distant</string>
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </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="SWRevealViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SWRevealViewController.h"/>
- <relationships>
- <relationship kind="action" name="callDP:"/>
- </relationships>
- </class>
- <class className="SlideShowViewController_iphone" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowViewController_iphone.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="pointerAction:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <relationship kind="outlet" name="blockingView" candidateClass="UIView"/>
- <relationship kind="outlet" name="bottomView" candidateClass="UIView"/>
- <relationship kind="outlet" name="lecturer_notes" candidateClass="UIWebView"/>
- <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
- <relationship kind="outlet" name="notesView" candidateClass="UIView"/>
- <relationship kind="outlet" name="pointerBtn" candidateClass="UIButton"/>
- <relationship kind="outlet" name="revealButtonItem" candidateClass="UIBarButtonItem"/>
- <relationship kind="outlet" name="secondarySlideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
- <relationship kind="outlet" name="slideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="touchPointerImage" candidateClass="UIImageView"/>
- </relationships>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="5gZ-R8-9y7"/>
<segue reference="eIY-4P-1sI"/>
+ <segue reference="5gZ-R8-9y7"/>
</inferredMetricsTieBreakers>
</document> \ No newline at end of file
diff --git a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard
index 8f1fdd6675d8..ab31681b9c40 100644
--- a/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard
+++ b/ios/iosremote/iosremote/fr.lproj/iPhone_autoSize_old.storyboard
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
<dependencies>
- <deployment version="1552" identifier="iOS"/>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment version="1552" defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--Walk Through Container View Controller-->
@@ -30,27 +29,26 @@
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="Rg3-PU-OuS" detailTextLabel="9Mc-gD-acc" style="IBUITableViewCellStyleValue1" id="Pvl-Uw-Ghs">
- <rect key="frame" x="0.0" y="46" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Pvl-Uw-Ghs" id="prv-TX-VSv">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Rg3-PU-OuS">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9Mc-gD-acc">
- <rect key="frame" x="246" y="11" width="44" height="22"/>
+ <rect key="frame" x="261" y="12" width="44" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -118,22 +116,22 @@ Contrôle Distant</string>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="3128" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="f2u-bG-5ak">
- <rect key="frame" x="79" y="49" width="163" height="81"/>
+ <rect key="frame" x="79" y="55" width="163" height="81"/>
<autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue" pointSize="73"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Veuillez entrer le code ci-dessus dans le fenêtre Impress - Slide Show - Impress Remote" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="upW-oF-qOa">
- <rect key="frame" x="29" y="419" width="271" height="65"/>
+ <rect key="frame" x="29" y="419.00000000000006" width="271" height="65"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Light" family="Helvetica" pointSize="15"/>
<color key="textColor" name="alternateSelectedControlColor" catalog="System" colorSpace="catalog"/>
<nil key="highlightedColor"/>
</label>
- <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" image="WTPairingScreenshot.png" id="hNY-aX-xhu">
- <rect key="frame" x="15" y="144" width="291" height="215"/>
- <autoresizingMask key="autoresizingMask"/>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="WTPairingScreenshot.png" id="yrL-B0-LB4">
+ <rect key="frame" x="17" y="144" width="287" height="190"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@@ -152,7 +150,7 @@ Contrôle Distant</string>
<scene sceneID="tlJ-c5-Jp2">
<objects>
<tableViewController id="maT-Bx-l5y" customClass="NewServerViewController" sceneMemberID="viewController">
- <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
+ <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="VUL-K7-xsS">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
@@ -160,22 +158,20 @@ Contrôle Distant</string>
<tableViewSection footerTitle="" id="46W-NE-CYW">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="EN9-tY-k4P" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="10" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="35" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EN9-tY-k4P" id="99N-qW-3gb">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="qeE-95-2Gh" customClass="EditableTableViewCell">
- <rect key="frame" x="0.0" y="55" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="79" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="0.0" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="qeE-95-2Gh" id="JOF-3e-sdr">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
@@ -287,15 +283,15 @@ Contrôle Distant</string>
<objects>
<tableViewController id="5d0-J5-Cal" customClass="SlideShowSwipeInList_iphone" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="132" sectionHeaderHeight="22" sectionFooterHeight="22" id="Ke1-ze-r00">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<gestureRecognizers/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="stopWatch" rowHeight="126" id="hig-YG-1Lg">
<rect key="frame" x="0.0" y="22" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="125"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hig-YG-1Lg" id="uuK-VB-c8S">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="126"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" bounces="NO" alwaysBounceHorizontal="YES" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" id="Yo8-Hd-Io6">
@@ -398,22 +394,21 @@ Contrôle Distant</string>
</connections>
</scrollView>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="slide" rowHeight="132" id="dDp-H3-HyL">
<rect key="frame" x="0.0" y="148" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="0.0" y="0.0" width="320" height="131"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="dDp-H3-HyL" id="hZ8-k9-kNE">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="132"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="1" contentMode="scaleToFill" image="Default-568h.png" id="del-Hz-TZI">
- <rect key="frame" x="20" y="5" width="182" height="122"/>
+ <rect key="frame" x="20" y="5.5" width="182" height="122"/>
</imageView>
<label clipsSubviews="YES" userInteractionEnabled="NO" tag="2" contentMode="left" text="1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="1" highlighted="YES" id="yWM-Nx-KmF">
- <rect key="frame" x="173" y="106" width="29" height="21"/>
+ <rect key="frame" x="173" y="107" width="29" height="21"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" none="YES" selected="YES" staticText="YES"/>
@@ -423,8 +418,7 @@ Contrôle Distant</string>
<nil key="highlightedColor"/>
</label>
</subviews>
- <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
- </view>
+ </tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
@@ -445,7 +439,7 @@ Contrôle Distant</string>
<objects>
<viewController id="Ivv-3X-Nhr" customClass="SlideShowViewController_iphone" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Xty-aF-WDv">
- <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" id="YvB-Gp-Fvr" userLabel="Preview">
@@ -481,7 +475,7 @@ Contrôle Distant</string>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view contentMode="scaleToFill" verticalCompressionResistancePriority="547" restorationIdentifier="" id="evg-Ah-Kcw" userLabel="NotesView">
- <rect key="frame" x="-13" y="191" width="346" height="269"/>
+ <rect key="frame" x="-13" y="191" width="346" height="289"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text=" Notes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Y23-iV-GJx">
@@ -493,7 +487,7 @@ Contrôle Distant</string>
<nil key="highlightedColor"/>
</label>
<webView contentMode="scaleToFill" verticalCompressionResistancePriority="1" id="xGi-A7-hat" userLabel="Notes">
- <rect key="frame" x="20" y="21" width="306" height="248"/>
+ <rect key="frame" x="20" y="21" width="306" height="268"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
<rect key="contentStretch" x="0.0" y="1" width="1" height="1"/>
</webView>
@@ -501,7 +495,7 @@ Contrôle Distant</string>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
<view hidden="YES" opaque="NO" userInteractionEnabled="NO" alpha="0.60000000000000009" contentMode="scaleToFill" id="uSh-Ne-BdH" userLabel="blockview">
- <rect key="frame" x="0.0" y="-46" width="320" height="640"/>
+ <rect key="frame" x="0.0" y="-46" width="320" height="660"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="scrollViewTexturedBackgroundColor"/>
<accessibility key="accessibilityConfiguration">
@@ -513,11 +507,11 @@ Contrôle Distant</string>
<autoresizingMask key="autoresizingMask" widthSizable="YES"/>
</imageView>
<view hidden="YES" contentMode="scaleToFill" id="iCc-m2-vR5" userLabel="pointer">
- <rect key="frame" x="157" y="272" width="5" height="5"/>
+ <rect key="frame" x="157" y="282" width="5" height="5"/>
<color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
</view>
<view contentMode="scaleToFill" restorationIdentifier="" id="3od-5c-yzI" userLabel="Bottom">
- <rect key="frame" x="0.0" y="460" width="320" height="88"/>
+ <rect key="frame" x="0.0" y="480" width="320" height="88"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="bottom" lineBreakMode="middleTruncation" id="vh9-Zy-DPu">
@@ -594,7 +588,8 @@ Contrôle Distant</string>
<objects>
<navigationController modalTransitionStyle="flipHorizontal" id="qoG-TN-hN0" customClass="LibONavigationController" sceneMemberID="viewController">
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="WJT-Yy-XZ0">
+ <simulatedNavigationBarMetrics key="simulatedTopBarMetrics" translucent="NO" prompted="NO"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" translucent="NO" id="WJT-Yy-XZ0">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
@@ -625,55 +620,14 @@ Contrôle Distant</string>
<image name="timer_settime_btn.png" width="60" height="60"/>
<image name="timer_start_btn.png" width="60" height="60"/>
</resources>
- <classes>
- <class className="AboutViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/AboutViewController.h"/>
- <relationships>
- <relationship kind="outlet" name="aboutWebView" candidateClass="UIWebView"/>
- </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="SWRevealViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SWRevealViewController.h"/>
- <relationships>
- <relationship kind="action" name="callDP:"/>
- </relationships>
- </class>
- <class className="SlideShowViewController_iphone" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/SlideShowViewController_iphone.h"/>
- <relationships>
- <relationship kind="action" name="nextSlideAction:"/>
- <relationship kind="action" name="pointerAction:"/>
- <relationship kind="action" name="previousSlideAction:"/>
- <relationship kind="outlet" name="blockingView" candidateClass="UIView"/>
- <relationship kind="outlet" name="bottomView" candidateClass="UIView"/>
- <relationship kind="outlet" name="lecturer_notes" candidateClass="UIWebView"/>
- <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
- <relationship kind="outlet" name="notesView" candidateClass="UIView"/>
- <relationship kind="outlet" name="pointerBtn" candidateClass="UIButton"/>
- <relationship kind="outlet" name="revealButtonItem" candidateClass="UIBarButtonItem"/>
- <relationship kind="outlet" name="secondarySlideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
- <relationship kind="outlet" name="slideView" candidateClass="UIImageView"/>
- <relationship kind="outlet" name="touchPointerImage" candidateClass="UIImageView"/>
- </relationships>
- </class>
- <class className="WalkThroughContainerViewController" superclassName="UIViewController">
- <source key="sourceIdentifier" type="project" relativePath="./Classes/WalkThroughContainerViewController.h"/>
- </class>
- </classes>
+ <color key="tintColor" red="1" green="0.50196078430000002" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
- <segue reference="5gZ-R8-9y7"/>
<segue reference="eIY-4P-1sI"/>
+ <segue reference="5gZ-R8-9y7"/>
</inferredMetricsTieBreakers>
</document> \ No newline at end of file
diff --git a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard
index ec9592157322..a0d0c45bdeb1 100644
--- a/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard
+++ b/ios/iosremote/iosremote/zh-Hans.lproj/iPhone_autoSize.storyboard
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="12E55" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="4510" systemVersion="12F37" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="qoG-TN-hN0">
<dependencies>
- <deployment version="1552" identifier="iOS"/>
- <development version="4600" identifier="xcode"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ <deployment version="1552" defaultVersion="1280" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3742"/>
</dependencies>
<scenes>
<!--Walk Through Container View Controller-->
@@ -30,27 +29,26 @@
<color key="backgroundColor" red="0.93333713500000004" green="0.92603786499999996" blue="0.92826186129999999" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="server_item_cell" editingAccessoryType="disclosureIndicator" textLabel="Rg3-PU-OuS" detailTextLabel="9Mc-gD-acc" style="IBUITableViewCellStyleValue1" id="Pvl-Uw-Ghs">
- <rect key="frame" x="0.0" y="46" width="320" height="45"/>
+ <rect key="frame" x="0.0" y="55" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
- <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
- <rect key="frame" x="10" y="1" width="300" height="43"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Pvl-Uw-Ghs" id="prv-TX-VSv">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Rg3-PU-OuS">
- <rect key="frame" x="10" y="11" width="32" height="22"/>
+ <rect key="frame" x="15" y="12" width="32" height="20"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="17"/>
<color