From e0fbb2001b8c51ee1647c4c372a16b77d037f8cf Mon Sep 17 00:00:00 2001 From: Laurence Luo Date: Mon, 19 Feb 2024 15:34:36 +0800 Subject: [PATCH] Update --- FrmAboutBox.Designer.cs | 301 +++++++++++++++---------------- FrmAboutBox.cs | 6 +- FrmMain.Designer.cs | 97 +++++----- FrmMain.cs | 207 +++++++++++++++------ FrmMain.resx | 205 +++++++++++---------- KindleMate2.csproj | 37 +++- Properties/Resources.Designer.cs | 10 + Properties/Resources.resx | 7 +- Resources/plus.png | Bin 0 -> 6486 bytes StaticData.cs | 109 +++++++++++ 10 files changed, 619 insertions(+), 360 deletions(-) create mode 100644 Resources/plus.png diff --git a/FrmAboutBox.Designer.cs b/FrmAboutBox.Designer.cs index dd61308..e056e6c 100644 --- a/FrmAboutBox.Designer.cs +++ b/FrmAboutBox.Designer.cs @@ -26,216 +26,215 @@ protected override void Dispose(bool disposing) { /// private void InitializeComponent() { tableLayoutPanel = new TableLayoutPanel(); - logoPictureBox = new PictureBox(); + lblDatabase = new Label(); + lblPath = new LinkLabel(); + lblVersion = new Label(); labelProductName = new Label(); - labelCopyright = new Label(); - okButton = new Button(); - flowLayoutPanel1 = new FlowLayoutPanel(); + lblVersionText = new Label(); + lblCopyrightText = new Label(); + lblCopyright = new Label(); lblPathText = new Label(); - lblPath = new LinkLabel(); - flowLayoutPanel2 = new FlowLayoutPanel(); lblDatabaseText = new Label(); - lblDatabase = new Label(); - flowLayoutPanel3 = new FlowLayoutPanel(); - lblVersionText = new Label(); - lblVersion = new Label(); + okButton = new Button(); + flowLayoutPanel1 = new FlowLayoutPanel(); + pictureBox1 = new PictureBox(); + label1 = new Label(); tableLayoutPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)logoPictureBox).BeginInit(); flowLayoutPanel1.SuspendLayout(); - flowLayoutPanel2.SuspendLayout(); - flowLayoutPanel3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit(); SuspendLayout(); // // tableLayoutPanel // tableLayoutPanel.AutoSize = true; tableLayoutPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink; - tableLayoutPanel.ColumnCount = 2; - tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 30F)); - tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 70F)); - tableLayoutPanel.Controls.Add(logoPictureBox, 0, 0); + tableLayoutPanel.ColumnCount = 3; + tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F)); + tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F)); + tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 60F)); + tableLayoutPanel.Controls.Add(lblDatabase, 2, 5); + tableLayoutPanel.Controls.Add(lblPath, 2, 4); + tableLayoutPanel.Controls.Add(lblVersion, 2, 1); tableLayoutPanel.Controls.Add(labelProductName, 1, 0); - tableLayoutPanel.Controls.Add(labelCopyright, 1, 2); - tableLayoutPanel.Controls.Add(okButton, 1, 6); - tableLayoutPanel.Controls.Add(flowLayoutPanel1, 1, 4); - tableLayoutPanel.Controls.Add(flowLayoutPanel2, 1, 5); - tableLayoutPanel.Controls.Add(flowLayoutPanel3, 1, 1); + tableLayoutPanel.Controls.Add(lblVersionText, 1, 1); + tableLayoutPanel.Controls.Add(lblCopyrightText, 1, 2); + tableLayoutPanel.Controls.Add(lblCopyright, 2, 2); + tableLayoutPanel.Controls.Add(lblPathText, 1, 4); + tableLayoutPanel.Controls.Add(lblDatabaseText, 1, 5); + tableLayoutPanel.Controls.Add(okButton, 2, 6); + tableLayoutPanel.Controls.Add(flowLayoutPanel1, 0, 0); tableLayoutPanel.Dock = DockStyle.Fill; tableLayoutPanel.Location = new Point(0, 0); - tableLayoutPanel.Margin = new Padding(20); + tableLayoutPanel.Margin = new Padding(19, 18, 19, 18); tableLayoutPanel.Name = "tableLayoutPanel"; - tableLayoutPanel.Padding = new Padding(20); + tableLayoutPanel.Padding = new Padding(19, 18, 19, 18); tableLayoutPanel.RowCount = 7; tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 19.9991989F)); tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 19.9992F)); tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 19.9992F)); - tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F)); + tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 16F)); tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 20.0031986F)); tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 19.9992F)); - tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 54F)); - tableLayoutPanel.Size = new Size(1016, 378); + tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 49F)); + tableLayoutPanel.Size = new Size(943, 341); tableLayoutPanel.TabIndex = 0; // - // logoPictureBox + // lblDatabase + // + lblDatabase.AutoSize = true; + lblDatabase.Location = new Point(384, 223); + lblDatabase.Name = "lblDatabase"; + lblDatabase.Size = new Size(0, 28); + lblDatabase.TabIndex = 27; + // + // lblPath + // + lblPath.AutoEllipsis = true; + lblPath.LinkBehavior = LinkBehavior.HoverUnderline; + lblPath.Location = new Point(384, 175); + lblPath.MaximumSize = new Size(464, 0); + lblPath.Name = "lblPath"; + lblPath.Size = new Size(464, 47); + lblPath.TabIndex = 26; + lblPath.LinkClicked += LblPath_LinkClicked; + // + // lblVersion // - logoPictureBox.Dock = DockStyle.Top; - logoPictureBox.Image = Properties.Resources.bookmark; - logoPictureBox.Location = new Point(20, 20); - logoPictureBox.Margin = new Padding(0, 0, 10, 10); - logoPictureBox.Name = "logoPictureBox"; - tableLayoutPanel.SetRowSpan(logoPictureBox, 6); - logoPictureBox.Size = new Size(282, 270); - logoPictureBox.SizeMode = PictureBoxSizeMode.Zoom; - logoPictureBox.TabIndex = 12; - logoPictureBox.TabStop = false; + lblVersion.AutoSize = true; + lblVersion.Location = new Point(384, 65); + lblVersion.Margin = new Padding(3, 0, 0, 0); + lblVersion.MaximumSize = new Size(0, 37); + lblVersion.Name = "lblVersion"; + lblVersion.Size = new Size(0, 28); + lblVersion.TabIndex = 0; + lblVersion.TextAlign = ContentAlignment.MiddleLeft; // // labelProductName // + labelProductName.AutoSize = true; + tableLayoutPanel.SetColumnSpan(labelProductName, 2); labelProductName.Dock = DockStyle.Fill; - labelProductName.Location = new Point(326, 20); - labelProductName.Margin = new Padding(14, 0, 6, 0); - labelProductName.MaximumSize = new Size(0, 41); + labelProductName.Location = new Point(250, 18); + labelProductName.Margin = new Padding(50, 0, 6, 0); + labelProductName.MaximumSize = new Size(0, 37); labelProductName.Name = "labelProductName"; - labelProductName.Size = new Size(664, 41); + labelProductName.Size = new Size(668, 37); labelProductName.TabIndex = 19; labelProductName.Text = "产品名称"; labelProductName.TextAlign = ContentAlignment.MiddleLeft; // - // labelCopyright + // lblVersionText // - labelCopyright.Dock = DockStyle.Fill; - labelCopyright.Location = new Point(326, 124); - labelCopyright.Margin = new Padding(14, 0, 6, 0); - labelCopyright.MaximumSize = new Size(0, 41); - labelCopyright.Name = "labelCopyright"; - labelCopyright.Size = new Size(664, 41); - labelCopyright.TabIndex = 21; - labelCopyright.Text = "版权"; - labelCopyright.TextAlign = ContentAlignment.MiddleLeft; + lblVersionText.AutoSize = true; + lblVersionText.Location = new Point(250, 65); + lblVersionText.Margin = new Padding(50, 0, 6, 0); + lblVersionText.MaximumSize = new Size(0, 37); + lblVersionText.Name = "lblVersionText"; + lblVersionText.Size = new Size(54, 28); + lblVersionText.TabIndex = 1; + lblVersionText.Text = "版本"; + lblVersionText.TextAlign = ContentAlignment.MiddleLeft; // - // okButton + // lblCopyrightText // - okButton.AutoSizeMode = AutoSizeMode.GrowAndShrink; - okButton.DialogResult = DialogResult.Cancel; - okButton.Dock = DockStyle.Right; - okButton.Location = new Point(849, 307); - okButton.Margin = new Padding(6, 7, 6, 7); - okButton.Name = "okButton"; - okButton.Size = new Size(141, 44); - okButton.TabIndex = 24; - okButton.Text = "确定(&O)"; + lblCopyrightText.AutoSize = true; + lblCopyrightText.Location = new Point(250, 112); + lblCopyrightText.Margin = new Padding(50, 0, 6, 0); + lblCopyrightText.MaximumSize = new Size(0, 37); + lblCopyrightText.Name = "lblCopyrightText"; + lblCopyrightText.Size = new Size(54, 28); + lblCopyrightText.TabIndex = 29; + lblCopyrightText.Text = "版权"; + lblCopyrightText.TextAlign = ContentAlignment.MiddleLeft; // - // flowLayoutPanel1 + // lblCopyright // - flowLayoutPanel1.AutoSize = true; - flowLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink; - flowLayoutPanel1.Controls.Add(lblPathText); - flowLayoutPanel1.Controls.Add(lblPath); - flowLayoutPanel1.Dock = DockStyle.Fill; - flowLayoutPanel1.Location = new Point(312, 196); - flowLayoutPanel1.Margin = new Padding(0); - flowLayoutPanel1.Name = "flowLayoutPanel1"; - flowLayoutPanel1.Size = new Size(684, 52); - flowLayoutPanel1.TabIndex = 27; - flowLayoutPanel1.WrapContents = false; + lblCopyright.AutoSize = true; + lblCopyright.Location = new Point(384, 112); + lblCopyright.Margin = new Padding(3, 0, 0, 0); + lblCopyright.MaximumSize = new Size(0, 37); + lblCopyright.Name = "lblCopyright"; + lblCopyright.Size = new Size(0, 28); + lblCopyright.TabIndex = 21; + lblCopyright.TextAlign = ContentAlignment.MiddleLeft; // // lblPathText // lblPathText.AutoSize = true; - lblPathText.Dock = DockStyle.Fill; - lblPathText.Location = new Point(14, 0); - lblPathText.Margin = new Padding(14, 0, 6, 0); + lblPathText.Location = new Point(250, 175); + lblPathText.Margin = new Padding(50, 0, 6, 0); lblPathText.Name = "lblPathText"; - lblPathText.Size = new Size(110, 31); + lblPathText.Size = new Size(96, 28); lblPathText.TabIndex = 25; lblPathText.Text = "程序路径"; // - // lblPath - // - lblPath.AutoEllipsis = true; - lblPath.LinkBehavior = LinkBehavior.HoverUnderline; - lblPath.Location = new Point(133, 0); - lblPath.MaximumSize = new Size(500, 0); - lblPath.Name = "lblPath"; - lblPath.Size = new Size(486, 31); - lblPath.TabIndex = 26; - lblPath.LinkClicked += LblPath_LinkClicked; - // - // flowLayoutPanel2 - // - flowLayoutPanel2.Controls.Add(lblDatabaseText); - flowLayoutPanel2.Controls.Add(lblDatabase); - flowLayoutPanel2.Dock = DockStyle.Fill; - flowLayoutPanel2.Location = new Point(312, 248); - flowLayoutPanel2.Margin = new Padding(0); - flowLayoutPanel2.Name = "flowLayoutPanel2"; - flowLayoutPanel2.Size = new Size(684, 52); - flowLayoutPanel2.TabIndex = 28; - // // lblDatabaseText // lblDatabaseText.AutoSize = true; - lblDatabaseText.Dock = DockStyle.Fill; - lblDatabaseText.Location = new Point(14, 0); - lblDatabaseText.Margin = new Padding(14, 0, 6, 0); + lblDatabaseText.Location = new Point(250, 223); + lblDatabaseText.Margin = new Padding(50, 0, 6, 0); lblDatabaseText.Name = "lblDatabaseText"; - lblDatabaseText.Size = new Size(86, 31); + lblDatabaseText.Size = new Size(75, 28); lblDatabaseText.TabIndex = 26; lblDatabaseText.Text = "数据库"; // - // lblDatabase + // okButton // - lblDatabase.AutoSize = true; - lblDatabase.Dock = DockStyle.Fill; - lblDatabase.Location = new Point(109, 0); - lblDatabase.Name = "lblDatabase"; - lblDatabase.Size = new Size(0, 31); - lblDatabase.TabIndex = 27; + okButton.AutoSizeMode = AutoSizeMode.GrowAndShrink; + okButton.DialogResult = DialogResult.Cancel; + okButton.Dock = DockStyle.Right; + okButton.Location = new Point(787, 276); + okButton.Margin = new Padding(6); + okButton.Name = "okButton"; + okButton.Size = new Size(131, 41); + okButton.TabIndex = 24; + okButton.Text = "确定(&O)"; // - // flowLayoutPanel3 + // flowLayoutPanel1 // - flowLayoutPanel3.Controls.Add(lblVersionText); - flowLayoutPanel3.Controls.Add(lblVersion); - flowLayoutPanel3.Dock = DockStyle.Fill; - flowLayoutPanel3.Location = new Point(312, 72); - flowLayoutPanel3.Margin = new Padding(0); - flowLayoutPanel3.Name = "flowLayoutPanel3"; - flowLayoutPanel3.Size = new Size(684, 52); - flowLayoutPanel3.TabIndex = 29; + flowLayoutPanel1.AutoSize = true; + flowLayoutPanel1.Controls.Add(pictureBox1); + flowLayoutPanel1.Controls.Add(label1); + flowLayoutPanel1.Dock = DockStyle.Fill; + flowLayoutPanel1.FlowDirection = FlowDirection.TopDown; + flowLayoutPanel1.Location = new Point(22, 21); + flowLayoutPanel1.Name = "flowLayoutPanel1"; + tableLayoutPanel.SetRowSpan(flowLayoutPanel1, 6); + flowLayoutPanel1.Size = new Size(175, 246); + flowLayoutPanel1.TabIndex = 30; // - // lblVersionText + // pictureBox1 // - lblVersionText.AutoSize = true; - lblVersionText.Location = new Point(14, 0); - lblVersionText.Margin = new Padding(14, 0, 6, 0); - lblVersionText.MaximumSize = new Size(0, 41); - lblVersionText.Name = "lblVersionText"; - lblVersionText.Size = new Size(62, 31); - lblVersionText.TabIndex = 1; - lblVersionText.Text = "版本"; - lblVersionText.TextAlign = ContentAlignment.MiddleLeft; + pictureBox1.Anchor = AnchorStyles.Top; + pictureBox1.Image = Properties.Resources.bookmark; + pictureBox1.Location = new Point(3, 3); + pictureBox1.Name = "pictureBox1"; + pictureBox1.Size = new Size(175, 179); + pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; + pictureBox1.TabIndex = 1; + pictureBox1.TabStop = false; // - // lblVersion + // label1 // - lblVersion.AutoSize = true; - lblVersion.Location = new Point(85, 0); - lblVersion.Margin = new Padding(3, 0, 0, 0); - lblVersion.MaximumSize = new Size(0, 41); - lblVersion.Name = "lblVersion"; - lblVersion.Size = new Size(62, 31); - lblVersion.TabIndex = 0; - lblVersion.Text = "版本"; - lblVersion.TextAlign = ContentAlignment.MiddleLeft; + label1.AutoSize = true; + label1.Dock = DockStyle.Top; + label1.Font = new Font("微软雅黑 Light", 6.857143F, FontStyle.Regular, GraphicsUnit.Point, 134); + label1.Location = new Point(3, 185); + label1.Name = "label1"; + label1.Size = new Size(175, 21); + label1.TabIndex = 2; + label1.Text = "Icons from Twemoji"; + label1.TextAlign = ContentAlignment.MiddleCenter; // // FrmAboutBox // AcceptButton = okButton; - AutoScaleDimensions = new SizeF(14F, 31F); + AutoScaleDimensions = new SizeF(13F, 28F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1016, 378); + ClientSize = new Size(943, 341); Controls.Add(tableLayoutPanel); FormBorderStyle = FormBorderStyle.FixedDialog; - Margin = new Padding(6, 7, 6, 7); + Margin = new Padding(6); MaximizeBox = false; MinimizeBox = false; Name = "FrmAboutBox"; @@ -246,13 +245,9 @@ private void InitializeComponent() { Load += FrmAboutBox_Load; tableLayoutPanel.ResumeLayout(false); tableLayoutPanel.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)logoPictureBox).EndInit(); flowLayoutPanel1.ResumeLayout(false); flowLayoutPanel1.PerformLayout(); - flowLayoutPanel2.ResumeLayout(false); - flowLayoutPanel2.PerformLayout(); - flowLayoutPanel3.ResumeLayout(false); - flowLayoutPanel3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit(); ResumeLayout(false); PerformLayout(); } @@ -260,18 +255,18 @@ private void InitializeComponent() { #endregion private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; - private System.Windows.Forms.PictureBox logoPictureBox; private System.Windows.Forms.Label labelProductName; private System.Windows.Forms.Label lblVersion; - private System.Windows.Forms.Label labelCopyright; + private System.Windows.Forms.Label lblCopyright; private System.Windows.Forms.Button okButton; private Label lblPathText; private Label lblDatabaseText; - private FlowLayoutPanel flowLayoutPanel1; private LinkLabel lblPath; - private FlowLayoutPanel flowLayoutPanel2; private Label lblDatabase; - private FlowLayoutPanel flowLayoutPanel3; private Label lblVersionText; + private Label lblCopyrightText; + private FlowLayoutPanel flowLayoutPanel1; + private PictureBox pictureBox1; + private Label label1; } } diff --git a/FrmAboutBox.cs b/FrmAboutBox.cs index 74a75aa..d81ee52 100644 --- a/FrmAboutBox.cs +++ b/FrmAboutBox.cs @@ -20,7 +20,9 @@ private static string FormatFileSize(long fileSize) { return $"{size:0.##} {sizes[order]}"; } - private static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? string.Empty; + private static string AssemblyVersion { + get => Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? string.Empty; + } private static string AssemblyProduct { get { @@ -45,7 +47,7 @@ private void FrmAboutBox_Load(object sender, EventArgs e) { labelProductName.Text = AssemblyProduct; lblVersion.Text = AssemblyVersion; - labelCopyright.Text = AssemblyCopyright; + lblCopyright.Text = AssemblyCopyright; var programsDirectory = AppDomain.CurrentDomain.BaseDirectory; lblPath.Text = programsDirectory; diff --git a/FrmMain.Designer.cs b/FrmMain.Designer.cs index b4a85d0..c4c5a11 100644 --- a/FrmMain.Designer.cs +++ b/FrmMain.Designer.cs @@ -27,7 +27,8 @@ private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); menuStrip = new MenuStrip(); toolStripMenuFile = new ToolStripMenuItem(); - toolStripMenuExit = new ToolStripMenuItem(); + menuImportKindle = new ToolStripMenuItem(); + menuExit = new ToolStripMenuItem(); toolStripMenuHelp = new ToolStripMenuItem(); toolStripMenuAbout = new ToolStripMenuItem(); splitContainer1 = new SplitContainer(); @@ -74,47 +75,55 @@ private void InitializeComponent() { menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; menuStrip.RenderMode = ToolStripRenderMode.System; - menuStrip.Size = new Size(1620, 39); + menuStrip.Size = new Size(1504, 37); menuStrip.TabIndex = 1; menuStrip.Text = "menuStrip2"; // // toolStripMenuFile // toolStripMenuFile.DisplayStyle = ToolStripItemDisplayStyle.Text; - toolStripMenuFile.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuExit }); + toolStripMenuFile.DropDownItems.AddRange(new ToolStripItem[] { menuImportKindle, menuExit }); toolStripMenuFile.Name = "toolStripMenuFile"; toolStripMenuFile.ShortcutKeyDisplayString = ""; toolStripMenuFile.ShortcutKeys = Keys.Alt | Keys.F; - toolStripMenuFile.Size = new Size(111, 35); + toolStripMenuFile.Size = new Size(97, 33); toolStripMenuFile.Text = "文件(&F)"; // - // toolStripMenuExit + // menuImportKindle // - toolStripMenuExit.Image = Properties.Resources.cross_mark_button; - toolStripMenuExit.Name = "toolStripMenuExit"; - toolStripMenuExit.Size = new Size(224, 44); - toolStripMenuExit.Text = "退出(&E)"; - toolStripMenuExit.Click += ToolStripMenuExit_Click; + menuImportKindle.Image = Properties.Resources.plus; + menuImportKindle.Name = "menuImportKindle"; + menuImportKindle.Size = new Size(319, 44); + menuImportKindle.Text = "导入Kindle标注(&I)"; + menuImportKindle.Click += MenuImportKindle_Click; + // + // menuExit + // + menuExit.Image = Properties.Resources.cross_mark_button; + menuExit.Name = "menuExit"; + menuExit.Size = new Size(319, 44); + menuExit.Text = "退出(&E)"; + menuExit.Click += MenuExit_Click; // // toolStripMenuHelp // toolStripMenuHelp.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuAbout }); toolStripMenuHelp.Name = "toolStripMenuHelp"; - toolStripMenuHelp.Size = new Size(117, 35); + toolStripMenuHelp.Size = new Size(102, 33); toolStripMenuHelp.Text = "帮助(&H)"; // // toolStripMenuAbout // toolStripMenuAbout.Image = Properties.Resources.information; toolStripMenuAbout.Name = "toolStripMenuAbout"; - toolStripMenuAbout.Size = new Size(228, 44); + toolStripMenuAbout.Size = new Size(200, 40); toolStripMenuAbout.Text = "关于(&A)"; toolStripMenuAbout.Click += ToolStripMenuAbout_Click; // // splitContainer1 // splitContainer1.Dock = DockStyle.Fill; - splitContainer1.Location = new Point(0, 39); + splitContainer1.Location = new Point(0, 37); splitContainer1.Name = "splitContainer1"; // // splitContainer1.Panel1 @@ -126,8 +135,8 @@ private void InitializeComponent() { // splitContainer1.Panel2.Controls.Add(splitContainer2); splitContainer1.Panel2MinSize = 100; - splitContainer1.Size = new Size(1620, 1009); - splitContainer1.SplitterDistance = 430; + splitContainer1.Size = new Size(1504, 910); + splitContainer1.SplitterDistance = 399; splitContainer1.TabIndex = 2; // // treeView @@ -143,7 +152,7 @@ private void InitializeComponent() { treeView.SelectedImageIndex = 1; treeView.ShowNodeToolTips = true; treeView.ShowRootLines = false; - treeView.Size = new Size(430, 1009); + treeView.Size = new Size(399, 910); treeView.StateImageList = imageList; treeView.TabIndex = 0; treeView.NodeMouseClick += TreeView_NodeMouseClick; @@ -173,8 +182,8 @@ private void InitializeComponent() { // splitContainer2.Panel2.Controls.Add(tableLayoutPanel); splitContainer2.Panel2MinSize = 200; - splitContainer2.Size = new Size(1186, 1009); - splitContainer2.SplitterDistance = 605; + splitContainer2.Size = new Size(1101, 910); + splitContainer2.SplitterDistance = 545; splitContainer2.TabIndex = 1; // // dataGridView @@ -192,7 +201,7 @@ private void InitializeComponent() { dataGridView.RowHeadersVisible = false; dataGridView.RowHeadersWidth = 82; dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; - dataGridView.Size = new Size(1186, 605); + dataGridView.Size = new Size(1101, 545); dataGridView.TabIndex = 0; dataGridView.CellDoubleClick += DataGridView_CellDoubleClick; dataGridView.CellMouseDown += DataGridView_CellMouseDown; @@ -213,13 +222,13 @@ private void InitializeComponent() { tableLayoutPanel.Location = new Point(0, 0); tableLayoutPanel.Margin = new Padding(0); tableLayoutPanel.Name = "tableLayoutPanel"; - tableLayoutPanel.Padding = new Padding(5, 6, 5, 6); + tableLayoutPanel.Padding = new Padding(5); tableLayoutPanel.RowCount = 4; tableLayoutPanel.RowStyles.Add(new RowStyle()); tableLayoutPanel.RowStyles.Add(new RowStyle()); tableLayoutPanel.RowStyles.Add(new RowStyle()); tableLayoutPanel.RowStyles.Add(new RowStyle()); - tableLayoutPanel.Size = new Size(1186, 400); + tableLayoutPanel.Size = new Size(1101, 361); tableLayoutPanel.TabIndex = 0; tableLayoutPanel.MouseDoubleClick += LblContent_MouseDoubleClick; // @@ -229,10 +238,10 @@ private void InitializeComponent() { lblLocation.BackColor = SystemColors.Window; lblLocation.Dock = DockStyle.Fill; lblLocation.Font = new Font("Microsoft YaHei UI Light", 10F); - lblLocation.Location = new Point(5, 53); - lblLocation.Margin = new Padding(0, 11, 0, 11); + lblLocation.Location = new Point(5, 46); + lblLocation.Margin = new Padding(0, 10, 0, 10); lblLocation.Name = "lblLocation"; - lblLocation.Size = new Size(1176, 35); + lblLocation.Size = new Size(1091, 31); lblLocation.TabIndex = 1; lblLocation.MouseDoubleClick += LblContent_MouseDoubleClick; // @@ -245,10 +254,10 @@ private void InitializeComponent() { flowLayoutPanel.Controls.Add(lblAuthor); flowLayoutPanel.Dock = DockStyle.Fill; flowLayoutPanel.Font = new Font("Microsoft YaHei UI", 12F, FontStyle.Regular, GraphicsUnit.Point, 134); - flowLayoutPanel.Location = new Point(5, 6); + flowLayoutPanel.Location = new Point(5, 5); flowLayoutPanel.Margin = new Padding(0); flowLayoutPanel.Name = "flowLayoutPanel"; - flowLayoutPanel.Size = new Size(1176, 36); + flowLayoutPanel.Size = new Size(1091, 31); flowLayoutPanel.TabIndex = 3; flowLayoutPanel.MouseDoubleClick += LblContent_MouseDoubleClick; // @@ -259,7 +268,7 @@ private void InitializeComponent() { lblBook.Location = new Point(0, 0); lblBook.Margin = new Padding(0); lblBook.Name = "lblBook"; - lblBook.Size = new Size(0, 36); + lblBook.Size = new Size(0, 31); lblBook.TabIndex = 0; lblBook.MouseDoubleClick += LblContent_MouseDoubleClick; // @@ -269,7 +278,7 @@ private void InitializeComponent() { lblAuthor.Font = new Font("Microsoft YaHei UI", 9.857143F, FontStyle.Regular, GraphicsUnit.Point, 134); lblAuthor.Location = new Point(3, 0); lblAuthor.Name = "lblAuthor"; - lblAuthor.Size = new Size(0, 35); + lblAuthor.Size = new Size(0, 31); lblAuthor.TabIndex = 1; lblAuthor.MouseDoubleClick += LblContent_MouseDoubleClick; // @@ -279,9 +288,9 @@ private void InitializeComponent() { lblContent.ContextMenuStrip = menuClippings; lblContent.Dock = DockStyle.Fill; lblContent.Font = new Font("Microsoft YaHei UI", 9.857143F, FontStyle.Regular, GraphicsUnit.Point, 134); - lblContent.Location = new Point(8, 99); + lblContent.Location = new Point(8, 87); lblContent.Name = "lblContent"; - lblContent.Size = new Size(1170, 295); + lblContent.Size = new Size(1085, 269); lblContent.TabIndex = 4; lblContent.MouseDoubleClick += LblContent_MouseDoubleClick; // @@ -290,13 +299,13 @@ private void InitializeComponent() { menuClippings.ImageScalingSize = new Size(28, 28); menuClippings.Items.AddRange(new ToolStripItem[] { ClippingMenuCopy, ClippingMenuDelete }); menuClippings.Name = "menuClippings"; - menuClippings.Size = new Size(226, 80); + menuClippings.Size = new Size(205, 72); // // ClippingMenuCopy // ClippingMenuCopy.Name = "ClippingMenuCopy"; ClippingMenuCopy.ShortcutKeyDisplayString = "&Copy"; - ClippingMenuCopy.Size = new Size(225, 38); + ClippingMenuCopy.Size = new Size(204, 34); ClippingMenuCopy.Text = "复制"; ClippingMenuCopy.Click += ClippingMenuCopy_Click; // @@ -304,7 +313,7 @@ private void InitializeComponent() { // ClippingMenuDelete.Name = "ClippingMenuDelete"; ClippingMenuDelete.ShortcutKeyDisplayString = "&Delete"; - ClippingMenuDelete.Size = new Size(225, 38); + ClippingMenuDelete.Size = new Size(204, 34); ClippingMenuDelete.Text = "删除"; ClippingMenuDelete.Click += ClippingMenuDelete_Click; // @@ -313,14 +322,14 @@ private void InitializeComponent() { menuBooks.ImageScalingSize = new Size(28, 28); menuBooks.Items.AddRange(new ToolStripItem[] { booksMenuDelete, toolStripMenuItem1 }); menuBooks.Name = "contextMenuStrip1"; - menuBooks.Size = new Size(269, 80); + menuBooks.Size = new Size(243, 72); // // booksMenuDelete // booksMenuDelete.DisplayStyle = ToolStripItemDisplayStyle.Text; booksMenuDelete.Name = "booksMenuDelete"; booksMenuDelete.ShortcutKeyDisplayString = "Delete"; - booksMenuDelete.Size = new Size(268, 38); + booksMenuDelete.Size = new Size(242, 34); booksMenuDelete.Text = "删除"; booksMenuDelete.Click += BooksMenuDelete_Click; // @@ -328,7 +337,7 @@ private void InitializeComponent() { // toolStripMenuItem1.Name = "toolStripMenuItem1"; toolStripMenuItem1.ShortcutKeyDisplayString = "Rename"; - toolStripMenuItem1.Size = new Size(268, 38); + toolStripMenuItem1.Size = new Size(242, 34); toolStripMenuItem1.Text = "重命名"; // // openFileDialog @@ -339,10 +348,9 @@ private void InitializeComponent() { // statusStrip1.ImageScalingSize = new Size(28, 28); statusStrip1.Items.AddRange(new ToolStripItem[] { lblCount }); - statusStrip1.Location = new Point(0, 1010); + statusStrip1.Location = new Point(0, 925); statusStrip1.Name = "statusStrip1"; - statusStrip1.Padding = new Padding(1, 0, 15, 0); - statusStrip1.Size = new Size(1620, 38); + statusStrip1.Size = new Size(1504, 22); statusStrip1.SizingGrip = false; statusStrip1.TabIndex = 3; statusStrip1.Text = "statusStrip1"; @@ -351,19 +359,19 @@ private void InitializeComponent() { // lblCount.DisplayStyle = ToolStripItemDisplayStyle.Text; lblCount.Name = "lblCount"; - lblCount.Size = new Size(0, 28); + lblCount.Size = new Size(0, 13); // // FrmMain // - AutoScaleDimensions = new SizeF(14F, 31F); + AutoScaleDimensions = new SizeF(13F, 28F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1620, 1048); + ClientSize = new Size(1504, 947); Controls.Add(statusStrip1); Controls.Add(splitContainer1); Controls.Add(menuStrip); Icon = (Icon)resources.GetObject("$this.Icon"); Name = "FrmMain"; - Text = " Kindle Mate 2"; + Text = "Kindle Mate 2"; Load += FrmMain_Load; menuStrip.ResumeLayout(false); menuStrip.PerformLayout(); @@ -413,7 +421,8 @@ private void InitializeComponent() { private ToolStripStatusLabel lblCount; private Label lblContent; private ToolStripMenuItem ClippingMenuCopy; - private ToolStripMenuItem toolStripMenuExit; + private ToolStripMenuItem menuExit; private ToolStripMenuItem toolStripMenuAbout; + private ToolStripMenuItem menuImportKindle; } } diff --git a/FrmMain.cs b/FrmMain.cs index e6a65ac..ba0abbd 100644 --- a/FrmMain.cs +++ b/FrmMain.cs @@ -1,5 +1,7 @@ using System.ComponentModel; using System.Data; +using System.Globalization; +using static System.Windows.Forms.DataFormats; namespace KindleMate2 { public partial class FrmMain : Form { @@ -7,87 +9,99 @@ public partial class FrmMain : Form { private readonly StaticData _staticData = new(); + private readonly string _programsDirectory; + + private readonly string _filePath; + public FrmMain() { InitializeComponent(); + + _programsDirectory = AppDomain.CurrentDomain.BaseDirectory; + _filePath = Path.Combine(_programsDirectory, "KM2.dat"); } private void FrmMain_Load(object? sender, EventArgs e) { - if (!FileHandler()) { - return; - } + if (FileHandler()) { + DisplayData(); - _dataTable = _staticData.GetClipingsDataTable(); + CountRows(); - CountRows(); + var bookNames = _dataTable.AsEnumerable().Select(row => row.Field("bookname")).Distinct(); - dataGridView.DataSource = _dataTable; + var rootNode = new TreeNode("全部") { + ImageIndex = 2, + SelectedImageIndex = 2 + }; - dataGridView.Columns["key"].Visible = false; - dataGridView.Columns["content"].HeaderText = "Content"; - dataGridView.Columns["bookname"].HeaderText = "Book"; - dataGridView.Columns["authorname"].HeaderText = "Author"; - dataGridView.Columns["brieftype"].Visible = false; - dataGridView.Columns["clippingtypelocation"].HeaderText = "Location"; - dataGridView.Columns["clippingdate"].HeaderText = "Date"; - dataGridView.Columns["read"].Visible = false; - dataGridView.Columns["clipping_importdate"].Visible = false; - dataGridView.Columns["tag"].Visible = false; - dataGridView.Columns["sync"].Visible = false; - dataGridView.Columns["newbookname"].Visible = false; - dataGridView.Columns["colorRGB"].Visible = false; - dataGridView.Columns["pagenumber"].HeaderText = "Page"; + treeView.Nodes.Add(rootNode); - foreach (DataGridViewColumn column in dataGridView.Columns) { - column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + foreach (var bookName in bookNames) { + rootNode.Nodes.Add(bookName); + } - dataGridView.Sort(dataGridView.Columns["clippingdate"], ListSortDirection.Descending); + treeView.ExpandAll(); + } + } - var bookNames = _dataTable.AsEnumerable().Select(row => row.Field("bookname")).Distinct(); + private void DisplayData() { + _dataTable = _staticData.GetClipingsDataTable(); - var rootNode = new TreeNode("全部") { - ImageIndex = 2, SelectedImageIndex = 2 - }; + dataGridView.DataSource = _dataTable; - treeView.Nodes.Add(rootNode); + dataGridView.Columns["key"]!.Visible = false; + dataGridView.Columns["content"]!.HeaderText = "Content"; + dataGridView.Columns["bookname"]!.HeaderText = "Book"; + dataGridView.Columns["authorname"]!.HeaderText = "Author"; + dataGridView.Columns["brieftype"]!.Visible = false; + dataGridView.Columns["clippingtypelocation"]!.HeaderText = "Location"; + dataGridView.Columns["clippingdate"]!.HeaderText = "Date"; + dataGridView.Columns["read"]!.Visible = false; + dataGridView.Columns["clipping_importdate"]!.Visible = false; + dataGridView.Columns["tag"]!.Visible = false; + dataGridView.Columns["sync"]!.Visible = false; + dataGridView.Columns["newbookname"]!.Visible = false; + dataGridView.Columns["colorRGB"]!.Visible = false; + dataGridView.Columns["pagenumber"]!.HeaderText = "Page"; - foreach (var bookName in bookNames) { - rootNode.Nodes.Add(bookName); + foreach (DataGridViewColumn column in dataGridView.Columns) { + column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } - treeView.ExpandAll(); + dataGridView.Sort(dataGridView.Columns["clippingdate"]!, ListSortDirection.Descending); } private void CountRows() { - lblCount.Text = "共 " + _staticData.GetClippingsCount() + " 条记录"; + var clippingsCount = _staticData.GetClippingsCount(); + var originClippingsCount = _staticData.GetOriginClippingsCount(); + var diff = Math.Abs(originClippingsCount - clippingsCount); + lblCount.Text = "共 " + clippingsCount + " 条记录,删除 " + diff + " 条"; } - private static bool FileHandler() { - var programsDirectory = AppDomain.CurrentDomain.BaseDirectory; - var filePath = Path.Combine(programsDirectory, "KM2.dat"); - - if (File.Exists(filePath)) { - return true; - } + private bool FileHandler() { + return File.Exists(_filePath) || ImportKMDatabase(); + } + private bool ImportKMDatabase() { var fileDialog = new OpenFileDialog { - InitialDirectory = programsDirectory, + InitialDirectory = _programsDirectory, Title = "Import Kindle Mate Data File (KM2.dat)", CheckFileExists = true, CheckPathExists = true, DefaultExt = "dat", - Filter = @"KM2 Data Files (*.dat)|*.dat", + Filter = @"Kindle Mate Data File (*.dat)|*.dat", FilterIndex = 2, RestoreDirectory = true, ReadOnlyChecked = true, ShowReadOnly = true }; - if (fileDialog.ShowDialog() != DialogResult.OK) return false; + if (fileDialog.ShowDialog() != DialogResult.OK) { + return false; + } var selectedFilePath = fileDialog.FileName; try { - File.Copy(selectedFilePath, filePath, true); + File.Copy(selectedFilePath, _filePath, true); } catch (Exception) { return false; } @@ -95,14 +109,101 @@ private static bool FileHandler() { return true; } - private void DataGridView_SelectionChanged(object sender, EventArgs e) { - if (dataGridView.CurrentRow == null) { + private void ImportKindleClippings() { + var fileDialog = new OpenFileDialog { + InitialDirectory = _programsDirectory, + Title = "Import Kindle Clippings File (My Clippings.txt)", + CheckFileExists = true, + CheckPathExists = true, + DefaultExt = "txt", + Filter = @"Kindle Clippings File (*.txt)|*.txt", + FilterIndex = 2, + RestoreDirectory = true, + ReadOnlyChecked = true, + ShowReadOnly = true + }; + + if (fileDialog.ShowDialog() != DialogResult.OK) { return; } - DataGridViewRow selectedRow = dataGridView.CurrentRow; + var originClippingsTable = new DataTable(); + originClippingsTable.Columns.Add("key", typeof(string)); + originClippingsTable.Columns.Add("line1", typeof(string)); + originClippingsTable.Columns.Add("line2", typeof(string)); + originClippingsTable.Columns.Add("line3", typeof(string)); + originClippingsTable.Columns.Add("line4", typeof(string)); + originClippingsTable.Columns.Add("line5", typeof(string)); + + var clippingsTable = new DataTable(); + clippingsTable.Columns.Add("key", typeof(string)); + clippingsTable.Columns.Add("content", typeof(string)); + clippingsTable.Columns.Add("bookname", typeof(string)); + clippingsTable.Columns.Add("authorname", typeof(string)); + clippingsTable.Columns.Add("brieftype", typeof(int)); + clippingsTable.Columns.Add("clippingtypelocation", typeof(string)); + clippingsTable.Columns.Add("clippingdate", typeof(string)); + clippingsTable.Columns.Add("read", typeof(int)); + clippingsTable.Columns.Add("clipping_importdate", typeof(string)); + clippingsTable.Columns.Add("tag", typeof(string)); + clippingsTable.Columns.Add("sync", typeof(int)); + clippingsTable.Columns.Add("newbookname", typeof(string)); + clippingsTable.Columns.Add("colorRGB", typeof(int)); + clippingsTable.Columns.Add("pagenumber", typeof(int)); + + List lines = [.. File.ReadAllLines(fileDialog.FileName)]; + + for (var i = 0; i <= lines.Count - 5; i += 5) { + var line1 = lines[i].Trim(); + var book = line1.Split(['(', '(']); + var bookname = book[0].Trim(); + var authorname = book[^1].Replace(")", "").Replace(")", "").Trim(); + + var line2 = lines[i + 1].Trim(); + var loctime = line2.Split('|'); + var location = loctime[0].Replace("-", "").Trim(); + var pagenumber = 0; + var dashIndex = location.IndexOf('-'); + if (dashIndex != -1 && dashIndex < location.Length - 1) { + _ = int.TryParse(location[(dashIndex + 1)..].Replace("的标注", ""), out pagenumber); + } + var time = ""; + var readOnlySpan = loctime[1].Replace("添加于", "").Trim(); + var dayOfWeekIndex = readOnlySpan.IndexOf("星期", StringComparison.Ordinal); + if (dayOfWeekIndex != -1) { + readOnlySpan = readOnlySpan.Remove(dayOfWeekIndex, 3); + } + if (DateTime.TryParseExact(readOnlySpan, "yyyy年M月d日 tth:m:s", CultureInfo.GetCultureInfo("zh-CN"), DateTimeStyles.None, out DateTime parsedDate)) { + time = parsedDate.ToString("yyyy-MM-dd HH:mm:ss"); + } + + var key = time + "|" + location; + + var line3 = lines[i + 2].Trim(); + + var line4 = lines[i + 3].Trim(); + + var line5 = lines[i + 4].Trim(); - if (selectedRow == null) { + originClippingsTable.Rows.Add(key, line1, line2, line3, line4, line5); + clippingsTable.Rows.Add(key, line3, bookname, authorname, 0, location, time, 0, null, null, 0, null, -1, pagenumber); + } + + var insertedCount = _staticData.InsertOriginClippingsDataTable(originClippingsTable); + + if (insertedCount <= 0) { + return; + } + + _staticData.InsertClippingsDataTable(clippingsTable); + } + + private void DataGridView_SelectionChanged(object sender, EventArgs e) { + DataGridViewRow selectedRow; + + if (dataGridView.CurrentRow is not null) { + selectedRow = dataGridView.CurrentRow; + } else { return; } @@ -122,13 +223,13 @@ private void TreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs if (e.Node.Text is "Select All" or "全部") { dataGridView.DataSource = _dataTable; dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; - dataGridView.Sort(dataGridView.Columns["clippingdate"], ListSortDirection.Descending); + dataGridView.Sort(dataGridView.Columns["clippingdate"]!, ListSortDirection.Descending); } else { var selectedBookName = e.Node.Text; DataTable filteredBooks = _dataTable.AsEnumerable().Where(row => row.Field("bookname") == selectedBookName).CopyToDataTable(); dataGridView.DataSource = filteredBooks; dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; - dataGridView.Sort(dataGridView.Columns["clippingtypelocation"], ListSortDirection.Ascending); + dataGridView.Sort(dataGridView.Columns["clippingtypelocation"]!, ListSortDirection.Ascending); } } @@ -229,7 +330,7 @@ private void BooksMenuDelete_Click(object sender, EventArgs e) { } } - private void ToolStripMenuExit_Click(object sender, EventArgs e) { + private void MenuExit_Click(object sender, EventArgs e) { Close(); } @@ -237,5 +338,9 @@ private void ToolStripMenuAbout_Click(object sender, EventArgs e) { using var dialog = new FrmAboutBox(); dialog.ShowDialog(); } + + private void MenuImportKindle_Click(object sender, EventArgs e) { + ImportKindleClippings(); + } } } \ No newline at end of file diff --git a/FrmMain.resx b/FrmMain.resx index f263212..8caca28 100644 --- a/FrmMain.resx +++ b/FrmMain.resx @@ -131,8 +131,8 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu - SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAASB8AAAJNU0Z0AUkBTAIBAQMB - AAFQAQEBUAEBARQBAAEUAQAD/wEAASEBAAj/AUIBTQE2BwABNgMAASgDAAFQAwABFAMAAQEBAAEgBgAB + SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAALB8AAAJNU0Z0AUkBTAIBAQMB + AAHIAQEByAEBARQBAAEUAQAD/wEAASEBAAj/AUIBTQE2BwABNgMAASgDAAFQAwABFAMAAQEBAAEgBgAB GRIAAxEBFgNKAYkCWAFaAb0DXQHMA10BzANdAcwDXQHMA10BzANdAcwDXQHMA10BzANdAcwDXQHMA10B zAJcAV8ByANYAbgDMQFMAw8BFGAAAzYBWQFCAUEBQgFyAUIBQQFCAXIDQgFyA0IBcwNCAXIDQgFyA0IB cgNCAXIDQgFyA0IBcgNCAXIDQgFyA0IBcgNCAXIDQgFyA0EBcQMYASFQAAM2AVkCXQFgAc4CUQFvAfcB @@ -155,117 +155,116 @@ zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wM+AWpQAAJLAUwBjwJaAWMB 6QEeAQQBoAH/ASwBEwG2Af8BQQEqAdcB/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQB LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3AH/AUIBLAHaAf8BUwE+AcYB - /wGAAUcBuQH9A1cBsQMkATQDVQGvAmcBWQHvAaQBgQFSAf8BpQGEAVcB/wGlAYQBVwH/AaUBhAFXAf8B + /wGAAUABuQH9A1cBsQMkATQDVQGvAmcBWQHvAaQBgQFSAf8BpQGEAVcB/wGlAYQBVwH/AaUBhAFXAf8B pQGEAVcB/wGlAYQBVwH/AZMBdwFRAf8BeQFkAUcB/wF5AWQBRwH/AZwBfgFUAf8BpQGEAVcB/wGlAYQB VwH/AaUBhAFXAf8BpQGEAVcB/wGlAYQBVwH/AaQBgAFQAf8CYwFdAd8DSwGMBAADYgHhAYgBNwFVAf8B jwE8AVsB/wHMAWYBkgH/AcoBqAGqAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYB zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B 3QHWAcwB/wNBAXBQAAJLAUwBjwJaAWMB6QEeAQQBoAH/ASwBEwG2Af8BQQEqAdcB/wFEAS4B3QH/AUQB LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B - /wFEAS4B3AH/AUIBLAHaAf8BUwE+AcYB/wGBAXEBvQH/A18BywM8AWQBagFnAV4B7QFvAl8B+wG/AbEB - nAH/AccBugGnAf8BwwG2AaIB/wG4AaoBlQH/AbMBpAGOAf8BsgGiAYwB/wGwAaEBjAH/AawBoAGNAf8B - qwGeAYwB/wGwAaIBjAH/AbIBogGMAf8BtAGlAY4B/wG5AaoBlQH/AcABsgGeAf8BwQGzAZ8B/wG4AakB - kwH/AnwBXAH4AlwBWQG+BAABXwJbAdMBiAE3AVUB/wGMATkBWAH/AcwBZgGSAf8BwwGaAZ4B/wHdAdYB - ywH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B - 3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Az0BaFAAAksBTAGPAloBYwHpAR4B - BAGgAf8BLAETAbYB/wFBASoB1wH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B - /wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHcAf8BQgEsAdoB/wFTAT4BxgH/AYEB - cQG/Af8DYQHRA0EBcQKAAVoB/gG2AaQBiwH/AdMBywG/Af8B4QHbAdIB/wHfAdkBzwH/AdoB0wHJAf8B - 0gHKAb4B/wHOAcUBuQH/AdAByAG8Af8B1AHNAcIB/wHNAcQBtwH/AccBvgGwAf8BxwG+AbAB/wHLAcMB - tQH/AdAByAG8Af8B1AHMAcEB/wHVAc0BwQH/AcUBvAGtAf8BrgGVAXMB/wJfAVwBywQAA1MBpwGIATcB - VQH/AYgBNwFVAf8BxAFgAYoB/wHCAYYBlgH/AbkBrgGdAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8B - uQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8B - nwH/AbkBrwGfAf8DMQFNUAACSwFMAY8CWgFjAekBHgEEAaAB/wEsARMBtgH/AUEBKgHXAf8BRAEuAd0B - /wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQB - LgHdAf8BRAEuAdwB/wFCASwB2gH/AVMBPgHGAf8BgQFxAb8B/wNeAdIDQgFyAZwBbgEvAf8BugGpAZAB - /wHbAdUBygH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/AegB4gHaAf8B5AHeAdYB/wHmAeAB2AH/AegB - 4gHbAf8B3AHUAcoB/wHXAc8BxAH/AdcB0AHFAf8B2gHTAcgB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB - /wHKAcIBtAH/AbABmAF1Af8DXQHMBAADLgFIAYgBNwFVAf8BiAE3AVUB/wGqAU8BdAH/AcsBaAGSAf8B - xwF2AZQB/wHHAXYBlAH/AccBdgGUAf8BxwF2AZQB/wHHAXYBlAH/AccBdgGUAf8BxwF2AZQB/wHHAXYB - lAH/AccBdgGUAf8BxwF2AZQB/wHHAXYBlAH/AccBdgGUAf8BxwF1AZQB/wMxAU1QAAJLAUwBjwJaAWMB - 6QEeAQQBoAH/ASwBEwG2Af8BQQEqAdcB/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQB - LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3AH/AUIBLAHaAf8BUwE+AcYB - /wGBAXEBvwH/A14B0gNCAXIBnAFuAS8B/wG6AakBkQH/AdsB1QHLAf8B7QHoAeEB/wHtAegB4QH/Ae0B - 6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B6gHkAd0B/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB - /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/AcoBwgG0Af8BsAGYAXUB/wNdAcwIAANNAZIB - KwFyAX4B/AFAAUwBvgH9AUABgQG+Af0BQAGCAb4B/QFAAYsBvgH9AoABjAH+AUABlQG+Af0BQAGVAb4B - /QFAAZUBvgH9AUABlQG+Af0BQAGVAb4B/QFAAZUBvgH9AUABlQG+Af0BQAGVAb4B/QFAAZUBvgH9AUAB - lQG+Af0BVQJWAa5QAAJLAUwBjwJaAWMB6QEeAQQBoAH/ASwBEwG2Af8BQQEqAdcB/wFEAS4B3QH/AUQB - LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B - /wFEAS4B3AH/AUIBLAHaAf8BUwE+AcYB/wGBAXEBvwH/A14B0gNCAXIBnAFuAS8B/wG6AakBkQH/AdsB - 1QHLAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B6gHkAd0B - /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/AcoB - wgG0Af8BsAGYAXUB/wNdAcwEAAMTARoBSgJ9AfoBDAGQAfQB/wEMAZAB9AH/AQwBkAH0Af8BEAGTAfUB - /wEyAasC/wFrAboB7gH/AZEBwwHjAf8BkQHDAeMB/wGRAcMB4wH/AZEBwwHjAf8BkQHDAeMB/wGRAcMB - 4wH/AZEBwwHjAf8BkQHDAeMB/wGRAcMB4wH/AZEBwwHjAf8DXgHSUAACSwFMAY8CWgFjAekBHgEEAaAB - /wEsARMBtgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQB - LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAdwB/wFCASwB2gH/AVMBPgHGAf8BgQFxAb8B - /wNeAdIDQgFyAZwBbgEvAf8BugGpAZEB/wHbAdUBywH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B - 6AHhAf8B7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB - /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/AbABmAF1Af8DXQHMBAADMgFPAQwBkAH0Af8B - DAGQAfQB/wEMAZAB9AH/AQwBkAH0Af8BGAGZAfcB/wEzAawC/wHIAcwByQH/Ad0B1gHMAf8B3QHWAcwB + /wFEAS4B3AH/AUIBLAHaAf8BUwE+AcYB/wGBAXEBvQH/A18BywM8AWQBagFnAV4B7QNfAfsBvwGxAZwB + /wHHAboBpwH/AcMBtgGiAf8BuAGqAZUB/wGzAaQBjgH/AbIBogGMAf8BsAGhAYwB/wGsAaABjQH/AasB + ngGMAf8BsAGiAYwB/wGyAaIBjAH/AbQBpQGOAf8BuQGqAZUB/wHAAbIBngH/AcEBswGfAf8BuAGpAZMB + /wJ8AVwB+AJcAVkBvgQAAV8CWwHTAYgBNwFVAf8BjAE5AVgB/wHMAWYBkgH/AcMBmgGeAf8B3QHWAcsB /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B - 1gHMAf8BeQF3AXMB+VAAAksBTAGPAloBYwHpAR4BBAGgAf8BLAETAbYB/wFBASoB1wH/AUQBLgHdAf8B + 1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wM9AWhQAAJLAUwBjwJaAWMB6QEeAQQB + oAH/ASwBEwG2Af8BQQEqAdcB/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8B + RAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3AH/AUIBLAHaAf8BUwE+AcYB/wGBAXEB + vwH/A2EB0QNBAXECgAFpAf4BtgGkAYsB/wHTAcsBvwH/AeEB2wHSAf8B3wHZAc8B/wHaAdMByQH/AdIB + ygG+Af8BzgHFAbkB/wHQAcgBvAH/AdQBzQHCAf8BzQHEAbcB/wHHAb4BsAH/AccBvgGwAf8BywHDAbUB + /wHQAcgBvAH/AdQBzAHBAf8B1QHNAcEB/wHFAbwBrQH/Aa4BlQFzAf8CXwFcAcsEAANTAacBiAE3AVUB + /wGIATcBVQH/AcQBYAGKAf8BwgGGAZYB/wG5Aa4BnQH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkB + rwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B + /wG5Aa8BnwH/AzEBTVAAAksBTAGPAloBYwHpAR4BBAGgAf8BLAETAbYB/wFBASoB1wH/AUQBLgHdAf8B RAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B - 3QH/AUQBLgHcAf8BQgEsAdoB/wFTAT4BxgH/AYEBcQG/Af8DXgHSA0IBcgGcAW4BLwH/AboBqQGRAf8B - 2wHVAcsB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHqAeQB - 3QH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B - ygHCAbQB/wGwAZgBdQH/A10BzAQAAy0BRAEMAZAB9AH/AQwBkAH0Af8BDAGQAfQB/wEMAZAB9AH/ARYB - mAH3Af8BMwGsAv8BoQGsAa0B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8B - uQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/A2cB71AAAksBTAGPAloBYwHpAR4B - BAGgAf8BLAETAbYB/wFBASoB1wH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B - /wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHcAf8BQgEsAdoB/wFTAT4BxgH/AYEB - cQG/Af8DXgHSA0IBcgGcAW4BLwH/AboBqQGRAf8B2wHVAcsB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB - /wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHqAeQB3QH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B - 1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8BygHCAbQB/wGwAZgBdQH/A10BzAQAAwcBCQNiAeEB - DAGQAfQB/wEMAZAB9AH/AQwBkAH0Af8BDQGRAfQB/wEuAakB/gH/AUABrAH1Af8BUQGsAegB/wFRAawB - 6AH/AVEBrAHoAf8BUQGsAegB/wFRAawB6AH/AVEBrAHoAf8BUQGsAegB/wFRAawB6AH/AVEBrAHoAf8B - UQGsAegB/wFbAmEB3lAAAksBTAGPAloBYwHpAR4BBAGgAf8BLAETAbYB/wFBASoB1wH/AUQBLgHdAf8B + 3QH/AUQBLgHcAf8BQgEsAdoB/wFTAT4BxgH/AYEBcQG/Af8DXgHSA0IBcgGcAW4BLwH/AboBqQGQAf8B + 2wHVAcoB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHoAeIB2gH/AeQB3gHWAf8B5gHgAdgB/wHoAeIB + 2wH/AdwB1AHKAf8B1wHPAcQB/wHXAdABxQH/AdoB0wHIAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B + ygHCAbQB/wGwAZgBdQH/A10BzAQAAy4BSAGIATcBVQH/AYgBNwFVAf8BqgFPAXQB/wHLAWgBkgH/AccB + dgGUAf8BxwF2AZQB/wHHAXYBlAH/AccBdgGUAf8BxwF2AZQB/wHHAXYBlAH/AccBdgGUAf8BxwF2AZQB + /wHHAXYBlAH/AccBdgGUAf8BxwF2AZQB/wHHAXYBlAH/AccBdQGUAf8DMQFNUAACSwFMAY8CWgFjAekB + HgEEAaAB/wEsARMBtgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B + 3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAdwB/wFCASwB2gH/AVMBPgHGAf8B + gQFxAb8B/wNeAdIDQgFyAZwBbgEvAf8BugGpAZEB/wHbAdUBywH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB + 4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B + 3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/AbABmAF1Af8DXQHMCAADTQGSASsB + cgF+AfwCQAG+Af0BQAGBAb4B/QFAAYIBvgH9AUABiwG+Af0DgAH+AUABlQG+Af0BQAGVAb4B/QFAAZUB + vgH9AUABlQG+Af0BQAGVAb4B/QFAAZUBvgH9AUABlQG+Af0BQAGVAb4B/QFAAZUBvgH9AUABlQG+Af0B + VQJWAa5QAAJLAUwBjwJaAWMB6QEeAQQBoAH/ASwBEwG2Af8BQQEqAdcB/wFEAS4B3QH/AUQBLgHdAf8B RAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B - 3QH/AUMBLQHcAf8BQQErAdkB/wFTAT8BxgH/AYEBcQG/Af8DXgHSA0IBcgJfATIB+wOAAf4B2wHVAcsB - /wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHqAeQB3QH/Ad0B - 1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8BygHCAbQB - /wOAAf4CXwFdAckEAAM4AVsCWgFXAcIDfgH8A4AB/gKiAYoB/QKiAYoB/QKlAYsB/QGtAawBjwH9Aa8B - rAGOAf0BrwGsAY4B/QGvAawBjgH9Aa8BrAGOAf0BrwGsAY4B/QGvAawBjgH9Aa8BrAGOAf0BrwGsAY4B - /QNdAccDNQFVAy0BRVAAAksBTAGPAloBYwHpAR4BBAGgAf8BLAETAbYB/wFBASoB1wH/AUQBLgHdAf8B - RAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B - 3QH/AUMBLQHbAf8BPwEoAdUB/wFUAT8BxQH/AYIBcgG/Af8DXgHSA0IBcgJqAV4B7QF1AW8BXwH7AdsB - 1QHLAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B6gHkAd0B - /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/AcoB - wgG0Af8DfAH4AlwBWQG+AxcBHwFjAV8BIgH7Ab4BhQE4Af8B7gGtAVgB/wHlAcIBkwH/AeUBwwGXAf8B + 3AH/AUIBLAHaAf8BUwE+AcYB/wGBAXEBvwH/A14B0gNCAXIBnAFuAS8B/wG6AakBkQH/AdsB1QHLAf8B + 7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B6gHkAd0B/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/AcoBwgG0Af8B + sAGYAXUB/wNdAcwEAAMTARoBTQJ9AfoBDAGQAfQB/wEMAZAB9AH/AQwBkAH0Af8BEAGTAfUB/wEyAasC + /wFrAboB7gH/AZEBwwHjAf8BkQHDAeMB/wGRAcMB4wH/AZEBwwHjAf8BkQHDAeMB/wGRAcMB4wH/AZEB + wwHjAf8BkQHDAeMB/wGRAcMB4wH/AZEBwwHjAf8DXgHSUAACSwFMAY8CWgFjAekBHgEEAaAB/wEsARMB + tgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8B + RAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAdwB/wFCASwB2gH/AVMBPgHGAf8BgQFxAb8B/wNeAdID + QgFyAZwBbgEvAf8BugGpAZEB/wHbAdUBywH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B + 7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/AbABmAF1Af8DXQHMBAADMgFPAQwBkAH0Af8BDAGQAfQB + /wEMAZAB9AH/AQwBkAH0Af8BGAGZAfcB/wEzAawC/wHIAcwByQH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8D + agH5UAACSwFMAY8CWgFjAekBHgEEAaAB/wEsARMBtgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQB + LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAdwB + /wFCASwB2gH/AVMBPgHGAf8BgQFxAb8B/wNeAdIDQgFyAZwBbgEvAf8BugGpAZEB/wHbAdUBywH/Ae0B + 6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB + /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/AbAB + mAF1Af8DXQHMBAADLQFEAQwBkAH0Af8BDAGQAfQB/wEMAZAB9AH/AQwBkAH0Af8BFgGYAfcB/wEzAawC + /wGhAawBrQH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkB + rwGfAf8BuQGvAZ8B/wG5Aa8BnwH/AbkBrwGfAf8DZwHvUAACSwFMAY8CWgFjAekBHgEEAaAB/wEsARMB + tgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8B + RAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAdwB/wFCASwB2gH/AVMBPgHGAf8BgQFxAb8B/wNeAdID + QgFyAZwBbgEvAf8BugGpAZEB/wHbAdUBywH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B + 7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/AbABmAF1Af8DXQHMBAADBwEJA2IB4QEMAZAB9AH/AQwB + kAH0Af8BDAGQAfQB/wENAZEB9AH/AS4BqQH+Af8BQAGsAfUB/wFRAawB6AH/AVEBrAHoAf8BUQGsAegB + /wFRAawB6AH/AVEBrAHoAf8BUQGsAegB/wFRAawB6AH/AVEBrAHoAf8BUQGsAegB/wFRAawB6AH/AVsC + YQHeUAACSwFMAY8CWgFjAekBHgEEAaAB/wEsARMBtgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQB + LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BQwEtAdwB + /wFBASsB2QH/AVMBPwHGAf8BgQFxAb8B/wNeAdIDQgFyAl8BMgH7A4AB/gHbAdUBywH/Ae0B6AHhAf8B + 7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/A4AB/gJfAV0B + yQQAAzgBWwJaAVcBwgN+AfwDgAH+AqIBigH9AqIBigH9AqUBiwH9Aa0BrAGPAf0BrwGsAY4B/QGvAawB + jgH9Aa8BrAGOAf0BrwGsAY4B/QGvAawBjgH9Aa8BrAGOAf0BrwGsAY4B/QGvAawBjgH9A10BxwM1AVUD + LQFFUAACSwFMAY8CWgFjAekBHgEEAaAB/wEsARMBtgH/AUEBKgHXAf8BRAEuAd0B/wFEAS4B3QH/AUQB + LgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BRAEuAd0B/wFEAS4B3QH/AUQBLgHdAf8BQwEtAdsB + /wE/ASgB1QH/AVQBPwHFAf8BggFyAb8B/wNeAdIDQgFyAmoBXgHtA18B+wHbAdUBywH/Ae0B6AHhAf8B + 7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/AeoB5AHdAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHKAcIBtAH/A3wB+AJcAVkB + vgMXAR8CXwEiAfsBvgGFATgB/wHuAa0BWAH/AeUBwgGTAf8B5QHDAZcB/wHlAcMBlwH/AeUBwwGXAf8B 5QHDAZcB/wHlAcMBlwH/AeUBwwGXAf8B5QHDAZcB/wHlAcMBlwH/AeUBwwGXAf8B5QHDAZcB/wHlAcMB - lwH/AeUBwwGXAf8B5QHDAZcB/wGVAoAB/gNOAZVYAAJLAUwBjwJaAWMB6QEeAQQBoAH/ASkBEAGxAf8B - OQEiAcsB/wE7ASQBzwH/ATsBJAHPAf8BOwEkAc8B/wE7ASQBzwH/ATsBJAHPAf8BOwEkAc8B/wE7ASQB - zwH/ATsBJAHPAf8BOwEkAc8B/wE6ASMBzQH/ATUBHgHEAf8BdgFlAckB/wGUAYYBwgH/A14B0gNCAXIC - QgFBAXMDZQHiAdkB0gHIAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B - 6AHhAf8B6gHkAd0B/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB - /wHdAdYBzAH/AccBvgGwAf8DXQHHAzgBXAM5AV8BmQFmASIB/wHVAZcBRgH/AekBuAF4Af8B3QHWAcwB - /wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B - 1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wNYAbhYAANMAY4CYAFpAegBSAEzAa0B - /wFvAV0BwAH/AX8BbgHPAf8BfwFvAdEB/wF/AW8B0QH/AX8BbwHRAf8BfwFvAdEB/wF/AW8B0QH/AX8B - bwHRAf8BfwFvAdEB/wF/AW8B0QH/AX8BbwHRAf8BgQFxAdEB/wGIAXkBzwH/AbgBrgHSAf8BqwGfAcYB - /wNeAdIDQQFxAxkBIgNDAXUDTQGTA1IBoANXAbEDYwHVA24B9QGXAZIBiwH+A2gB8ANhAdkDYQHZA28B - 9wGGAoAB/gNqAe0DXQHMA1QBqQNRAZ0DTAGQAzoBYAMUARsDQAFvAZkBZgEiAf8B2gGcAUkB/wHgAbQB - egH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B - 3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8DXQHFWAABQQFAAUEB - cQJeAWUB4gFrAVgBtQH/AawBoAHKAf8BwgG5AdMB/wHCAbkB0wH/AcIBuQHTAf8BwgG5AdMB/wHCAbkB - 0wH/AcIBuQHTAf8BwgG5AdMB/wHCAbkB0wH/AcIBuQHTAf8BwgG5AdMB/wHFAbwB1AH/Ac0BxgHVAf8B - 2wLTAf8BoQGUAcAB/wNdAcoDOwFiBAADFgEdAyABLQMnAToDMQFMA0ABbwNOAZYDVAGoA04BlgNCAXQD - QgF0A1IBoQNTAaUDSwGMAzwBZgMsAUMDJQE3Ax4BKgMRARYEAAM1AVUBmQFmASIB/wHSAZUBRAH/AeAB - rAFmAf8BvAGyAaIB/wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB/wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB - /wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB/wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB/wNXAbJYAAMnAToC - VwFZAbwBbAFhAWwB6wJqAWsB+QG9AbMBxgH/Ab4BtAHIAf8BvgG0AcgB/wG+AbQByAH/Ab4BtAHIAf8B - vgG0AcgB/wG+AbQByAH/Ab4BtAHIAf8BvgG0AcgB/wG+AbQByAH/Ab4BtAHIAf8BvQG0AccB/wG0AakB - vgH9AWsBZgFrAfICVAFWAasDKQE+GAADCwEOAxcBHwMTARkDAgEDAwIBAwMYASADEwEaAwkBCxgAAwwB - EAFnAWUBWQHvAbUBfQEzAf8B7gGsAVUB/wHdAawBagH/AdsBrAFtAf8B2wGsAW0B/wHbAawBbQH/AdsB - rAFtAf8B2wGsAW0B/wHbAawBbQH/AdsBrAFtAf8B2wGsAW0B/wHbAawBbQH/AdsBrAFtAf8B2wGsAW0B - /wGLAoAB/gNRAZ5cAAMtAUQCUAFRAZ8CXgFlAeICQAGdAf0BMgEaAaUB/wEzARsBpQH/ATMBGwGlAf8B - MwEbAaUB/wEzARsBpQH/ATMBGwGlAf8BMwEbAaUB/wEzARsBpQH/ATMBGwGlAf8BMwEbAaUB/wEzARsB - pQH/AlEBbwH3AlcBWQG8AzgBWwQCVAADIQEvAkEBQAFxA0IBcgNCAXMDQgFyA0IBcgNCAXIDQgFyA0IB - cgNCAXIDQgFyA0IBcgNCAXIDQgFyA0IBcgNCAXIDLgFHWAABQgFNAT4HAAE+AwABKAMAAVADAAEUAwAB - AQEAAQEFAAHwFwAD/wMAAT8C/wHACAABHwL/AYAIAAEQAgABgAsAAYALAAGACwABgAsAAYALAAGACwAB - wAsAAYALAAGACwABgAsAAYALAAGADQABMAsAATALAAEwBgABCAEAAQECAAEwBgABDwHAAT8CAAEwBAAB - gAEAAQ8C/wGAAQABMAQACw== + lwH/A4AB/gNOAZVYAAJLAUwBjwJaAWMB6QEeAQQBoAH/ASkBEAGxAf8BOQEiAcsB/wE7ASQBzwH/ATsB + JAHPAf8BOwEkAc8B/wE7ASQBzwH/ATsBJAHPAf8BOwEkAc8B/wE7ASQBzwH/ATsBJAHPAf8BOwEkAc8B + /wE6ASMBzQH/ATUBHgHEAf8BdgFlAckB/wGUAYYBwgH/A14B0gNCAXICQgFBAXMDZQHiAdkB0gHIAf8B + 7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B7QHoAeEB/wHtAegB4QH/Ae0B6AHhAf8B6gHkAd0B/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/AccBvgGwAf8D + XQHHAzgBXAM5AV8BmQFmASIB/wHVAZcBRgH/AekBuAF4Af8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B + 3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wNYAbhYAANMAY4CYAFpAegBSAEzAa0B/wFvAV0BwAH/AX8BbgHPAf8B + fwFvAdEB/wF/AW8B0QH/AX8BbwHRAf8BfwFvAdEB/wF/AW8B0QH/AX8BbwHRAf8BfwFvAdEB/wF/AW8B + 0QH/AX8BbwHRAf8BgQFxAdEB/wGIAXkBzwH/AbgBrgHSAf8BqwGfAcYB/wNeAdIDQQFxAxkBIgNDAXUD + TQGTA1IBoANXAbEDYwHVA24B9QOAAf4DaAHwA2EB2QNhAdkDbwH3A4AB/gNqAe0DXQHMA1QBqQNRAZ0D + TAGQAzoBYAMUARsDQAFvAZkBZgEiAf8B2gGcAUkB/wHgAbQBegH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYB + zAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8B + 3QHWAcwB/wHdAdYBzAH/Ad0B1gHMAf8DXQHFWAABQQFAAUEBcQJeAWUB4gFrAVgBtQH/AawBoAHKAf8B + wgG5AdMB/wHCAbkB0wH/AcIBuQHTAf8BwgG5AdMB/wHCAbkB0wH/AcIBuQHTAf8BwgG5AdMB/wHCAbkB + 0wH/AcIBuQHTAf8BwgG5AdMB/wHFAbwB1AH/Ac0BxgHVAf8B2wLTAf8BoQGUAcAB/wNdAcoDOwFiBAAD + FgEdAyABLQMnAToDMQFMA0ABbwNOAZYDVAGoA04BlgNCAXQDQgF0A1IBoQNTAaUDSwGMAzwBZgMsAUMD + JQE3Ax4BKgMRARYEAAM1AVUBmQFmASIB/wHSAZUBRAH/AeABrAFmAf8BvAGyAaIB/wG+AbQBpAH/Ab4B + tAGkAf8BvgG0AaQB/wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB/wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB + /wG+AbQBpAH/Ab4BtAGkAf8BvgG0AaQB/wNXAbJYAAMnAToCVwFZAbwBbAFhAWwB6wNqAfkBvQGzAcYB + /wG+AbQByAH/Ab4BtAHIAf8BvgG0AcgB/wG+AbQByAH/Ab4BtAHIAf8BvgG0AcgB/wG+AbQByAH/Ab4B + tAHIAf8BvgG0AcgB/wG+AbQByAH/Ab0BtAHHAf8BtAGpAb4B/QFrAWYBawHyAlQBVgGrAykBPhgAAwsB + DgMXAR8DEwEZAwIBAwMCAQMDGAEgAxMBGgMJAQsYAAMMARABZwFlAVkB7wG1AX0BMwH/Ae4BrAFVAf8B + 3QGsAWoB/wHbAawBbQH/AdsBrAFtAf8B2wGsAW0B/wHbAawBbQH/AdsBrAFtAf8B2wGsAW0B/wHbAawB + bQH/AdsBrAFtAf8B2wGsAW0B/wHbAawBbQH/AdsBrAFtAf8DgAH+A1EBnlwAAy0BRAJQAVEBnwJeAWUB + 4gJAAZ0B/QEyARoBpQH/ATMBGwGlAf8BMwEbAaUB/wEzARsBpQH/ATMBGwGlAf8BMwEbAaUB/wEzARsB + pQH/ATMBGwGlAf8BMwEbAaUB/wEzARsBpQH/ATMBGwGlAf8CUQFvAfcCVwFZAbwDOAFbBAJUAAMhAS8C + QQFAAXEDQgFyA0IBcwNCAXIDQgFyA0IBcgNCAXIDQgFyA0IBcgNCAXIDQgFyA0IBcgNCAXIDQgFyA0IB + cgMuAUdYAAFCAU0BPgcAAT4DAAEoAwABUAMAARQDAAEBAQABAQUAAfAXAAP/AwABPwL/AcAIAAEfAv8B + gAgAARACAAGACwABgAsAAYALAAGACwABgAsAAYALAAHACwABgAsAAYALAAGACwABgAsAAYANAAEwCwAB + MAsAATAGAAEIAQABAQIAATAGAAEPAcABPwIAATAEAAGAAQABDwL/AYABAAEwBAAL diff --git a/KindleMate2.csproj b/KindleMate2.csproj index 79b5c06..f0d6900 100644 --- a/KindleMate2.csproj +++ b/KindleMate2.csproj @@ -12,20 +12,36 @@ https://github.com/lzcapp/KindleMate2.git git https://github.com/lzcapp/KindleMate2 + none + README.md + LICENSE + Kindle Mate 2 + RainySummer + Copyright (c) RainySummer 2024 + + + + True + embedded + + + + True + embedded - - - + + + - + - + @@ -52,4 +68,15 @@ + + + True + \ + + + True + \ + + + \ No newline at end of file diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 5c17934..a5577c3 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,5 +89,15 @@ internal static System.Drawing.Bitmap information { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap plus { + get { + object obj = ResourceManager.GetObject("plus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 3e1fbd1..f423f9b 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -118,6 +118,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\cross-mark-button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\information.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -125,7 +128,7 @@ ..\Resources\bookmark.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\cross-mark-button.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\plus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Resources/plus.png b/Resources/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a49720bfcb429e89b0b21339674e9eabdba1ee GIT binary patch literal 6486 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 literal 0 HcmV?d00001 diff --git a/StaticData.cs b/StaticData.cs index 03188a9..4883807 100644 --- a/StaticData.cs +++ b/StaticData.cs @@ -47,6 +47,66 @@ public DataTable GetClipingsDataTable() { return dataTable; } + public int GetOriginClippingsCount() { + _connection.Open(); + + const string queryCount = "SELECT COUNT(*) FROM original_clipping_lines"; + using var commandCount = new SQLiteCommand(queryCount, _connection); + var count = Convert.ToInt32(commandCount.ExecuteScalar()); + + _connection.Close(); + + return count; + } + + public DataTable GetOriginClippingsDataTable() { + var dataTable = new DataTable(); + + _connection.Open(); + + const string queryClippings = "SELECT * FROM original_clipping_lines;"; + using var command = new SQLiteCommand(queryClippings, _connection); + using var adapter = new SQLiteDataAdapter(command); + adapter.Fill(dataTable); + + _connection.Close(); + + return dataTable; + } + + public int InsertOriginClippingsDataTable(DataTable dataTable) { + if (dataTable.Rows.Count == 0) { + return 0; + } + + var result = 0; + + _connection.Open(); + + const string queryInsert = "INSERT INTO original_clipping_lines (key, line1, line2, line3, line4, line5) VALUES (@key, @line1, @line2, @line3, @line4, @line5)"; + using var command = new SQLiteCommand(queryInsert, _connection); + command.Parameters.Add("@key", DbType.String); + command.Parameters.Add("@line1", DbType.String); + command.Parameters.Add("@line2", DbType.String); + command.Parameters.Add("@line3", DbType.String); + command.Parameters.Add("@line4", DbType.String); + command.Parameters.Add("@line5", DbType.String); + + foreach (DataRow row in dataTable.Rows) { + command.Parameters["@key"].Value = row["key"]; + command.Parameters["@line1"].Value = row["line1"]; + command.Parameters["@line2"].Value = row["line2"]; + command.Parameters["@line3"].Value = row["line3"]; + command.Parameters["@line4"].Value = row["line4"]; + command.Parameters["@line5"].Value = row["line5"]; + result += command.ExecuteNonQuery(); + } + + _connection.Close(); + + return result; + } + public bool DeleteClippingsByKey(string key) { if (key == string.Empty) { return false; @@ -80,5 +140,54 @@ public bool DeleteClippingsByBook(string bookname) { return result > 0; } + + public bool InsertClippingsDataTable(DataTable clippingsTable) { + if (clippingsTable.Rows.Count == 0) { + return false; + } + + var result = 0; + + _connection.Open(); + + const string queryInsert = "INSERT INTO clippings (key, content, bookname, authorname, brieftype, clippingtypelocation, clippingdate, read, clipping_importdate, tag, sync, newbookname, colorRGB, pagenumber) VALUES (@key, @content, @bookname, @authorname, @brieftype, @clippingtypelocation, @clippingdate, @read, @clipping_importdate, @tag, @sync, @newbookname, @colorRGB, @pagenumber)"; + using var command = new SQLiteCommand(queryInsert, _connection); + command.Parameters.Add("@key", DbType.String); + command.Parameters.Add("@content", DbType.String); + command.Parameters.Add("@bookname", DbType.String); + command.Parameters.Add("@authorname", DbType.String); + command.Parameters.Add("@brieftype", DbType.Int16); + command.Parameters.Add("@clippingtypelocation", DbType.String); + command.Parameters.Add("@clippingdate", DbType.String); + command.Parameters.Add("@read", DbType.String); + command.Parameters.Add("@clipping_importdate", DbType.String); + command.Parameters.Add("@tag", DbType.String); + command.Parameters.Add("@sync", DbType.Int16); + command.Parameters.Add("@newbookname", DbType.String); + command.Parameters.Add("@colorRGB", DbType.Int16); + command.Parameters.Add("@pagenumber", DbType.Int16); + + foreach (DataRow row in clippingsTable.Rows) { + command.Parameters["@key"].Value = row["key"]; + command.Parameters["@content"].Value = row["content"]; + command.Parameters["@bookname"].Value = row["bookname"]; + command.Parameters["@authorname"].Value = row["authorname"]; + command.Parameters["@brieftype"].Value = row["brieftype"]; + command.Parameters["@clippingtypelocation"].Value = row["clippingtypelocation"]; + command.Parameters["@clippingdate"].Value = row["clippingdate"]; + command.Parameters["@read"].Value = row["read"]; + command.Parameters["@clipping_importdate"].Value = row["clipping_importdate"]; + command.Parameters["@tag"].Value = row["tag"]; + command.Parameters["@sync"].Value = row["sync"]; + command.Parameters["@newbookname"].Value = row["newbookname"]; + command.Parameters["@colorRGB"].Value = row["colorRGB"]; + command.Parameters["@pagenumber"].Value = row["pagenumber"]; + result += command.ExecuteNonQuery(); + } + + _connection.Close(); + + return result > 0; + } } } \ No newline at end of file