mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:17:44 +00:00
MacPDF: Start converting to document architecture
Cmd-O now produces an Open... dialog, and opening a PDF file reads it (and then creates the old LagomPDFView object, which then reads a hardcoded PDF again and displays that. One thing at a time.) "Open Recent>" is also populated and seems to work. See the guide: https://developer.apple.com/library/archive/documentation/DataManagement/Conceptual/DocBasedAppProgrammingGuideForOSX/Introduction/Introduction.html
This commit is contained in:
parent
77b311f00a
commit
0a01a2c82b
7 changed files with 181 additions and 25 deletions
|
@ -29,9 +29,4 @@
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)openDocument:(id)sender
|
|
||||||
{
|
|
||||||
NSLog(@"open");
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
|
<deployment identifier="macosx"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22154"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||||
|
@ -12,11 +12,7 @@
|
||||||
</customObject>
|
</customObject>
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<customObject id="Voe-Tx-rLC" customClass="AppDelegate">
|
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
|
||||||
<connections>
|
|
||||||
<outlet property="window" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||||
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
||||||
<items>
|
<items>
|
||||||
|
@ -680,16 +676,5 @@
|
||||||
</items>
|
</items>
|
||||||
<point key="canvasLocation" x="200" y="121"/>
|
<point key="canvasLocation" x="200" y="121"/>
|
||||||
</menu>
|
</menu>
|
||||||
<window title="SerenityPDF" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
|
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
|
||||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
|
||||||
<rect key="contentRect" x="335" y="390" width="705" height="1017"/>
|
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="1728" height="1079"/>
|
|
||||||
<view key="contentView" id="EiT-Mj-1SZ" customClass="LagomPDFView">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="705" height="1017"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
</view>
|
|
||||||
<point key="canvasLocation" x="312.5" y="728.5"/>
|
|
||||||
</window>
|
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
|
|
23
Meta/Lagom/Contrib/MacPDF/Info.plist
Normal file
23
Meta/Lagom/Contrib/MacPDF/Info.plist
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDocumentTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>PDF</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>LSHandlerRank</key>
|
||||||
|
<string>Default</string>
|
||||||
|
<key>LSItemContentTypes</key>
|
||||||
|
<array>
|
||||||
|
<string>com.adobe.pdf</string>
|
||||||
|
</array>
|
||||||
|
<key>NSDocumentClass</key>
|
||||||
|
<string>LagomPDFDocument</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
19
Meta/Lagom/Contrib/MacPDF/LagomPDFDocument.h
Normal file
19
Meta/Lagom/Contrib/MacPDF/LagomPDFDocument.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
//
|
||||||
|
// LagomPDFDocument.h
|
||||||
|
// SerenityPDF
|
||||||
|
//
|
||||||
|
// Created by Nico Weber on 9/21/23.
|
||||||
|
//
|
||||||
|
|
||||||
|
// Several AK types conflict with MacOS types.
|
||||||
|
#define FixedPoint FixedPointMacOS
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#undef FixedPoint
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface LagomPDFDocument : NSDocument
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
99
Meta/Lagom/Contrib/MacPDF/LagomPDFDocument.mm
Normal file
99
Meta/Lagom/Contrib/MacPDF/LagomPDFDocument.mm
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
//
|
||||||
|
// LagomPDFDocument.m
|
||||||
|
// SerenityPDF
|
||||||
|
//
|
||||||
|
// Created by Nico Weber on 9/21/23.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "LagomPDFDocument.h"
|
||||||
|
|
||||||
|
// Several AK types conflict with MacOS types.
|
||||||
|
#define FixedPoint FixedPointMacOS
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#undef FixedPoint
|
||||||
|
|
||||||
|
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
|
||||||
|
|
||||||
|
#include <LibCore/File.h>
|
||||||
|
#include <LibCore/MappedFile.h>
|
||||||
|
#include <LibGfx/Bitmap.h>
|
||||||
|
#include <LibPDF/Document.h>
|
||||||
|
#include <LibPDF/Renderer.h>
|
||||||
|
|
||||||
|
@interface LagomPDFDocument ()
|
||||||
|
{
|
||||||
|
NSData* _data; // Strong, _doc refers to it.
|
||||||
|
RefPtr<PDF::Document> _doc;
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation LagomPDFDocument
|
||||||
|
|
||||||
|
- (PDF::PDFErrorOr<NonnullRefPtr<PDF::Document>>)load:(NSData*)data
|
||||||
|
{
|
||||||
|
auto document = TRY(PDF::Document::create(ReadonlyBytes { [data bytes], [data length] }));
|
||||||
|
TRY(document->initialize());
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString*)windowNibName
|
||||||
|
{
|
||||||
|
// Override to return the nib file name of the document.
|
||||||
|
// If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.
|
||||||
|
return @"LagomPDFDocument";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowControllerDidLoadNib:(NSWindowController*)aController
|
||||||
|
{
|
||||||
|
[super windowControllerDidLoadNib:aController];
|
||||||
|
// Add any code here that needs to be executed once the windowController has loaded the document's window.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSData*)dataOfType:(NSString*)typeName error:(NSError**)outError
|
||||||
|
{
|
||||||
|
// Insert code here to write your document to data of the specified type. If outError != NULL, ensure that you create and set an appropriate error if you return nil.
|
||||||
|
// Alternatively, you could remove this method and override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
|
||||||
|
if (outError) {
|
||||||
|
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:nil];
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)readFromData:(NSData*)data ofType:(NSString*)typeName error:(NSError**)outError
|
||||||
|
{
|
||||||
|
// Insert code here to read your document from the given data of the specified type. If outError != NULL, ensure that you create and set an appropriate error if you return NO.
|
||||||
|
// Alternatively, you could remove this method and override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead.
|
||||||
|
// If you do, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded.
|
||||||
|
|
||||||
|
if (![[UTType typeWithIdentifier:typeName] conformsToType:UTTypePDF]) {
|
||||||
|
if (outError) {
|
||||||
|
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain
|
||||||
|
code:unimpErr
|
||||||
|
userInfo:nil];
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto doc_or = [self load:data]; !doc_or.is_error()) {
|
||||||
|
_doc = doc_or.value();
|
||||||
|
_data = data;
|
||||||
|
// [self pageChanged];
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
} else {
|
||||||
|
NSLog(@"failed to load: %@", @(doc_or.error().message().characters()));
|
||||||
|
if (outError) {
|
||||||
|
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain
|
||||||
|
code:unimpErr
|
||||||
|
userInfo:nil];
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)autosavesInPlace
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
32
Meta/Lagom/Contrib/MacPDF/LagomPDFDocument.xib
Normal file
32
Meta/Lagom/Contrib/MacPDF/LagomPDFDocument.xib
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="macosx"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22154"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<customObject id="-2" userLabel="File's Owner" customClass="LagomPDFDocument">
|
||||||
|
<connections>
|
||||||
|
<outlet property="window" destination="xOd-HO-29H" id="JIz-fz-R2o"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="xOd-HO-29H" userLabel="Window">
|
||||||
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||||
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||||
|
<rect key="contentRect" x="133" y="235" width="507" height="413"/>
|
||||||
|
<rect key="screenRect" x="0.0" y="0.0" width="1728" height="1079"/>
|
||||||
|
<value key="minSize" type="size" width="94" height="86"/>
|
||||||
|
<view key="contentView" id="gIp-Ho-8D9" customClass="LagomPDFView">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="507" height="413"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
</view>
|
||||||
|
<connections>
|
||||||
|
<outlet property="delegate" destination="-2" id="0bl-1N-x8E"/>
|
||||||
|
</connections>
|
||||||
|
<point key="canvasLocation" x="80" y="126"/>
|
||||||
|
</window>
|
||||||
|
</objects>
|
||||||
|
</document>
|
|
@ -69,6 +69,9 @@ static NSBitmapImageRep* ns_from_gfx(NonnullRefPtr<Gfx::Bitmap> bitmap_p)
|
||||||
Gfx::FontDatabase::set_default_fonts_lookup_path(DeprecatedString::formatted("{}/Base/res/fonts", source_root));
|
Gfx::FontDatabase::set_default_fonts_lookup_path(DeprecatedString::formatted("{}/Base/res/fonts", source_root));
|
||||||
|
|
||||||
_file = TRY(Core::MappedFile::map("/Users/thakis/Downloads/pdf_reference_1-7.pdf"sv));
|
_file = TRY(Core::MappedFile::map("/Users/thakis/Downloads/pdf_reference_1-7.pdf"sv));
|
||||||
|
// _file = TRY(Core::MappedFile::map("/Users/thakis/Downloads/DC-008-Translation-2023-E.pdf"sv));
|
||||||
|
// _file = TRY(Core::MappedFile::map("/Users/thakis/Downloads/ISO_32000-2-2020_sponsored.pdf"sv));
|
||||||
|
// _file = TRY(Core::MappedFile::map("/Users/thakis/Downloads/Text.pdf"sv));
|
||||||
auto document = TRY(PDF::Document::create(_file->bytes()));
|
auto document = TRY(PDF::Document::create(_file->bytes()));
|
||||||
TRY(document->initialize());
|
TRY(document->initialize());
|
||||||
return document;
|
return document;
|
||||||
|
@ -87,7 +90,7 @@ static NSBitmapImageRep* ns_from_gfx(NonnullRefPtr<Gfx::Bitmap> bitmap_p)
|
||||||
{
|
{
|
||||||
static bool did_load = false;
|
static bool did_load = false;
|
||||||
if (!did_load) {
|
if (!did_load) {
|
||||||
_page_index = 0;
|
_page_index = 24 - 1;
|
||||||
did_load = true;
|
did_load = true;
|
||||||
if (auto doc_or = [self load]; !doc_or.is_error()) {
|
if (auto doc_or = [self load]; !doc_or.is_error()) {
|
||||||
_doc = doc_or.value();
|
_doc = doc_or.value();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue