call: enable screen sharing

Change-Id: Iba8a17b534cf5c151b930e0c7df78b5b34ec6a0e
diff --git a/src/CurrentCallVC.mm b/src/CurrentCallVC.mm
index 50ee940..27b4477 100644
--- a/src/CurrentCallVC.mm
+++ b/src/CurrentCallVC.mm
@@ -160,6 +160,7 @@
     if(currentCall.isAudioOnly) {
         muteVideoButton.image = [NSImage imageNamed:@"ic_action_mute_video.png"];
     }
+    videoView.callId = callUid;
 }
 
 - (void)awakeFromNib
diff --git a/src/views/CallView.h b/src/views/CallView.h
index 27423d7..ab50350 100644
--- a/src/views/CallView.h
+++ b/src/views/CallView.h
@@ -17,6 +17,7 @@
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
  */
 #import <Cocoa/Cocoa.h>
+#import <string>
 
 @protocol CallDelegate;
 @protocol CallDelegate
@@ -46,4 +47,6 @@
  */
 @property (nonatomic) id <CallDelegate> callDelegate;
 
+@property std::string callId;
+
 @end
diff --git a/src/views/CallView.mm b/src/views/CallView.mm
index 08b843c..e120a01 100644
--- a/src/views/CallView.mm
+++ b/src/views/CallView.mm
@@ -162,7 +162,8 @@
     //check to see if we can accept the data
     return conforms;
 }
-
+#if 0
+// TODO: add file as a source
 - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
 {
     /*------------------------------------------------------
@@ -170,16 +171,17 @@
      --------------------------------------------------------*/
     if ( [sender draggingSource] != self ) {
         NSURL* fileURL = [NSURL URLFromPasteboard: [sender draggingPasteboard]];
-        if (auto current = CallModel::instance().selectedCall()) {
-            if (auto outVideo = current->firstMedia<media::Video>(media::Media::Direction::OUT)) {
-                outVideo->sourceModel()->setFile(QUrl::fromLocalFile(QString::fromUtf8([fileURL.path UTF8String])));
-                return YES;
-            }
+        Call* call = [self getCurrentCall];
+        if (call == nullptr) return;
+        if (auto outVideo = call->firstMedia<media::Video>(media::Media::Direction::OUT)) {
+            outVideo->sourceModel()->setFile(QUrl::fromLocalFile(QString::fromUtf8([fileURL.path UTF8String])));
+            return YES;
         }
     }
 
     return NO;
 }
+#endif
 
 - (void)showContextualMenu:(NSEvent *)theEvent {
 
@@ -189,22 +191,28 @@
         Video::Device* device = Video::DeviceModel::instance().devices()[i];
         [contextualMenu insertItemWithTitle:device->name().toNSString() action:@selector(switchInput:) keyEquivalent:@"" atIndex:i];
     }
-
+    [contextualMenu insertItemWithTitle:NSLocalizedString(@"Share screen", @"Contextual menu entry")
+                                 action:@selector(captureScreen:)
+                          keyEquivalent:@""
+                                atIndex:contextualMenu.itemArray.count];
+#if 0
+// TODO: add file as a source
     [contextualMenu addItem:[NSMenuItem separatorItem]];
     [contextualMenu insertItemWithTitle:NSLocalizedString(@"Choose file", @"Contextual menu entry")
                                  action:@selector(chooseFile:)
                           keyEquivalent:@""
                                 atIndex:contextualMenu.itemArray.count];
+#endif
 
     [NSMenu popUpContextMenu:contextualMenu withEvent:theEvent forView:self];
 }
 
 - (void)mouseMoved:(NSEvent *)theEvent
 {
-        [NSObject cancelPreviousPerformRequestsWithTarget:self]; // cancel showContextualMenu
-        [self performSelector:@selector(mouseIdle:) withObject:theEvent afterDelay:3];
-        if (self.callDelegate && shouldAcceptInteractions)
-            [self.callDelegate mouseIsMoving:YES];
+    [NSObject cancelPreviousPerformRequestsWithTarget:self]; // cancel showContextualMenu
+    [self performSelector:@selector(mouseIdle:) withObject:theEvent afterDelay:3];
+    if (self.callDelegate && shouldAcceptInteractions)
+        [self.callDelegate mouseIsMoving:YES];
 }
 
 - (void) mouseIdle:(NSEvent *)theEvent
@@ -213,36 +221,47 @@
         [self.callDelegate mouseIsMoving:NO];
 }
 
+- (void) rightMouseUp: (NSEvent*) theEvent {
+    [NSObject cancelPreviousPerformRequestsWithTarget:self];
+    if([theEvent clickCount] == 1 && shouldAcceptInteractions) {
+        [self performSelector:@selector(showContextualMenu:) withObject:theEvent];
+    }
+}
 
 - (void)mouseUp:(NSEvent *)theEvent
 {
-    if([theEvent clickCount] == 1 && shouldAcceptInteractions) {
-        if(!contextualMenu)
-            [self performSelector:@selector(showContextualMenu:) withObject:theEvent afterDelay:[NSEvent doubleClickInterval]];
-        else
-            contextualMenu = nil;
-    }
-    else if([theEvent clickCount] == 2)
-    {
-        [NSObject cancelPreviousPerformRequestsWithTarget:self]; // cancel showContextualMenu
-        if(self.callDelegate) {
-            [self.callDelegate callShouldToggleFullScreen];
-        }
+    if([theEvent clickCount] == 2 && self.callDelegate) {
+        [self.callDelegate callShouldToggleFullScreen];
     }
 }
 
 - (void) switchInput:(NSMenuItem*) sender
 {
     int index = [contextualMenu indexOfItem:sender];
-    if (auto current = CallModel::instance().selectedCall()) {
-        if (auto outVideo = current->firstMedia<media::Video>(media::Media::Direction::OUT)) {
-            outVideo->sourceModel()->switchTo(Video::DeviceModel::instance().devices()[index]);
-        }
+    Call* call = [self getCurrentCall];
+    if (call == nullptr) return;
+    if (auto outVideo = call->firstMedia<media::Video>(media::Media::Direction::OUT)) {
+        outVideo->sourceModel()->switchTo(Video::DeviceModel::instance().devices()[index]);
+    }
+}
+
+- (void) captureScreen:(NSMenuItem*) sender
+{
+    Call* call = [self getCurrentCall];
+    if (call == nullptr) return;
+    if (auto outVideo = call->firstMedia<media::Video>(media::Media::Direction::OUT)) {
+        NSScreen *mainScreen = [NSScreen mainScreen];
+        NSRect screenFrame = mainScreen.frame;
+        QRect captureRect = QRect(screenFrame.origin.x, screenFrame.origin.y, screenFrame.size.width, screenFrame.size.height);
+        outVideo->sourceModel()->setDisplay(0, captureRect);
     }
 }
 
 - (void) chooseFile:(NSMenuItem*) sender
 {
+    Call* call = [self getCurrentCall];
+    if (call == nullptr) return;
+
     NSOpenPanel *browsePanel = [[NSOpenPanel alloc] init];
     [browsePanel setDirectoryURL:[NSURL URLWithString:NSHomeDirectory()]];
     [browsePanel setCanChooseFiles:YES];
@@ -255,18 +274,26 @@
     [fileTypes addObject:(__bridge NSString *)kUTTypeMovie];
     [fileTypes addObject:(__bridge NSString *)kUTTypeImage];
     [browsePanel setAllowedFileTypes:fileTypes];
-
     [browsePanel beginSheetModalForWindow:[self window] completionHandler:^(NSInteger result) {
         if (result == NSFileHandlingPanelOKButton) {
             NSURL*  theDoc = [[browsePanel URLs] objectAtIndex:0];
-            if (auto current = CallModel::instance().selectedCall()) {
-                if (auto outVideo = current->firstMedia<media::Video>(media::Media::Direction::OUT)) {
-                    outVideo->sourceModel()->setFile(QUrl::fromLocalFile(QString::fromUtf8([theDoc.path UTF8String])));
-                }
+            if (auto outVideo = call->firstMedia<media::Video>(media::Media::Direction::OUT)) {
+                outVideo->sourceModel()->setFile(QUrl::fromLocalFile(QString::fromUtf8([theDoc.path UTF8String])));
             }
         }
     }];
 
 }
 
+-(Call *) getCurrentCall {
+    auto calls = CallModel::instance().getActiveCalls();
+    Call* call = nullptr;
+    for (int i = 0; i< calls.size(); i++) {
+        if (calls.at(i)->historyId() == QString::fromStdString(self.callId)) {
+            return calls.at(i);
+        }
+    }
+    return call;
+}
+
 @end
diff --git a/ui/Base.lproj/Localizable.strings b/ui/Base.lproj/Localizable.strings
index 9975af9..ef18335 100644
--- a/ui/Base.lproj/Localizable.strings
+++ b/ui/Base.lproj/Localizable.strings
@@ -55,6 +55,9 @@
 /* Contextual menu entry */
 "Choose file" = "Choose file";
 
+/* Contextual menu entry */
+"Share screen" = "Share screen";
+
 /* No comment provided by engineer. */
 "Copy" = "Copy";