// // ViewController.swift // SearchDemo // // Created by Ralf Gronkowski on 13/10/14. // Copyright (c) 2014 Ralf Gronkowski. All rights reserved. // import UIKit class ViewController: UITableViewController, SearchViewControllerDelegate { var files = [P4FileRev]() var userId:NSString? var ticket:NSString? var message:NSString? override func viewDidLoad() { super.viewDidLoad() tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "CellIdentifier") setupNavigationBar() } override func viewWillAppear(animated: Bool) { userId = NSUserDefaults.standardUserDefaults().stringForKey(SettingsKeys.namePreferenceKey) ticket = NSUserDefaults.standardUserDefaults().stringForKey(SettingsKeys.passwordPreferenceKey) super.viewWillAppear(animated) tableView.reloadData() } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if (self.files.count == 0) { return 1 } return files.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var image : UIImage? let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell let index = UInt(indexPath.row) cell.textLabel?.numberOfLines = 0 if self.files.isEmpty { cell.imageView?.image = nil if (message != nil) { cell.textLabel?.text = message } else { cell.textLabel?.text = "Tap Search to define a P4Search query" if ((userId) != nil){ cell.textLabel?.text = "Hi " + userId! + ", tap Search to define a P4Search query" } } cell.accessoryType = UITableViewCellAccessoryType.None } else { cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator var image : UIImage? switch files[indexPath.row].getP4FileType(){ case "text","xtext": image = UIImage(named: "Text") case "binary","xbinary","ubinary": if (files[indexPath.row].getFileRev().uppercaseString.rangeOfString(".JPG#", options: nil, range: nil, locale: nil) != nil){ image = UIImage(named: "Image") } else if (files[indexPath.row].getFileRev().uppercaseString.rangeOfString(".MP3#", options: nil, range: nil, locale: nil) != nil){ image = UIImage(named: "Music") } default: image = nil } cell.imageView?.image = image cell.textLabel?.text = files[indexPath.row].getFileRev() } return cell } func setupNavigationBar() { let deleteBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Trash, target: self, action: "deleteButtonAction") let searchBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Search, target: self, action: "searchButtonAction") navigationItem.rightBarButtonItems = [searchBarButtonItem, deleteBarButtonItem] } func deleteButtonAction() { self.files.removeAll(keepCapacity: false) self.tableView.reloadData() } func searchButtonAction() { let searchViewController = SearchViewController(nibName: nil, bundle: nil) searchViewController.delegate = self let navController = UINavigationController(rootViewController: searchViewController) presentViewController(navController, animated: true, completion: nil) } func didFinishTypingText(typedText: String?) { if typedText?.utf16Count > 0 { var error: NSError? var response: NSURLResponse? self.files.removeAll(keepCapacity: false) let urlPath = NSUserDefaults.standardUserDefaults().stringForKey(SettingsKeys.p4searchURLPreferenceKey)! + "search" let url: NSURL = NSURL(string: urlPath) let session = NSURLSession.sharedSession() let request = NSMutableURLRequest(URL: url) request.HTTPMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let jsonString = "{\"userId\":\"\(userId!)\",\"ticket\":\"\(ticket!)\",\"queryRaw\":\"\(typedText!)\"}" let postdata: NSData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)! request.HTTPBody = postdata let p4SearchConnection = NSURLConnection(request: request, delegate: self) var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error) as NSData? if let actualError = error { NSLog("Error in P4Search connection: \(actualError.localizedDescription)") self.message = actualError.localizedDescription } else { var httpResponse: NSHTTPURLResponse = response as NSHTTPURLResponse! if httpResponse.statusCode != 200 { NSLog(httpResponse.description) self.message = httpResponse.description } else { var jsonResult = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary? let httpResponse: NSURLResponse = response! if let actualError = error { NSLog("Error in P4Search response content: \(actualError.localizedDescription)") self.message = actualError.localizedDescription } else { let json :JSON = JSON(object: jsonResult!) if json["status"]["code"].stringValue == "200" { let count: Int? = json["payload"].arrayValue!.count if count > 0 { for index in 0...count!-1 { let depotFile = json["payload"][index]["depotFile"].stringValue let rev = json["payload"][index]["rev"].stringValue let type = json["payload"][index]["type"].stringValue let time = json["payload"][index]["time"].stringValue let action = json["payload"][index]["action"].stringValue let change = json["payload"][index]["change"].stringValue self.files.append(P4FileRev(file: depotFile, rev: rev, type: type, time: time, action: action, change: change)) } self.tableView.reloadData() } else { self.message = "No file revision matches your query." } } else { NSLog(json["status"]["message"].stringValue!) } } } } } } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ if !self.files.isEmpty { let aP4FileRev: P4FileRev = self.files[indexPath.row] switch files[indexPath.row].getP4FileType(){ case "text","xtext": let textViewController = TextViewController(theP4FileRev: aP4FileRev) let navController = UINavigationController(rootViewController: textViewController) presentViewController(navController, animated: true, completion: nil) case "binary","xbinary","ubinary": if (files[indexPath.row].getFileRev().uppercaseString.rangeOfString(".JPG#", options: nil, range: nil, locale: nil) != nil){ let imageViewController = ImageViewController(theP4FileRev: aP4FileRev) let navController = UINavigationController(rootViewController: imageViewController) presentViewController(navController, animated: true, completion: nil) } else if (files[indexPath.row].getFileRev().uppercaseString.rangeOfString(".MP3#", options: nil, range: nil, locale: nil) != nil){ let soundViewController = SoundViewController(theP4FileRev: aP4FileRev) let navController = UINavigationController(rootViewController: soundViewController) presentViewController(navController, animated: true, completion: nil) } default: NSLog("no clue what to do here") } } } }