conversation: preview transferred files.

Change-Id: Idbb78e5fa438a877855d7fd98edd4c9cf67611da
diff --git a/src/ConversationVC.mm b/src/ConversationVC.mm
index 8fbea93..34715e3 100644
--- a/src/ConversationVC.mm
+++ b/src/ConversationVC.mm
@@ -126,7 +126,7 @@
 -(void) setConversationUid:(const std::string)convUid model:(lrc::api::ConversationModel *)model {
     if (convUid_ == convUid && convModel_ == model)
         return;
-
+    [self clearData];
     cachedConv_ = nil;
     convUid_ = convUid;
     convModel_ = model;
diff --git a/src/MessagesVC.mm b/src/MessagesVC.mm
index 3a583f1..44e9033 100644
--- a/src/MessagesVC.mm
+++ b/src/MessagesVC.mm
@@ -35,11 +35,15 @@
 #import "delegates/ImageManipulationDelegate.h"
 #import "utils.h"
 #import "views/NSColor+RingTheme.h"
+#import "views/IconButton.h"
+#import <QuickLook/QuickLook.h>
+#import <Quartz/Quartz.h>
 
 
-@interface MessagesVC () <NSTableViewDelegate, NSTableViewDataSource> {
+@interface MessagesVC () <NSTableViewDelegate, NSTableViewDataSource, QLPreviewPanelDataSource> {
 
     __unsafe_unretained IBOutlet NSTableView* conversationView;
+    __unsafe_unretained IBOutlet NSView* containerView;
 
     std::string convUid_;
     lrc::api::ConversationModel* convModel_;
@@ -52,6 +56,7 @@
     QMetaObject::Connection modelSortedSignal_;
     QMetaObject::Connection filterChangedSignal_;
     QMetaObject::Connection interactionStatusUpdatedSignal_;
+    NSString* previewImage;
 }
 
 @property (nonatomic, strong, readonly) INDSequentialTextSelectionManager* selectionManager;
@@ -71,6 +76,7 @@
 
 @implementation MessagesVC
 
+
 //MessageBuble type
 typedef NS_ENUM(NSInteger, MessageSequencing) {
     SINGLE_WITH_TIME       = 0,
@@ -266,6 +272,11 @@
                 [result.declineButton setTarget:self];
                 break;}
             case lrc::api::interaction::Status::TRANSFER_FINISHED:
+                result = [tableView makeViewWithIdentifier:@"LeftFinishedFileView" owner:conversationView];
+                [result.transferedFileName setAction:@selector(imagePreview:)];
+                [result.transferedFileName setTarget:self];
+                [result.transferedFileName.cell setHighlightsBy:NSContentsCellMask];
+                break;
             case lrc::api::interaction::Status::TRANSFER_CANCELED:
             case lrc::api::interaction::Status::TRANSFER_ERROR:
                 result = [tableView makeViewWithIdentifier:@"LeftFinishedFileView" owner:conversationView];
@@ -284,6 +295,11 @@
                 [result.declineButton setTarget:self];
                 break;
             case lrc::api::interaction::Status::TRANSFER_FINISHED:
+                result = [tableView makeViewWithIdentifier:@"RightFinishedFileView" owner:conversationView];
+                [result.transferedFileName setAction:@selector(imagePreview:)];
+                [result.transferedFileName setTarget:self];
+                [result.transferedFileName.cell setHighlightsBy:NSContentsCellMask];
+                break;
             case lrc::api::interaction::Status::TRANSFER_CANCELED:
             case lrc::api::interaction::Status::TRANSFER_ERROR:
             case lrc::api::interaction::Status::TRANSFER_UNJOINABLE_PEER:
@@ -318,15 +334,32 @@
     if (name.length > 0) {
        fileName = [name lastPathComponent];
     }
-    result.transferedFileName.stringValue = fileName;
+    NSFont *nameFont = [NSFont userFontOfSize:14.0];
+    NSColor *nameColor = [NSColor textColor];
+    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
+    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
+    paragraphStyle.alignment = NSTextAlignmentLeft;
+    NSDictionary *nameAttr = [NSDictionary dictionaryWithObjectsAndKeys:nameFont,NSFontAttributeName,
+                                 nameColor,NSForegroundColorAttributeName,
+                                 paragraphStyle,NSParagraphStyleAttributeName, nil];
+    NSAttributedString* nameAttributedString = [[NSAttributedString alloc] initWithString:fileName attributes:nameAttr];
+    result.transferedFileName.attributedTitle = nameAttributedString;
     if (status == lrc::api::interaction::Status::TRANSFER_FINISHED) {
-        NSImage* image = [self getImageForFilePath:name];
+        NSColor *higlightColor = [NSColor grayColor];
+        NSDictionary *alternativeNametAttr = [NSDictionary dictionaryWithObjectsAndKeys:nameFont,NSFontAttributeName,
+                                  higlightColor,NSForegroundColorAttributeName,
+                                  paragraphStyle,NSParagraphStyleAttributeName, nil];
+        NSAttributedString* alternativeString = [[NSAttributedString alloc] initWithString:fileName attributes:alternativeNametAttr];
+        result.transferedFileName.attributedAlternateTitle = alternativeString;
+        NSImage* image = [self getImageForFilePath:name size:MAX_TRANSFERED_IMAGE_SIZE];
         if (([name rangeOfString:@"/"].location == NSNotFound)) {
-            image = [self getImageForFilePath:[self getDataTransferPath:interactionID]];
+            image = [self getImageForFilePath:[self getDataTransferPath:interactionID] size:MAX_TRANSFERED_IMAGE_SIZE];
         }
         if(image != nil) {
             result.transferedImage.image = [image roundCorners:14];
             [result updateImageConstraint:image.size.width andHeight:image.size.height];
+            [result.transferedImage setAction:@selector(imagePreview:)];
+            [result.transferedImage setTarget:self];
         }
     }
     [result setupForInteraction:interactionID];
@@ -492,9 +525,9 @@
 
         if( interaction.status == lrc::api::interaction::Status::TRANSFER_FINISHED) {
             NSString* name =  @(interaction.body.c_str());
-            NSImage* image = [self getImageForFilePath:name];
+            NSImage* image = [self getImageForFilePath:name size:MAX_TRANSFERED_IMAGE_SIZE];
             if (([name rangeOfString:@"/"].location == NSNotFound)) {
-                image = [self getImageForFilePath:[self getDataTransferPath:it->first]];
+                image = [self getImageForFilePath:[self getDataTransferPath:it->first] size:MAX_TRANSFERED_IMAGE_SIZE];
             }
             if (image != nil) {
                 return image.size.height + TIME_BOX_HEIGHT;
@@ -540,12 +573,12 @@
     return @(info.path.c_str());
 }
 
--(NSImage*) getImageForFilePath: (NSString *) path {
+-(NSImage*) getImageForFilePath: (NSString *) path size:(CGFloat)size {
     if (path.length <= 0) {return nil;}
     if (![[NSFileManager defaultManager] fileExistsAtPath: path]) {return nil;}
     NSImage* transferedImage = [[NSImage alloc] initWithContentsOfFile: path];
     if(transferedImage != nil) {
-        return [transferedImage imageResizeInsideMax: MAX_TRANSFERED_IMAGE_SIZE];
+        return [transferedImage imageResizeInsideMax: size];
     }
     return nil;
 }
@@ -754,4 +787,41 @@
     }
 }
 
+- (void)imagePreview:(id)sender {
+    uint64_t interId;
+    if ([[sender superview] isKindOfClass:[IMTableCellView class]]) {
+        interId = [(IMTableCellView*)[sender superview] interaction];
+    } else if ([[[sender superview] superview] isKindOfClass:[IMTableCellView class]]) {
+        interId = [(IMTableCellView*)[[sender superview] superview] interaction];
+    } else {
+        return;
+    }
+    auto it = [self getCurrentConversation]->interactions.find(interId);
+    if (it == [self getCurrentConversation]->interactions.end()) {
+        return;
+    }
+    auto& interaction = it->second;
+    NSString* name =  @(interaction.body.c_str());
+    if (([name rangeOfString:@"/"].location == NSNotFound)) {
+        name = [self getDataTransferPath:interId];
+    }
+    previewImage = name;
+    if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) {
+        [[QLPreviewPanel sharedPreviewPanel] orderOut:nil];
+    } else {
+        [[QLPreviewPanel sharedPreviewPanel] updateController];
+        [QLPreviewPanel sharedPreviewPanel].dataSource = self;
+        [[QLPreviewPanel sharedPreviewPanel] setAnimationBehavior:NSWindowAnimationBehaviorDocumentWindow];
+        [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
+    }
+}
+
+- (NSInteger)numberOfPreviewItemsInPreviewPanel:(QLPreviewPanel *)panel {
+    return 1;
+}
+
+- (id <QLPreviewItem>)previewPanel:(QLPreviewPanel *)panel previewItemAtIndex:(NSInteger)index {
+    return [NSURL fileURLWithPath:previewImage];
+}
+
 @end
diff --git a/src/views/IMTableCellView.h b/src/views/IMTableCellView.h
index e9ce47e..8a92048 100644
--- a/src/views/IMTableCellView.h
+++ b/src/views/IMTableCellView.h
@@ -32,8 +32,8 @@
 @property (nonatomic, strong) IBOutlet NSTextField* statusLabel;
 @property (nonatomic, strong) IBOutlet NSBox* timeBox;
 @property (nonatomic, strong) IBOutlet NSTextField* timeLabel;
-@property (nonatomic, strong) IBOutlet NSTextField* transferedFileName;
-@property (nonatomic, strong) IBOutlet NSImageView* transferedImage;
+@property (nonatomic, strong) IBOutlet NSButton* transferedFileName;
+@property (nonatomic, strong) IBOutlet NSButton* transferedImage;
 @property (nonatomic, strong) IBOutlet NSProgressIndicator* sendingMessageIndicator;
 @property (nonatomic, strong) IBOutlet NSImageView* messageFailed;
 @property (nonatomic, strong) IBOutlet NSView* messageStatus;
diff --git a/src/views/IMTableCellView.mm b/src/views/IMTableCellView.mm
index c1b6c9d..35acca5 100644
--- a/src/views/IMTableCellView.mm
+++ b/src/views/IMTableCellView.mm
@@ -57,6 +57,8 @@
     [self.msgView setTranslatesAutoresizingMaskIntoConstraints:NO];
     [self.msgBackground setTranslatesAutoresizingMaskIntoConstraints:NO];
     [self.msgView setEditable:NO];
+    [(NSButtonCell*)transferedImage.cell setShowsStateBy:NSNoCellMask];
+    [(NSButtonCell*)transferedImage.cell setHighlightsBy:NSNoCellMask];
     acceptButton.image = [NSColor image: [NSImage imageNamed:@"ic_file_upload.png"] tintedWithColor:[NSColor greenSuccessColor]];
     declineButton.image = [NSColor image: [NSImage imageNamed:@"ic_action_cancel.png"] tintedWithColor:[NSColor redColor]];
 }
diff --git a/src/views/NSColor+RingTheme.mm b/src/views/NSColor+RingTheme.mm
index 98cd8e3..a7a107d 100644
--- a/src/views/NSColor+RingTheme.mm
+++ b/src/views/NSColor+RingTheme.mm
@@ -114,14 +114,15 @@
 
 + (NSImage*) image:(NSImage*) img tintedWithColor:(NSColor *)tint
 {
+    NSImage* image = img;
     if (tint) {
-        [img lockFocus];
+        [image lockFocus];
         [tint set];
-        NSRect imageRect = {NSZeroPoint, [img size]};
+        NSRect imageRect = {NSZeroPoint, [image size]};
         NSRectFillUsingOperation(imageRect, NSCompositeSourceAtop);
-        [img unlockFocus];
+        [image unlockFocus];
     }
-    return img;
+    return image;
 }
 
 @end