feat: rebrand to MMD PDF, single corporate theme, and remove original text under an edit

- Services/PdfRedactText.cs: strip text whose origin falls inside a CoverAnnotation
  from the page content stream at save time, hooked into PdfBurn.DrawAnnotationsIntoDoc.
  Fixes edited values staying recoverable by text extraction.
- Themes/MMD.xaml replaces all thirteen themes; picker and accent strip removed; no dark mode.
- Rename KillerPDF -> MMD PDF across code, resources, packaging and locale strings; new icon.
- Remove the upstream author credit and the in-app install button.
This commit is contained in:
2026-08-27 07:37:09 +02:00
parent 532485a830
commit 6610acfa44
230 changed files with 9362 additions and 11508 deletions
+14 -14
View File
@@ -4,7 +4,7 @@ using System.IO;
using System.Text;
using System.Windows;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// Everything the About card does that is not drawing: reading the signature and release date,
@@ -21,9 +21,9 @@ namespace KillerPDF.Features
// Steve's: a fork signed by somebody else must not claim the alias, and an unsigned build
// has no subject at all. Family standard, see code/CLAUDE.md.
private const string SignerName = "Stephen Riley";
private const string AkaName = "Steve the Killer";
private const string AkaName = "MMD Steel Group IT";
private const string Repo = "https://github.com/SteveTheKiller/KillerPDF";
private const string Repo = "https://github.com/SteveTheKiller/MmdPdf";
private readonly IAboutHost _host;
@@ -109,7 +109,7 @@ namespace KillerPDF.Features
{
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
using var http = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(4) };
http.DefaultRequestHeaders.UserAgent.ParseAdd("KillerPDF-UpdateCheck");
http.DefaultRequestHeaders.UserAgent.ParseAdd("MmdPdf-UpdateCheck");
var json = await http.GetStringAsync($"{Repo.Replace("github.com", "api.github.com/repos")}/releases/latest")
.ConfigureAwait(true);
@@ -148,13 +148,13 @@ namespace KillerPDF.Features
if (_host.IsDirty)
{
KillerDialog.Show(_host.Window, _host.Loc("Str_Dlg_SaveBeforeUpdate"),
"KillerPDF", MessageBoxButton.OK, MessageBoxImage.Warning);
"MmdPdf", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var confirm = KillerDialog.Show(_host.Window,
string.Format(_host.Loc("Str_UpdatePrompt"), tag),
"KillerPDF", MessageBoxButton.OKCancel, MessageBoxImage.Question);
"MmdPdf", MessageBoxButton.OKCancel, MessageBoxImage.Question);
if (confirm != MessageBoxResult.OK) return;
_host.UpdateEnabled = false;
@@ -187,9 +187,9 @@ namespace KillerPDF.Features
{
System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
using var http = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(90) };
http.DefaultRequestHeaders.UserAgent.ParseAdd("KillerPDF-UpdateCheck");
http.DefaultRequestHeaders.UserAgent.ParseAdd("MmdPdf-UpdateCheck");
var exeUrl = $"{Repo}/releases/download/{tag}/KillerPDF.exe";
var exeUrl = $"{Repo}/releases/download/{tag}/MmdPdf.exe";
// Read the checksums from the release ASSET next to the exe, not from
// raw.githubusercontent at the tag. Both files are uploaded to the release
// together, so the hash can never drift from the exe the way a repo-committed
@@ -202,7 +202,7 @@ namespace KillerPDF.Features
string? expected = null;
foreach (var line in sumsTxt.Replace("\r", "").Split('\n'))
{
if (line.TrimStart().StartsWith("KillerPDF.exe", StringComparison.OrdinalIgnoreCase))
if (line.TrimStart().StartsWith("MmdPdf.exe", StringComparison.OrdinalIgnoreCase))
{
var parts = line.Split([' ', '\t'], StringSplitOptions.RemoveEmptyEntries);
if (parts.Length >= 2) expected = parts[^1];
@@ -216,7 +216,7 @@ namespace KillerPDF.Features
actual = BitConverter.ToString(sha.ComputeHash(exeBytes)).Replace("-", "");
if (!actual.Equals(expected, StringComparison.OrdinalIgnoreCase)) return null;
var path = Path.Combine(Path.GetTempPath(), $"KillerPDF_update_{Guid.NewGuid():N}.exe");
var path = Path.Combine(Path.GetTempPath(), $"MmdPdf_update_{Guid.NewGuid():N}.exe");
File.WriteAllBytes(path, exeBytes);
return path;
}
@@ -233,9 +233,9 @@ namespace KillerPDF.Features
var reopen = _host.FileToReopen;
var pid = Process.GetCurrentProcess().Id;
var relArg = string.IsNullOrEmpty(reopen) ? "" : $" \"{reopen}\"";
var bat = Path.Combine(Path.GetTempPath(), $"killerpdf_update_{Guid.NewGuid():N}.bat");
var bat = Path.Combine(Path.GetTempPath(), $"mmdpdf_update_{Guid.NewGuid():N}.bat");
bool portable = App.IsPortable();
string? portableLauncher = Environment.GetEnvironmentVariable("KILLERPDF_LAUNCHER_PATH");
string? portableLauncher = Environment.GetEnvironmentVariable("MMDPDF_LAUNCHER_PATH");
bool packagedPortable = portable && !string.IsNullOrWhiteSpace(portableLauncher) && File.Exists(portableLauncher);
if (!App.VerifyAuthenticode(newExe).Valid)
@@ -252,7 +252,7 @@ namespace KillerPDF.Features
// When elevated, relaunch through explorer.exe so the app comes back at the user's
// normal integrity level rather than inheriting the elevated token. explorer.exe
// cannot forward arguments, so the currently-open file is not reopened on that
// path - a one-off convenience loss, preferred over leaving KillerPDF running as
// path - a one-off convenience loss, preferred over leaving MmdPdf running as
// administrator for the rest of the session.
var script = new StringBuilder()
.AppendLine("@echo off")
@@ -262,7 +262,7 @@ namespace KillerPDF.Features
if (packagedPortable)
{
if (int.TryParse(Environment.GetEnvironmentVariable("KILLERPDF_LAUNCHER_PID"), out int launcherPid))
if (int.TryParse(Environment.GetEnvironmentVariable("MMDPDF_LAUNCHER_PID"), out int launcherPid))
{
script.AppendLine(":waitlauncher")
.AppendLine($"tasklist /fi \"PID eq {launcherPid}\" 2>nul | find \"{launcherPid}\" >nul")
+2 -2
View File
@@ -1,4 +1,4 @@
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// What AboutController needs from the window hosting it, beyond the shared shell services.
@@ -6,7 +6,7 @@ namespace KillerPDF.Features
/// Every member is a value or a plain string, never a control, so the controller holds no
/// reference to a TextBlock or a Button and can be driven by a stub in a test.
///
/// KillerPDF differs from Killendar's version in one way worth knowing: several of the About
/// MmdPdf differs from Killendar's version in one way worth knowing: several of the About
/// card's lines are built as INLINES rather than set as text - the wordmark is two differently
/// styled runs, and the tagline, version and alias each carry a hyperlink. Constructing those
/// is UI work, so it stays in the shell and the controller hands over only the strings and the
+6 -6
View File
@@ -5,15 +5,15 @@ using System.Runtime.InteropServices;
using System.Text;
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
using KillerPDF.Services;
using MmdPdf.Services;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
// ============================================================
// Headless CLI batch mode
// ============================================================
//
// KillerPDF.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]
// MmdPdf.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]
//
// Resaves one PDF (or every *.pdf under a folder tree, mirroring the
// relative structure into the output folder) through the same pipeline a
@@ -25,7 +25,7 @@ namespace KillerPDF.Features
//
// Built for the veraPDF validation harness (validation/): baseline the
// corpus, --batch-resave it, validate the output tree, then diff with
// validation/Compare-VeraPDF.ps1. The claim being tested is "a KillerPDF
// validation/Compare-VeraPDF.ps1. The claim being tested is "a MmdPdf
// save does not degrade standards conformance".
//
// Exit codes: 0 = every file OK or SKIP, 1 = at least one FAIL
@@ -34,7 +34,7 @@ namespace KillerPDF.Features
// Invoked from App.OnStartup BEFORE the single-instance mutex, so a batch
// run works even while a GUI instance is open and never forwards to it.
//
// KillerPDF builds as a GUI-subsystem exe, so it has no console of its
// MmdPdf builds as a GUI-subsystem exe, so it has no console of its
// own; AttachConsole(-1) latches onto the parent terminal when launched
// from one. Output interleaves with the prompt (standard GUI-app quirk) -
// the authoritative record is the --log CSV and the exit code.
@@ -82,7 +82,7 @@ namespace KillerPDF.Features
if (badUsage || string.IsNullOrWhiteSpace(input) || string.IsNullOrWhiteSpace(output))
{
con.WriteLine("Usage: KillerPDF.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]");
con.WriteLine("Usage: MmdPdf.exe --batch-resave <input.pdf|inputDir> <output.pdf|outputDir> [--log <file.csv>] [--quiet]");
exitCode = 2;
return true;
}
+21 -21
View File
@@ -18,14 +18,14 @@ using Docnet.Core.Models;
using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
using KillerPDF.Services;
using MmdPdf.Services;
// The scrubs, bitmap helpers, import helpers and PDFium interop all live in Services
// (PdfScrub.cs, BitmapHelpers.cs, PdfImport.cs, PdfiumInterop.cs; KillerUI refactor,
// (PdfScrub.cs, BitmapHelpers.cs, PdfImport.cs, PdfiumInterop.cs; MmdPdfUI refactor,
// 2026-07-31), called qualified below. No Features-to-Shell reaches remain in this file.
// OpenBatchConsole and FlattenBatchDetail are shared with the batch runner.
using static KillerPDF.Features.BatchRunner;
using static MmdPdf.Features.BatchRunner;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
// ============================================================
// Command-line interface
@@ -35,7 +35,7 @@ namespace KillerPDF.Features
// BEFORE the single-instance mutex, so CLI runs work while a GUI instance
// is open, never forward to it, and never show a window. A launch with no
// recognized command flag falls through to the normal GUI (including the
// classic "KillerPDF.exe file.pdf" file-association open).
// classic "MmdPdf.exe file.pdf" file-association open).
//
// Each command reuses the same pipeline its GUI equivalent runs - the
// merge named-destination rewrite, the pre-save scrubs, the PDFium
@@ -140,11 +140,11 @@ namespace KillerPDF.Features
private static string CliHelpText() => string.Join(Environment.NewLine,
[
"KillerPDF " + (Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? "") + " - command line usage",
"MmdPdf " + (Assembly.GetExecutingAssembly().GetName().Version?.ToString(3) ?? "") + " - command line usage",
"",
" KillerPDF.exe <file.pdf> open in the app",
" KillerPDF.exe --version | -v print version",
" KillerPDF.exe --help | -h | /? this text",
" MmdPdf.exe <file.pdf> open in the app",
" MmdPdf.exe --version | -v print version",
" MmdPdf.exe --help | -h | /? this text",
"",
" --merge <out.pdf> <in1> <in2> ... merge PDFs (and images) into one PDF",
" --extract-pages <in.pdf> <pages> <out.pdf>",
@@ -165,7 +165,7 @@ namespace KillerPDF.Features
" open/save pipeline (validation harness)",
"",
"Exit codes: 0 success, 1 operation failed, 2 bad usage.",
"Runs headless and works while the KillerPDF window is open.",
"Runs headless and works while the MmdPdf window is open.",
]);
/// <summary>
@@ -246,7 +246,7 @@ namespace KillerPDF.Features
{
if (pos.Count < 3)
{
con.WriteLine("Usage: KillerPDF.exe --merge <out.pdf> <in1.pdf> <in2.pdf> ...");
con.WriteLine("Usage: MmdPdf.exe --merge <out.pdf> <in1.pdf> <in2.pdf> ...");
return 2;
}
string outPath = Path.GetFullPath(pos[0]);
@@ -297,7 +297,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 3)
{
con.WriteLine("Usage: KillerPDF.exe --extract-pages <in.pdf> <pages> <out.pdf> (pages like 1-3,5,9-12)");
con.WriteLine("Usage: MmdPdf.exe --extract-pages <in.pdf> <pages> <out.pdf> (pages like 1-3,5,9-12)");
return 2;
}
string inPath = Path.GetFullPath(pos[0]), spec = pos[1], outPath = Path.GetFullPath(pos[2]);
@@ -325,7 +325,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 2)
{
con.WriteLine("Usage: KillerPDF.exe --split <in.pdf> <outputFolder>");
con.WriteLine("Usage: MmdPdf.exe --split <in.pdf> <outputFolder>");
return 2;
}
string inPath = Path.GetFullPath(pos[0]), outDir = Path.GetFullPath(pos[1]);
@@ -358,7 +358,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 2)
{
con.WriteLine("Usage: KillerPDF.exe --decrypt <in.pdf> <out.pdf> [--password <password>]");
con.WriteLine("Usage: MmdPdf.exe --decrypt <in.pdf> <out.pdf> [--password <password>]");
return 2;
}
string inPath = Path.GetFullPath(pos[0]), outPath = Path.GetFullPath(pos[1]);
@@ -479,7 +479,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 2)
{
con.WriteLine("Usage: KillerPDF.exe --to-image <in.pdf> <outputFolder> [--dpi <n>] [--format png|jpg] [--pages <range>] [--transparent]");
con.WriteLine("Usage: MmdPdf.exe --to-image <in.pdf> <outputFolder> [--dpi <n>] [--format png|jpg] [--pages <range>] [--transparent]");
return 2;
}
string inPath = Path.GetFullPath(pos[0]), outDir = Path.GetFullPath(pos[1]);
@@ -520,7 +520,7 @@ namespace KillerPDF.Features
{
w = pr.GetPageWidth();
h = pr.GetPageHeight();
raw = KillerPDF.Services.PdfiumInterop.RenderPageWithAnnotations(
raw = MmdPdf.Services.PdfiumInterop.RenderPageWithAnnotations(
renderPath, idx, w, h, transparent)
?? (transparent
? pr.GetImage()
@@ -546,7 +546,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 2)
{
con.WriteLine("Usage: KillerPDF.exe --flatten <in.pdf> <out.pdf> [--dpi <n>]");
con.WriteLine("Usage: MmdPdf.exe --flatten <in.pdf> <out.pdf> [--dpi <n>]");
return 2;
}
string inPath = Path.GetFullPath(pos[0]), outPath = Path.GetFullPath(pos[1]);
@@ -570,7 +570,7 @@ namespace KillerPDF.Features
// #141: WithAnnotations, or the rebuild drops the file's own markup.
w = pr.GetPageWidth();
h = pr.GetPageHeight();
raw = KillerPDF.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, i, w, h)
raw = MmdPdf.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, i, w, h)
?? pr.GetImage(new Docnet.Core.Converters.NaiveTransparencyRemover());
}
int rot = rotations != null && i < rotations.Length ? rotations[i] : 0;
@@ -616,7 +616,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 1)
{
con.WriteLine("Usage: KillerPDF.exe --print <in.pdf> [--printer <name>] [--pages <range>] [--copies <n>]");
con.WriteLine("Usage: MmdPdf.exe --print <in.pdf> [--printer <name>] [--pages <range>] [--copies <n>]");
return 2;
}
string inPath = Path.GetFullPath(pos[0]);
@@ -677,7 +677,7 @@ namespace KillerPDF.Features
{
w = pr.GetPageWidth();
h = pr.GetPageHeight();
raw = KillerPDF.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, idx, w, h)
raw = MmdPdf.Services.PdfiumInterop.RenderPageWithAnnotations(renderPath, idx, w, h)
?? pr.GetImage(); // #141
}
int rot = rotations != null && idx < rotations.Length ? rotations[idx] : 0;
@@ -740,7 +740,7 @@ namespace KillerPDF.Features
{
if (pos.Count != 2)
{
con.WriteLine("Usage: KillerPDF.exe --ocr <in.pdf> <out.pdf> [--lang <code>] (default eng)");
con.WriteLine("Usage: MmdPdf.exe --ocr <in.pdf> <out.pdf> [--lang <code>] (default eng)");
return 2;
}
string inPath = Path.GetFullPath(pos[0]), outPath = Path.GetFullPath(pos[1]);
+1 -1
View File
@@ -1,6 +1,6 @@
using System.Windows;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// The three things every feature needs from the window: an owner for modal dialogs, string
+1 -1
View File
@@ -1,7 +1,7 @@
using System.Threading;
using System.Threading.Tasks;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// What OcrController needs from the window hosting it, beyond the shared shell services.
+12 -12
View File
@@ -9,14 +9,14 @@ using Microsoft.Win32;
using PdfSharpCore.Drawing;
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
using KillerPDF.Services;
using MmdPdf.Services;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// The four OCR operations that work on the open document: page to clipboard, region to
/// clipboard, searchable PDF, and extract-all-text. Moved out of Ocr.cs (MainWindow) in the
/// KillerUI refactor.
/// MmdPdfUI refactor.
///
/// Holds no controls. Talks to the window only through <see cref="IOcrHost"/>, so the whole
/// of this file is testable against a stub host. The pure language/download helpers live in
@@ -84,7 +84,7 @@ namespace KillerPDF.Features
catch (Exception ex)
{
_host.HideBusy();
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "KillerPDF",
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "MmdPdf",
MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
@@ -141,7 +141,7 @@ namespace KillerPDF.Features
catch (Exception ex)
{
_host.HideBusy();
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "KillerPDF", MessageBoxButton.OK, MessageBoxImage.Error);
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_OcrFailed") + "\n" + ex.Message, "MmdPdf", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
{
@@ -173,7 +173,7 @@ namespace KillerPDF.Features
if (!await _host.EnsureOcrModelsReadyAsync()) return;
_host.CommitActiveTextBox();
var dlg = new KillerPDF.Controls.FileDialog(KillerPDF.Controls.FileDialogMode.Save)
var dlg = new MmdPdf.Controls.FileDialog(MmdPdf.Controls.FileDialogMode.Save)
{
Filter = _host.Loc("Str_Filter_Pdf") + "|*.pdf",
Title = _host.Loc("Str_Ocr_SaveSearchable"),
@@ -190,7 +190,7 @@ namespace KillerPDF.Features
try { _host.SaveDocumentTo(src); }
catch (Exception ex)
{
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "KillerPDF",
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "MmdPdf",
MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
@@ -208,12 +208,12 @@ namespace KillerPDF.Features
_host.SetStatus(string.Format(_host.Loc("Str_St_SearchableSaved"), pages, words));
KillerDialog.Show(_host.Window,
string.Format(_host.Loc("Str_Dlg_SearchableSaved"), outPath, pages, words),
"KillerPDF", MessageBoxButton.OK, MessageBoxImage.Information);
"MmdPdf", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
_host.HideBusy();
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_SearchableFailed") + "\n" + ex.Message, "KillerPDF",
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_SearchableFailed") + "\n" + ex.Message, "MmdPdf",
MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
@@ -311,7 +311,7 @@ namespace KillerPDF.Features
if (!await _host.EnsureOcrModelsReadyAsync()) return;
_host.CommitActiveTextBox();
var dlg = new KillerPDF.Controls.FileDialog(KillerPDF.Controls.FileDialogMode.Save)
var dlg = new MmdPdf.Controls.FileDialog(MmdPdf.Controls.FileDialogMode.Save)
{
Filter = _host.Loc("Str_Filter_Text") + "|*.txt|Markdown|*.md",
Title = _host.Loc("Str_Ocr_ExtractAllText"),
@@ -328,7 +328,7 @@ namespace KillerPDF.Features
try { _host.SaveDocumentTo(src); pageCount = _host.PageCount; }
catch (Exception ex)
{
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "KillerPDF",
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_PrepareDoc") + "\n" + ex.Message, "MmdPdf",
MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
@@ -348,7 +348,7 @@ namespace KillerPDF.Features
catch (Exception ex)
{
_host.HideBusy();
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_ExtractFailed") + "\n" + ex.Message, "KillerPDF",
KillerDialog.Show(_host.Window, _host.Loc("Str_Err_ExtractFailed") + "\n" + ex.Message, "MmdPdf",
MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
+1 -1
View File
@@ -1,4 +1,4 @@
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// What SearchController needs from the window hosting it, beyond the shared shell services.
+3 -3
View File
@@ -1,11 +1,11 @@
using KillerPDF.Services;
using MmdPdf.Services;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// The document-search state machine: runs SearchService over the working file, keeps the
/// per-page rect map and the flat reading-ordered match list, and steps the match cursor.
/// Moved out of Search.cs (MainWindow) in the KillerUI refactor.
/// Moved out of Search.cs (MainWindow) in the MmdPdfUI refactor.
///
/// Holds no controls. Talks to the window only through <see cref="ISearchHost"/>; the search
/// bar UI, debounce, and the highlight painting stay in the shell half (Shell/Search.cs).
+2 -2
View File
@@ -1,9 +1,9 @@
using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
using KillerPDF.Controls;
using MmdPdf.Controls;
namespace KillerPDF.Features
namespace MmdPdf.Features
{
/// <summary>
/// What a document viewer needs from the window around it.
+1 -1
View File
@@ -1,6 +1,6 @@
using System.Collections.Generic;
namespace KillerPDF
namespace MmdPdf
{
/// <summary>
/// The tab and session members under the names the window already calls them by, routed to the
+1 -1
View File
@@ -6,7 +6,7 @@ using System.Windows.Media;
using System.Windows.Shapes;
using PdfSharpCore.Pdf;
namespace KillerPDF
namespace MmdPdf
{
/// <summary>
/// The window's half of the viewer bridge. Read this alongside
+2 -2
View File
@@ -1,7 +1,7 @@
using System.Windows.Controls;
using KillerPDF.Controls;
using MmdPdf.Controls;
namespace KillerPDF
namespace MmdPdf
{
// The element names MainWindow.xaml used to generate, now that the document pane is a control
// (Controls/PdfViewer.xaml).
+3 -3
View File
@@ -1,11 +1,11 @@
using KillerPDF.Features;
using KillerPDF.Controls;
using MmdPdf.Features;
using MmdPdf.Controls;
using System.Windows;
using System.Windows.Input;
using System;
using System.Linq;
namespace KillerPDF
namespace MmdPdf
{
// MainWindow's half of IViewerHost.
//
+1 -1
View File
@@ -5,7 +5,7 @@ using System.Windows.Input;
using System.Windows.Media;
using PdfSharpCore.Pdf;
namespace KillerPDF
namespace MmdPdf
{
/// <summary>
/// Outward stubs: the annotation, text, crop, form and link members under the names the rest of