public override void Invoke(object sender, ModuleToolEventArgs e) { var panel = Far.Api.Panel; if (panel.IsPlugin || panel.Kind != PanelKind.File) { return; } var path = panel.CurrentDirectory; var run = new SizeRun(); if (!run.Run(Directory.GetDirectories(path), Directory.GetFiles(path))) { return; } var sb = new StringBuilder(); foreach (var it in run.Errors) { sb.AppendLine(it.Message); } if (sb.Length > 0) { Message(sb.ToString()); } var sorted = run.Result.OrderBy(x => x.Size).ToList(); if (sorted.Count == 0) { return; } var totalSize = run.Result.Sum(x => x.Size); var title = Kit.FormatSize(totalSize, path); var maxSizeToShow = sorted[sorted.Count - 1].Size / HIDDEN_FACTOR; long sumHiddenSizes = 0; int index = 0; for (; index < sorted.Count; ++index) { if (sorted[index].Size <maxSizeToShow || sorted.Count - index> MAX_ITEM_COUNT) { sumHiddenSizes += sorted[index].Size; } else { break; } } if (index > 0) { sorted.RemoveRange(0, index); } if (sumHiddenSizes > 0) { sorted.Insert(0, new FolderItem() { Name = string.Empty, Size = sumHiddenSizes }); } var result = FolderChartForm.Show(title, sorted, new WindowWrapper(Far.Api.UI.MainWindowHandle)); if (result == null) { return; } var path2 = Path.Combine(path, result); if (Directory.Exists(path2)) { panel.CurrentDirectory = path2; } else if (File.Exists(path2)) { bool ok = panel.GoToName(result, false); if (!ok) { Message(path2 + " exists but it is not in the panel."); } } else { Message(path2 + " does not exist."); } panel.Redraw(); }
public static string Show(string title, IEnumerable <FolderItem> data, IWin32Window window) { string result = null; using (var series = new Series()) { series.ChartType = SeriesChartType.Pie; series.SmartLabelStyle.Enabled = true; foreach (var it in data) { var point = series.Points.Add(it.Size); point.Label = it.Name; point.ToolTip = Kit.FormatSize(it.Size, it.Name); } using (var chart = new Chart()) { chart.Dock = DockStyle.Fill; using (var area = new ChartArea()) { chart.ChartAreas.Add(area); chart.Series.Add(series); using (var form = new Form()) { form.Text = title; form.Size = new Size(600, 600); form.StartPosition = FormStartPosition.CenterParent; form.Controls.Add(chart); // mouse click chart.MouseClick += (sender, e) => { var hit = chart.HitTest(e.X, e.Y); // pick a result item or switch chart modes if (e.Button == MouseButtons.Left) { if (hit.ChartElementType == ChartElementType.DataPoint) { if (hit.PointIndex >= 0 && series.Points[hit.PointIndex].Label.Length > 0) { form.Close(); result = series.Points[hit.PointIndex].Label; } } else { if (series.ChartType == SeriesChartType.Pie) { series.ChartType = SeriesChartType.Bar; } else { series.ChartType = SeriesChartType.Pie; } } } // remove an item from the chart else if (e.Button == MouseButtons.Right) { if (hit.ChartElementType == ChartElementType.DataPoint) { if (hit.PointIndex >= 0) { series.Points.RemoveAt(hit.PointIndex); } } } }; // mouse move: highlight an item chart.MouseMove += (sender, e) => { var hit = chart.HitTest(e.X, e.Y); foreach (var point in series.Points) { point.BackSecondaryColor = Color.Black; point.BackHatchStyle = ChartHatchStyle.None; } if (hit.ChartElementType == ChartElementType.DataPoint && hit.PointIndex >= 0) { form.Cursor = Cursors.Hand; var point = series.Points[hit.PointIndex]; point.BackSecondaryColor = Color.White; point.BackHatchStyle = ChartHatchStyle.DiagonalCross; } else { form.Cursor = Cursors.Default; } }; form.ShowDialog(window); return(result); } } } } }
public override void Invoke(object sender, ModuleToolEventArgs e) { var panel = Far.Api.Panel; if (panel.IsPlugin || panel.Kind != PanelKind.File) { return; } var path = panel.CurrentDirectory; var run = new SizeRun(); if (!run.Run(Directory.GetDirectories(path), Directory.GetFiles(path))) { return; } var sorted = run.Result.OrderBy(x => x.Size).ToList(); if (sorted.Count == 0) { return; } var totalSize = run.Result.Sum(x => x.Size); var title = Kit.FormatSize(totalSize, path); var maxSizeToShow = sorted[sorted.Count - 1].Size / HIDDEN_FACTOR; long sumHiddenSizes = 0; int index = 0; for (; index < sorted.Count; ++index) { if (sorted[index].Size <maxSizeToShow || sorted.Count - index> MAX_ITEM_COUNT) { sumHiddenSizes += sorted[index].Size; } else { break; } } if (index > 0) { sorted.RemoveRange(0, index); } if (sumHiddenSizes > 0) { sorted.Insert(0, new FolderItem() { Name = string.Empty, Size = sumHiddenSizes }); } var errors = run.GetErrors(); if (errors.Length > 0) { title = string.Format("{0} ~ Cannot read: {1}", title, errors.Length); } // handle clicks Action <string> action = (result) => { Far.Api.PostJob(() => { var path2 = Path.Combine(path, result); if (Directory.Exists(path2)) { panel.CurrentDirectory = path2; } else if (File.Exists(path2)) { panel.GoToName(result, false); } panel.Redraw(); }); }; // start non-blocking form var thread = new Thread(() => { FolderChartForm.Show(title, sorted, action); }); thread.Start(); }