using System;
using System.Collections.Generic;
using PDFPatcher.Common;
using PDFPatcher.Model;
namespace PDFPatcher.Processor
{
internal static class SourceItemSerializer
{
static readonly BookmarkSettings __EmptyBookmark = new BookmarkSettings();
///
/// 保存合并文件功能的列表。
///
/// 文件列表项目。
/// 文件列表的保存路径。
internal static void Serialize(IList list, FilePath path) {
var d = new PdfInfoXmlDocument();
var b = d.BookmarkRoot;
foreach (var item in list) {
SerializeSourceItem(d, b, item, path);
}
try {
d.Save(path);
}
catch (Exception ex) {
AppContext.MainForm.ErrorBox("保存文件列表时遇到错误", ex);
}
}
static void SerializeSourceItem(PdfInfoXmlDocument doc, BookmarkContainer container, SourceItem item, FilePath basePath) {
var e = doc.CreateBookmark(item.Bookmark ?? __EmptyBookmark);
switch (item.Type) {
case SourceItem.ItemType.Empty:
break;
case SourceItem.ItemType.Pdf:
e.SetValue(Constants.PageRange, ((SourceItem.Pdf)item).PageRanges);
goto default;
default:
e.SetValue(Constants.DestinationAttributes.Path, basePath.GetRelativePath(item.FilePath));
break;
}
container.AppendChild(e);
if (item.HasSubItems) {
foreach (var sub in item.Items) {
SerializeSourceItem(doc, e, sub, basePath);
}
}
}
internal static List Deserialize(FilePath path) {
var d = new PdfInfoXmlDocument();
try {
d.Load(path);
}
catch (Exception ex) {
AppContext.MainForm.ErrorBox("在加载文件列表时遇到错误", ex);
}
var bl = d.Bookmarks;
var l = new List(bl.Count);
path = path.Directory;
foreach (BookmarkElement item in bl) {
DeserializeSourceItem(l, item, path);
}
return l;
}
static void DeserializeSourceItem(List list, BookmarkElement bookmark, FilePath basePath) {
var b = new BookmarkSettings(bookmark);
var p = bookmark.GetValue(Constants.DestinationAttributes.Path);
var s = String.IsNullOrEmpty(p) ? SourceItem.Create() : SourceItem.Create(basePath.Combine(p), false);
if (!b.Title.IsNullOrWhiteSpace() || b.IsOpened || b.IsBold || b.IsItalic || !b.ForeColor.IsEmptyOrTransparent()) {
s.Bookmark = b;
}
if (s.Type == SourceItem.ItemType.Pdf) {
((SourceItem.Pdf)s).PageRanges = bookmark.GetValue(Constants.PageRange);
}
list.Add(s);
if (bookmark.HasSubBookmarks) {
foreach (BookmarkElement sub in bookmark.SubBookmarks) {
DeserializeSourceItem(s.Items, sub, basePath);
}
}
}
}
}