// // Copyright 2014 Perforce Software Inc. // using Perforce.Model; using Perforce.View; using Perforce.ViewModel; using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Text; using System.IO; using System.Text.RegularExpressions; namespace Perforce.Helper { public class GridHelper { public static ListingItem GenerateGrid(SidebarSelector selector, string path) { Log.TraceFunction(); UIHelper.SetBusyState(); var helper = Utility.GetPerforceHelper(); var isDirectory = false; if (path.StartsWith("//")) { isDirectory = helper.IsDirectory(path); } else { isDirectory = Directory.Exists(path); } ListingItem pathItem = ListingHelper.GetItem(path, null, isDirectory); if (pathItem == null) return pathItem; var grid = selector.SidbebarView.ListingGrid; ClearGrid(grid); switch (selector.SelectorType) { case SELECTOR_TYPE.WORKSPACE: var clientRoot = helper.CurrentClient.Root; var driveLetter = Path.GetPathRoot(clientRoot); var parts = Regex.Replace(pathItem.ClientPath.Replace('\\', '/'), clientRoot.Replace('\\', '/'), "", RegexOptions.IgnoreCase).TrimStart('/').Split('/'); var header = string.Empty; string clientPath = clientRoot; for (var colNum = 0; colNum < parts.Length; colNum++) { var selected = string.Empty; if (colNum < parts.Length) selected = parts[colNum]; if (colNum < parts.Length - 1 || Directory.Exists(clientPath)) { var col = new ColumnDisplay(selector, colNum, clientPath, header, selected, true); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.Children.Add(col); Grid.SetColumn(col, grid.ColumnDefinitions.Count - 1); } else { var info = new ListingItemInfo(pathItem); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.Children.Add(info); Grid.SetColumn(info, grid.ColumnDefinitions.Count - 1); } clientPath = Path.Combine(clientPath, parts[colNum]); header = selected; } AddDummyColumnToGrid(grid); break; case SELECTOR_TYPE.SERVER: parts = path.Substring(2).Split('/'); header = string.Empty; StringBuilder pathBuilder = new StringBuilder("//"); for(var colNum=0; colNum<=parts.Length; colNum++) { var selected = string.Empty; if (colNum < parts.Length) selected = parts[colNum]; if (colNum < parts.Length - 1 || helper.IsDirectory(pathBuilder.ToString())) { var col = new ColumnDisplay(selector, colNum, pathBuilder.ToString(), header, selected, true); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.Children.Add(col); Grid.SetColumn(col, grid.ColumnDefinitions.Count - 1); } else { var info = new ListingItemInfo(pathItem); grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.Children.Add(info); Grid.SetColumn(info, grid.ColumnDefinitions.Count - 1); } if(!pathBuilder.ToString().EndsWith("/")) pathBuilder.Append("/"); pathBuilder.Append(selected); header = selected; } AddDummyColumnToGrid(grid); break; case SELECTOR_TYPE.RECENT: break; case SELECTOR_TYPE.PENDING: break; case SELECTOR_TYPE.TRASH: break; case SELECTOR_TYPE.FAVORITE: break; } return pathItem; } public static void ClearGrid(Grid grid) { Log.TraceFunction(); grid.ColumnDefinitions.Clear(); grid.Children.Clear(); } public static ColumnDisplay InitializeGrid(SidebarSelector selector, int column = 0, string path = null, string header = null, string selected = null) { Log.TraceFunction(); var col = new ColumnDisplay(selector, column: column, path: path, header: header, selected: selected); var grid = selector.SidbebarView.ListingGrid; if (grid == null) { grid = new Grid(); } else { grid.Children.Clear(); grid.ColumnDefinitions.Clear(); } grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.Children.Add(col); Grid.SetColumn(col, 0); AddDummyColumnToGrid(grid); return col; } public static void SetColumnInGrid(SidebarSelector selector, ListingItem selection = null, string selected = null) { Log.TraceFunction(); if (selection != null) { var grid = selector.SidbebarView.ListingGrid; var column = selection.ColumnContext.Model.ColumnNumber; RemoveColumnsToRight(grid, column); AddColumnToGrid(selector, selection, selected); } } public static void AddColumnToGrid(SidebarSelector selector, ListingItem selection, string selected = null) { Log.TraceFunction(); var header = selection.LabelText; string path = null; switch (selector.SelectorType) { case SELECTOR_TYPE.WORKSPACE: path = selection.ClientPath; break; case SELECTOR_TYPE.SERVER: path = selection.DepotPath; break; case SELECTOR_TYPE.FAVORITE: var item = (selector.Model as FavoritesViewModel).Item; if (item.Selector == SELECTOR_TYPE.WORKSPACE) { path = selection.ClientPath; } else { path = selection.DepotPath; } break; } var col = new ColumnDisplay(selector, column: selection.ColumnContext.Model.ColumnNumber + 1, path: path, header: header, selected: selected); var grid = selector.SidbebarView.ListingGrid; grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); grid.Children.Add(col); Grid.SetColumn(col, grid.ColumnDefinitions.Count - 1); AddDummyColumnToGrid(grid); } public static ColumnDisplay GetLastColumnDisplay(Grid grid) { Log.TraceFunction(); ColumnDisplay col = null; if (grid != null) { for (var i = grid.ColumnDefinitions.Count - 1; i >= 0; i--) { var element = grid.Children.Cast().FirstOrDefault(e => Grid.GetColumn(e) == i && Grid.GetRow(e) == 0); if (element is ColumnDisplay) { col = element as ColumnDisplay; break; } } } return col; } public static ColumnDisplay GetGridColumn(Grid grid, int num) { Log.TraceFunction(); ColumnDisplay col = null; var element = grid.Children.Cast().FirstOrDefault(e => Grid.GetColumn(e) == num && Grid.GetRow(e) == 0); if (element is ColumnDisplay) { col = element as ColumnDisplay; } return col; } private static string VERSION_COLUMN_NAME = "VERSION"; public static void ShowVersionInfo(Grid grid, ListingItem item, bool dummy=true) { Log.TraceFunction(); RemoveDummyColumn(grid); RemoveVersionInfo(grid); grid.ColumnDefinitions.Add(new ColumnDefinition() { Name = VERSION_COLUMN_NAME, Width = GridLength.Auto }); var versions = new VersionInfo(item.DepotPath); grid.Children.Add(versions); Grid.SetColumn(versions, grid.ColumnDefinitions.Count - 1); if (dummy) { AddDummyColumnToGrid(grid); } } private static string HISTORY_COLUMN_NAME = "HISTORY"; public static void ShowFolderHistory(Grid grid, FolderItem folder, bool dummy = true) { Log.TraceFunction(); var currentColNum = folder.ColumnContext.Model.ColumnNumber; RemoveColumnsToRight(grid, currentColNum); grid.ColumnDefinitions.Add(new ColumnDefinition() { Name = HISTORY_COLUMN_NAME, Width = GridLength.Auto }); var history = new FolderHistory(folder.ClientPath); grid.Children.Add(history); Grid.SetColumn(history, currentColNum+1); if (dummy) { AddDummyColumnToGrid(grid); } } public static void RemoveVersionInfo(Grid grid) { Log.TraceFunction(); var lastColumn = grid.ColumnDefinitions.Count - 1; if (lastColumn >= 0 && grid.ColumnDefinitions[lastColumn].Name.Equals(VERSION_COLUMN_NAME, StringComparison.CurrentCultureIgnoreCase)) { grid.ColumnDefinitions.RemoveAt(lastColumn); grid.Children.RemoveAt(lastColumn); } } private static string DUMMY_COLUMN_NAME = "DUMMY"; public static void RemoveDummyColumn(Grid grid) { Log.TraceFunction(); var lastColumn = grid.ColumnDefinitions.Count - 1; if (lastColumn >= 0 && grid.ColumnDefinitions[lastColumn].Name.Equals(DUMMY_COLUMN_NAME)) { grid.ColumnDefinitions.RemoveAt(lastColumn); grid.Children.RemoveAt(lastColumn); } } public static void AddDummyColumnToGrid(Grid grid) { Log.TraceFunction(); grid.ColumnDefinitions.Add(new ColumnDefinition() { Name = DUMMY_COLUMN_NAME }); var dummy = new Label(); Grid.SetColumn(dummy, grid.ColumnDefinitions.Count - 1); grid.Children.Add(dummy); } public static void RemoveColumnsToRight(Grid grid, int currentColumn) { Log.TraceFunction(); var nextColumn = currentColumn + 1; for (var i = nextColumn; i < grid.ColumnDefinitions.Count; i++) { grid.Children.RemoveAt(nextColumn); grid.ColumnDefinitions.RemoveAt(nextColumn); } } } }