// // Copyright 2014 Perforce Software Inc. // using Perforce.Helper; using Perforce.Model; using Perforce.P4; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Media.Imaging; namespace Perforce.ViewModel { public class ListingItemInfoViewModel : ViewModelBase { private FileMetaData _metaData; private ListingItem _item; public ListingItemInfoViewModel(ListingItem item) { _item = item; RefreshMetadata(item.DepotPath); } public ListingItem Item { get { return _item; } } public void RefreshMetadata(string path = null) { if (path == null) { path = DepotFile; } if (path != null) { var helper = Utility.GetPerforceHelper(); _metaData = helper.RunFstat(path); if (_metaData == null) { _metaData = new FileMetaData(); } OnPropertyChanged(string.Empty); } } public FileMetaData MetaData { get { return _metaData; } set { _metaData = value; } } public string DepotFile { get { string path = null; if (_metaData != null) { path = (_metaData.DepotPath != null) ? _metaData.DepotPath.Path : null; } return path; } } public string ClientFile { get { return (_metaData.ClientPath != null) ? _metaData.ClientPath.Path : null; } } public string ModifiedDate { get { var md = string.Empty; var headTime = _metaData.HeadTime; if (headTime.Ticks == 0) { md = "----"; } else { md = String.Format("{0:yyyy/MM/dd HH:mm:ss}", headTime.ToLocalTime()); } return md; } } public string CheckedOutLabel { get { if (_metaData.Action != FileAction.None) { return "You"; } else if (_metaData.OtherActions != null && _metaData.OtherActions.Count > 0) { var keys = _metaData.OtherUsers.Keys; return keys.ToArray()[0]; } else { return "Nobody"; } } } private static string[] graphicFiles = { ".jpg", ".jpeg", ".png", ".gif", ".tiff" }; public bool HasThumbnail { get { var thumbPresent = false; if (_metaData != null && _metaData.Attributes != null) { thumbPresent = _metaData.Attributes.ContainsKey("thumb"); } var ext = string.Empty; if (_metaData != null && _metaData.LocalPath != null) { ext = Path.GetExtension(_metaData.LocalPath.Path); } if(!string.IsNullOrEmpty(ext) && graphicFiles.Contains(ext.ToLowerInvariant())) { if (_metaData.Action == FileAction.Edit || _metaData.Action == FileAction.Add || _metaData.Action == FileAction.MoveAdd) { try { var bi = new BitmapImage(); bi.BeginInit(); bi.UriSource = new System.Uri(_metaData.LocalPath.Path, UriKind.Absolute); bi.DecodePixelHeight = 140; bi.EndInit(); var pngEncoder = new PngBitmapEncoder(); pngEncoder.Frames.Add(BitmapFrame.Create(bi)); using (MemoryStream ms = new MemoryStream()) { pngEncoder.Save(ms); _thumbnail = ms.ToArray(); thumbPresent = true; } } catch (Exception) { // cannot create thumbnail of specified file } } } return thumbPresent; } } public IList OtherUsers { get { if (_metaData.OtherUsers != null) { var otherList = new List(); foreach (var u in _metaData.OtherUsers.Values) { otherList.Add(u); } return otherList; } else { return null; } } } public string FileName { get { return _item.LabelText; } } public string Revision { get { var v = "{none}"; if (_metaData.HeadRev > 0) { v = _metaData.HeadRev.ToString(); } return v; } } private byte[] _thumbnail; public byte[] Thumbnail { get { if (_thumbnail == null && _metaData.Attributes.ContainsKey("thumb")) { var thumbHex = _metaData.Attributes["thumb"] as string; _thumbnail = ListingHelper.HexToBytes(thumbHex); } return _thumbnail; } } public string DefaultThumbnail { get { var extension = Path.GetExtension(_item.LabelText); return UIHelper.GetDefaultIcon(extension); } } public string[] Tags { get { string[] tags = null; if (_metaData != null && _metaData.Attributes != null) { if (_metaData.Attributes.ContainsKey("tags")) { var hexTags = _metaData.Attributes["tags"] as string; var tagList = ListingHelper.HexToString(hexTags); tags = tagList.Split(','); } } return tags; } } public bool CanEdit { get { return MetadataHelper.CanEdit(_item as FileItem); } } public void Refresh() { OnPropertyChanged(string.Empty); } } }