Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
    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);
                    }
                }
            }
        }
    }
Ejemplo n.º 3
0
        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();
        }