using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using BrightIdeasSoftware; using PDFPatcher.Common; using PDFPatcher.Model; namespace PDFPatcher.Functions { sealed class FileListHelper { public delegate void AddFilesCallback(string[] files, bool alertInvalidFiles); readonly ObjectListView _fileList; public FileListHelper(ObjectListView fileList) { _fileList = fileList; } /// /// 设置 PDF 文件列表的拖放操作。 /// /// 添加文件的回调函数。 public void SetupDragAndDrop(AddFilesCallback addFilesCallback) { _fileList.DragSource = new SimpleDragSource(true); var ds = new RearrangingDropSink(false); _fileList.DropSink = ds; ds.CanDrop += (s, args) => { var files = FormHelper.DropFileOver(args.DragEventArgs, Constants.FileExtensions.Pdf); if (files.Length > 0) { args.Effect = DragDropEffects.Link; args.InfoMessage = "添加 " + files.Length.ToString() + " 个文件"; args.Handled = true; } }; ds.Dropped += (s, args) => { var files = FormHelper.DropFileOver(args.DragEventArgs, Constants.FileExtensions.Pdf); if (files.Length > 0) { _fileList.SelectedIndex = args.DropTargetLocation == DropTargetLocation.Background ? _fileList.GetItemCount() - 1 : args.DropTargetIndex + (args.DropTargetLocation == DropTargetLocation.AboveItem ? -1 : 0); addFilesCallback(files, false); args.Handled = true; } }; } /// /// 打开 PDF 文件的 显示下拉文件列表的事件处理函数。 /// /// /// public static void OpenPdfButtonDropDownOpeningHandler(object sender, EventArgs e) { var b = sender as ToolStripSplitButton; var l = b.DropDown.Items; l.ClearDropDownItems(); foreach (var item in AppContext.Recent.SourcePdfFiles) { l.Add(FileHelper.GetEllipticPath(item, 50)).ToolTipText = item; } if (l.Count == 0) { b.PerformButtonClick(); } } /// /// 以指定编码刷新文件列表的选定项目。 /// /// 用于读取文档元数据的 。 public void RefreshInfo(Encoding encoding) { var ol = _fileList.SelectedObjects; if (ol.Count == 0) { _fileList.SelectAll(); ol = _fileList.SelectedObjects; } foreach (SourceItem.Pdf item in ol) { item.Refresh(encoding); } _fileList.RefreshObjects(ol); } /// /// 为 设置读写处理函数。 /// /// 需要设置的列。 public static void SetupCommonPdfColumns(params OLVColumn[] columns) { foreach (var item in columns) { switch (item.Text) { case "源文件名": SetupFileNameColumn(item); break; case "文件夹": SetupFolderNameColumn(item); break; case "标题": SetupTitleColumn(item); break; case "作者": SetupAuthorColumn(item); break; case "主题": SetupSubjectColumn(item); break; case "关键词": SetupKeywordsColumn(item); break; case "页数": SetupPageCountColumn(item); break; case "修改时间": SetupFileTimeColumn(item); break; } } } static void SetupAuthorColumn(OLVColumn column) { column.AsTyped(c => { c.AspectGetter = o => o.DocInfo.Author; c.AspectPutter = (o, value) => o.DocInfo.Author = value as string; }); } static void SetupKeywordsColumn(OLVColumn column) { column.AsTyped(c => { c.AspectGetter = o => o.DocInfo.Keywords; c.AspectPutter = (o, value) => o.DocInfo.Keywords = value as string; }); } static void SetupSubjectColumn(OLVColumn column) { column.AsTyped(c => { c.AspectGetter = o => o.DocInfo.Subject; c.AspectPutter = (o, value) => o.DocInfo.Subject = value as string; }); } static void SetupTitleColumn(OLVColumn column) { column.AsTyped(c => { c.AspectGetter = o => o.DocInfo.Title; c.AspectPutter = (o, value) => o.DocInfo.Title = value as string; }); } static void SetupPageCountColumn(OLVColumn column) { column.AsTyped(c => c.AspectGetter = o => o.PageCount.ToText()); } static void SetupFileNameColumn(OLVColumn column) { column.AsTyped(c => { c.AspectGetter = o => o.Type == SourceItem.ItemType.Empty ? "<空白页面>" : o.FileName; c.ImageGetter = o => 0; }); } static void SetupFolderNameColumn(OLVColumn column) { column.AsTyped(c => c.AspectGetter = o => o.Type != SourceItem.ItemType.Empty ? o.FolderName : String.Empty); } static void SetupFileTimeColumn(OLVColumn column) { column.AsTyped(c => c.AspectGetter = o => o.FileTime); column.AspectToStringConverter = o => ((DateTime)o).ToText(); } public void SetupHotkeys() { _fileList.KeyUp += (s, args) => { switch (args.KeyCode) { case Keys.Delete: if (_fileList.IsCellEditing || _fileList.Focused == false) { return; } ProcessCommonMenuCommand(Commands.Delete); break; } }; } public bool ProcessCommonMenuCommand(string commandID) { switch (commandID) { case Commands.Delete: if (_fileList.GetItemCount() == 0) { return true; } var l = _fileList.SelectedObjects; if (l.Count == 0) { if (FormHelper.YesNoBox("是否清空文件列表?") == DialogResult.Yes) { _fileList.ClearObjects(); } } else { _fileList.RemoveObjects(_fileList.SelectedObjects); } break; case "_Copy": var sb = StringBuilderCache.Acquire(); foreach (SourceItem.Pdf item in GetSourceItems(true)) { sb.AppendLine(String.Join("\t", new string[] { item.FilePath.ToString(), item.PageCount.ToText (), item.DocInfo.Title, item.DocInfo.Author, item.DocInfo.Subject, item.DocInfo.Keywords })); } if (sb.Length > 0) { Clipboard.SetText(StringBuilderCache.GetStringAndRelease(sb)); } else { StringBuilderCache.Release(sb); } break; case Commands.SelectAllItems: _fileList.SelectAll(); break; case Commands.InvertSelectItem: foreach (ListViewItem item in _fileList.Items) { item.Selected = !item.Selected; } break; case Commands.SelectNone: _fileList.SelectObjects(null); break; default: return false; } return true; } public List GetSourceItems(bool selectedOnly) where T : SourceItem { if (_fileList.GetItemCount() == 0) { return null; } var l = (selectedOnly ? _fileList.SelectedObjects : _fileList.Objects); var items = new List(selectedOnly ? 10 : _fileList.GetItemCount()); foreach (T item in l) { if (item == null) { continue; } items.Add(item); } return items; } public void PrepareSourceFiles() { var c = _fileList.GetItemCount(); if (c == 0) { return; } var f = new string[c]; var i = 0; foreach (SourceItem item in _fileList.Objects) { if (item.Type == SourceItem.ItemType.Pdf) { f[i++] = item.FilePath.ToString(); } } Array.Resize(ref f, i); AppContext.SourceFiles = f; } public void ResizeItemListColumns() { var c = _fileList.Columns[0]; _fileList.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); if (c.Width < 100) { c.Width = 100; } for (int i = 1; i < _fileList.Columns.Count; i++) { c = _fileList.Columns[i]; if (c.Width < 50) { c.Width = 50; } } } } }