Skip to content

Commit 8ecba78

Browse files
authored
Merge pull request #152 from PSPDFKit/reinhard/menu-item-grouping
Add support for setting a custom menu grouping on the PSPDFKitView
2 parents f2b56d5 + 332f3a8 commit 8ecba78

File tree

12 files changed

+296
-1
lines changed

12 files changed

+296
-1
lines changed

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ Example - Native UI Component:
232232
- Copy `PSPDFKit.framework` and `PSPDFKitUI.framework` into the `PSPDFKit` directory.
233233
- Install dependencies: `yarn install` in `samples/Catalog` directory. (Because of a [bug](https://github.com/yarnpkg/yarn/issues/2165) you may need to clean `yarn`'s cache with `yarn cache clean` before.)
234234
- Run the app with `react-native-cli`: `react-native run-ios`
235+
- If you get an error about `config.h` not being found check out [this blog post](https://tuntunir.blogspot.com/2018/02/react-native-fatal-error-configh-file.html) for information on how to fix it.
235236

236237
#### Configuration Mapping
237238

@@ -243,6 +244,18 @@ Annotations are mapped based on their type name. This is case sensitive. For exa
243244
editableAnnotationTypes: ["Ink", "Highlight"];
244245
```
245246

247+
#### Menu Item Mapping
248+
249+
The PSPDFKit React Native iOS Wrapper allows you to specify a custom grouping for the annotation creation toolbar. Please refer to [`RCTConvert+PSPDFAnnotationToolbarConfiguration.m`](./ios/RCTPSPDFKit/Converters/RCTConvert+PSPDFAnnotationToolbarConfiguration.m#L47) for the complete list of menu items. To set them just specify the `menuItemGrouping` prop on the `PSPDFKitView`. The format used is as follows:
250+
251+
```
252+
[
253+
menuItem,
254+
{ key: menuItem, items: [subItem, subItem]},
255+
...
256+
]
257+
```
258+
246259
### Android
247260

248261
#### Requirements
@@ -522,6 +535,18 @@ Just like on iOS we also support integrating PSPDFKit directly into the react-na
522535
- Because of [issues](https://github.com/facebook/react-native/issues/17968) in react-native our `PdfView` needs to call `layout` and `dispatchOnGlobalLayout` on every frame, this might negatively affect your apps performance or even cause it to misbehave.
523536
- `PSPDFKitView` doesn't yet support all the features (outline, bookmarks, thubmnail grid, view settings) using `PSPDFKit.present` provides.
524537
538+
##### Menu Item Mapping
539+
540+
The PSPDFKit React Native Android Wrapper allows you to specify a custom grouping for the annotation creation toolbar. Please refer to [`ReactGroupingRule.java`](https://github.com/PSPDFKit/react-native/blob/master/android/src/main/java/com/pspdfkit/react/menu/ReactGroupingRule.java) for the complete list of menu items. To set them just specify the `menuItemGrouping` prop on the `PSPDFKitView`. The format used is as follows:
541+
542+
```
543+
[
544+
menuItem,
545+
{ key: menuItem, items: [subItem, subItem]},
546+
...
547+
]
548+
```
549+
525550
#### Update
526551
527552
Upgrading yarn's lock file is required in order to update react-native-pspdfkit module in a project that has been already setup following the steps in [Getting Started](#getting-started-1) section.

android/src/main/java/com/pspdfkit/react/ReactPdfViewManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.pspdfkit.react.events.PdfViewDocumentSaveFailedEvent;
2020
import com.pspdfkit.react.events.PdfViewDocumentSavedEvent;
2121
import com.pspdfkit.react.events.PdfViewStateChangedEvent;
22+
import com.pspdfkit.react.menu.ReactGroupingRule;
2223
import com.pspdfkit.views.PdfView;
2324

2425
import org.json.JSONObject;
@@ -137,6 +138,12 @@ public void setAnnotationAuthorName(PdfView view, String annotationAuthorName) {
137138
PSPDFKitPreferences.get(view.getContext()).setAnnotationCreator(annotationAuthorName);
138139
}
139140

141+
@ReactProp(name = "menuItemGrouping")
142+
public void setMenuItemGrouping(PdfView view, @NonNull ReadableArray menuItemGrouping) {
143+
ReactGroupingRule groupingRule = new ReactGroupingRule(view.getContext(), menuItemGrouping);
144+
view.setMenuItemGroupingRule(groupingRule);
145+
}
146+
140147
@Nullable
141148
@Override
142149
public Map getExportedCustomDirectEventTypeConstants() {
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package com.pspdfkit.react.menu;
2+
3+
import android.content.Context;
4+
import android.support.annotation.IdRes;
5+
import android.support.annotation.IntRange;
6+
import android.support.annotation.NonNull;
7+
import android.util.Log;
8+
9+
import com.facebook.react.bridge.Dynamic;
10+
import com.facebook.react.bridge.ReadableArray;
11+
import com.facebook.react.bridge.ReadableMap;
12+
import com.facebook.react.bridge.ReadableType;
13+
import com.pspdfkit.react.R;
14+
import com.pspdfkit.ui.toolbar.ContextualToolbar;
15+
import com.pspdfkit.ui.toolbar.grouping.presets.MenuItem;
16+
import com.pspdfkit.ui.toolbar.grouping.presets.PresetMenuItemGroupingRule;
17+
18+
import java.util.ArrayList;
19+
import java.util.List;
20+
21+
/**
22+
* A menu item grouping rule that displays only the menu items configured via the menuItemGrouping prop.
23+
*/
24+
public class ReactGroupingRule extends PresetMenuItemGroupingRule {
25+
26+
private static final String TAG = "ReactGroupingRule";
27+
private static final int INVALID_ID = -1;
28+
29+
private final List<MenuItem> items = new ArrayList<>();
30+
31+
public ReactGroupingRule(@NonNull Context context, @NonNull ReadableArray menuItems) {
32+
super(context);
33+
for (int i = 0; i < menuItems.size(); i++) {
34+
Dynamic menuItem = menuItems.getDynamic(i);
35+
if (menuItem.getType() == ReadableType.Map) {
36+
ReadableMap groupItem = menuItem.asMap();
37+
int key = getIdFromName(groupItem.getString("key"));
38+
if (key == INVALID_ID) {
39+
continue;
40+
}
41+
42+
ReadableArray subItems = groupItem.getArray("items");
43+
items.add(new MenuItem(key, collectItemIds(subItems)));
44+
} else {
45+
int id = getIdFromName(menuItem.asString());
46+
if (id == INVALID_ID) {
47+
continue;
48+
}
49+
items.add(new MenuItem(id));
50+
}
51+
}
52+
}
53+
54+
private int[] collectItemIds(ReadableArray items) {
55+
List<Integer> itemIds = new ArrayList<>();
56+
for (int i = 0; i < items.size(); i++) {
57+
int id = getIdFromName(items.getString(i));
58+
if (id == INVALID_ID) {
59+
continue;
60+
}
61+
itemIds.add(id);
62+
}
63+
64+
int[] ids = new int[itemIds.size()];
65+
for (int i = 0; i < itemIds.size(); i++) {
66+
ids[i] = itemIds.get(i);
67+
}
68+
return ids;
69+
}
70+
71+
@IdRes
72+
private int getIdFromName(@NonNull String name) {
73+
switch (name) {
74+
case "markup":
75+
return R.id.pspdf__annotation_creation_toolbar_item_markup;
76+
case "writing":
77+
return R.id.pspdf__annotation_creation_toolbar_item_writing;
78+
case "highlight":
79+
return R.id.pspdf__annotation_creation_toolbar_item_highlight;
80+
case "squiggly":
81+
return R.id.pspdf__annotation_creation_toolbar_item_squiggly;
82+
case "strikeout":
83+
return R.id.pspdf__annotation_creation_toolbar_item_strikeout;
84+
case "underline":
85+
return R.id.pspdf__annotation_creation_toolbar_item_underline;
86+
case "freetext":
87+
return R.id.pspdf__annotation_creation_toolbar_item_freetext;
88+
case "freetext_callout":
89+
return R.id.pspdf__annotation_creation_toolbar_item_freetext_callout;
90+
case "signature":
91+
return R.id.pspdf__annotation_creation_toolbar_item_signature;
92+
case "ink":
93+
return R.id.pspdf__annotation_creation_toolbar_item_ink;
94+
case "note":
95+
return R.id.pspdf__annotation_creation_toolbar_item_note;
96+
case "drawing":
97+
return R.id.pspdf__annotation_creation_toolbar_item_drawing;
98+
case "multimedia":
99+
return R.id.pspdf__annotation_creation_toolbar_item_multimedia;
100+
case "image":
101+
return R.id.pspdf__annotation_creation_toolbar_item_image;
102+
case "camera":
103+
return R.id.pspdf__annotation_creation_toolbar_item_camera;
104+
case "stamp":
105+
return R.id.pspdf__annotation_creation_toolbar_item_stamp;
106+
case "line":
107+
return R.id.pspdf__annotation_creation_toolbar_item_line;
108+
case "square":
109+
return R.id.pspdf__annotation_creation_toolbar_item_square;
110+
case "circle":
111+
return R.id.pspdf__annotation_creation_toolbar_item_circle;
112+
case "polygon":
113+
return R.id.pspdf__annotation_creation_toolbar_item_polygon;
114+
case "polyline":
115+
return R.id.pspdf__annotation_creation_toolbar_item_polyline;
116+
case "erase":
117+
return R.id.pspdf__annotation_creation_toolbar_item_eraser;
118+
case "redaction":
119+
return R.id.pspdf__annotation_creation_toolbar_item_redaction;
120+
case "picker":
121+
return R.id.pspdf__annotation_creation_toolbar_item_picker;
122+
}
123+
124+
Log.i(TAG, String.format("Received unknown menu item %s.", name));
125+
return INVALID_ID;
126+
}
127+
128+
@NonNull
129+
@Override
130+
public List<MenuItem> getGroupPreset(@IntRange(from = ContextualToolbar.MIN_TOOLBAR_CAPACITY) int capacity, int itemsCount) {
131+
return items;
132+
}
133+
}

android/src/main/java/com/pspdfkit/views/PdfView.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.pspdfkit.ui.inspector.PropertyInspectorCoordinatorLayout;
4242
import com.pspdfkit.ui.thumbnail.PdfThumbnailBarController;
4343
import com.pspdfkit.ui.toolbar.ToolbarCoordinatorLayout;
44+
import com.pspdfkit.ui.toolbar.grouping.MenuItemGroupingRule;
4445
import com.pspdfkit.ui.toolbar.popup.PdfTextSelectionPopupToolbar;
4546

4647
import org.json.JSONArray;
@@ -203,6 +204,13 @@ public void setDisableAutomaticSaving(boolean disableAutomaticSaving) {
203204
pdfViewDocumentListener.setDisableAutomaticSaving(disableAutomaticSaving);
204205
}
205206

207+
/**
208+
* Sets the menu item grouping rule that will be used for the annotation creation toolbar.
209+
*/
210+
public void setMenuItemGroupingRule(@NonNull MenuItemGroupingRule groupingRule) {
211+
pdfViewModeController.setMenuItemGroupingRule(groupingRule);
212+
}
213+
206214
private void setupFragment() {
207215
if (fragmentTag != null && configuration != null && document != null) {
208216
PdfFragment pdfFragment = (PdfFragment) fragmentManager.findFragmentByTag(fragmentTag);

android/src/main/java/com/pspdfkit/views/PdfViewModeController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.support.annotation.NonNull;
44

5+
import com.pspdfkit.react.R;
56
import com.pspdfkit.ui.forms.FormEditingBar;
67
import com.pspdfkit.ui.inspector.PropertyInspectorCoordinatorLayout;
78
import com.pspdfkit.ui.inspector.annotation.DefaultAnnotationCreationInspectorController;
@@ -17,6 +18,9 @@
1718
import com.pspdfkit.ui.toolbar.AnnotationCreationToolbar;
1819
import com.pspdfkit.ui.toolbar.AnnotationEditingToolbar;
1920
import com.pspdfkit.ui.toolbar.ToolbarCoordinatorLayout;
21+
import com.pspdfkit.ui.toolbar.grouping.MenuItemGroupingRule;
22+
23+
import javax.annotation.Nullable;
2024

2125
/**
2226
* Keeps track of the currently active mode and handles updating the toolbar states.
@@ -56,6 +60,13 @@ class PdfViewModeController implements AnnotationManager.OnAnnotationCreationMod
5660
this.formEditingInspectorController = new FormEditingInspectorController(parent.getContext(), inspectorCoordinatorLayout);
5761
}
5862

63+
/**
64+
* Sets the menu item grouping rule that will be used for the annotation creation toolbar.
65+
*/
66+
public void setMenuItemGroupingRule(@Nullable MenuItemGroupingRule groupingRule) {
67+
this.annotationCreationToolbar.setMenuItemGroupingRule(groupingRule);
68+
}
69+
5970
@Override
6071
public void onEnterAnnotationCreationMode(@NonNull AnnotationCreationController controller) {
6172
annotationCreationActive = true;

index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,11 @@ PSPDFKitView.propTypes = {
421421
*
422422
* @platform android
423423
*/
424-
fragmentTag: PropTypes.string
424+
fragmentTag: PropTypes.string,
425+
/**
426+
* menuItemGrouping: Can be used to specfiy a custom grouping for the menu items in the annotation creation toolbar.
427+
*/
428+
menuItemGrouping: PropTypes.array
425429
};
426430

427431
if (Platform.OS === "ios" || Platform.OS === "android") {

ios/RCTPSPDFKit.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
6572780C1D86AE7300A5E1A8 /* RCTConvert+PSPDFConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 657278071D86AE7300A5E1A8 /* RCTConvert+PSPDFConfiguration.m */; };
1212
657278111D86AEC600A5E1A8 /* RCTConvert+PSPDFDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 657278101D86AEC600A5E1A8 /* RCTConvert+PSPDFDocument.m */; };
1313
84545BA4210A5CCF00FBB0A7 /* RCTConvert+PSPDFAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 84545BA2210A5CCF00FBB0A7 /* RCTConvert+PSPDFAnnotation.m */; };
14+
B783BA3421C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = B783BA3321C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.m */; };
1415
F84F8B192032D54F00153D9E /* RCTPSPDFKitView.m in Sources */ = {isa = PBXBuildFile; fileRef = F84F8B182032D54F00153D9E /* RCTPSPDFKitView.m */; };
1516
F8C1A2E5202DCC9700E98192 /* RCTPSPDFKitViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8C1A2E4202DCC9700E98192 /* RCTPSPDFKitViewManager.m */; };
1617
/* End PBXBuildFile section */
@@ -37,6 +38,8 @@
3738
657278101D86AEC600A5E1A8 /* RCTConvert+PSPDFDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+PSPDFDocument.m"; sourceTree = "<group>"; };
3839
84545BA2210A5CCF00FBB0A7 /* RCTConvert+PSPDFAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+PSPDFAnnotation.m"; sourceTree = "<group>"; };
3940
84545BA3210A5CCF00FBB0A7 /* RCTConvert+PSPDFAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+PSPDFAnnotation.h"; sourceTree = "<group>"; };
41+
B783BA3221C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RCTConvert+PSPDFAnnotationToolbarConfiguration.h"; sourceTree = "<group>"; };
42+
B783BA3321C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+PSPDFAnnotationToolbarConfiguration.m"; sourceTree = "<group>"; };
4043
F84F8B182032D54F00153D9E /* RCTPSPDFKitView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPSPDFKitView.m; sourceTree = "<group>"; };
4144
F84F8B1A2032D55E00153D9E /* RCTPSPDFKitView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTPSPDFKitView.h; sourceTree = "<group>"; };
4245
F8C1A2E4202DCC9700E98192 /* RCTPSPDFKitViewManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTPSPDFKitViewManager.m; sourceTree = "<group>"; };
@@ -77,6 +80,8 @@
7780
657278071D86AE7300A5E1A8 /* RCTConvert+PSPDFConfiguration.m */,
7881
6572780F1D86AEC600A5E1A8 /* RCTConvert+PSPDFDocument.h */,
7982
657278101D86AEC600A5E1A8 /* RCTConvert+PSPDFDocument.m */,
83+
B783BA3221C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.h */,
84+
B783BA3321C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.m */,
8085
);
8186
path = Converters;
8287
sourceTree = "<group>";
@@ -161,6 +166,7 @@
161166
F8C1A2E5202DCC9700E98192 /* RCTPSPDFKitViewManager.m in Sources */,
162167
84545BA4210A5CCF00FBB0A7 /* RCTConvert+PSPDFAnnotation.m in Sources */,
163168
6540D1841D89D22E00B8F94F /* RCTPSPDFKitManager.m in Sources */,
169+
B783BA3421C3F55300FD981A /* RCTConvert+PSPDFAnnotationToolbarConfiguration.m in Sources */,
164170
F84F8B192032D54F00153D9E /* RCTPSPDFKitView.m in Sources */,
165171
6572780C1D86AE7300A5E1A8 /* RCTConvert+PSPDFConfiguration.m in Sources */,
166172
);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//
2+
// Copyright © 2018 PSPDFKit GmbH. All rights reserved.
3+
//
4+
// THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
5+
// AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
6+
// UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
7+
// This notice may not be removed from this file.
8+
//
9+
10+
#import <React/RCTConvert.h>
11+
@import PSPDFKit;
12+
@import PSPDFKitUI;
13+
14+
@interface RCTConvert (PSPDFAnnotationToolbarConfiguration)
15+
16+
+ (PSPDFAnnotationToolbarConfiguration *)PSPDFAnnotationToolbarConfiguration:(id)json;
17+
18+
@end
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
//
2+
// Copyright © 2018 PSPDFKit GmbH. All rights reserved.
3+
//
4+
// THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
5+
// AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
6+
// UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
7+
// This notice may not be removed from this file.
8+
//
9+
10+
#import "RCTConvert+PSPDFAnnotationToolbarConfiguration.h"
11+
12+
@implementation RCTConvert (PSPDFAnnotationToolbarConfiguration)
13+
14+
+ (PSPDFAnnotationToolbarConfiguration *)PSPDFAnnotationToolbarConfiguration:(id)json {
15+
NSArray *itemsToParse = [RCTConvert NSArray:json];
16+
NSMutableArray *parsedItems = [NSMutableArray arrayWithCapacity:itemsToParse.count];
17+
for (id itemToParse in itemsToParse) {
18+
if ([itemToParse isKindOfClass:[NSDictionary class]]) {
19+
NSDictionary *dict = itemToParse;
20+
NSArray *subArray = dict[@"items"];
21+
NSMutableArray *subItems = [NSMutableArray arrayWithCapacity:subArray.count];
22+
for (id subItem in subArray) {
23+
if (subItem) {
24+
PSPDFAnnotationString annotationString = [RCTConvert PSPDFAnnotationStringFromName:subItem];
25+
[subItems addObject:[PSPDFAnnotationGroupItem itemWithType:annotationString]];
26+
}
27+
}
28+
[parsedItems addObject:[PSPDFAnnotationGroup groupWithItems:subItems]];
29+
} else {
30+
PSPDFAnnotationString annotationString = [RCTConvert PSPDFAnnotationStringFromName:itemToParse];
31+
if (annotationString) {
32+
[parsedItems addObject:[PSPDFAnnotationGroup groupWithItems:@[[PSPDFAnnotationGroupItem itemWithType:annotationString]]]];
33+
}
34+
}
35+
}
36+
return [[PSPDFAnnotationToolbarConfiguration alloc] initWithAnnotationGroups:parsedItems];
37+
}
38+
39+
+ (PSPDFAnnotationString)PSPDFAnnotationStringFromName:(NSString *)name {
40+
41+
static NSDictionary *nameToAnnotationStringMapping;
42+
43+
static dispatch_once_t onceToken;
44+
dispatch_once(&onceToken, ^{
45+
NSMutableDictionary *mapping = [[NSMutableDictionary alloc] init];
46+
47+
[mapping setValue:PSPDFAnnotationStringLink forKeyPath:@"link"];
48+
[mapping setValue:PSPDFAnnotationStringHighlight forKeyPath:@"highlight"];
49+
[mapping setValue:PSPDFAnnotationMenuStrikeout forKeyPath:@"strikeout"];
50+
[mapping setValue:PSPDFAnnotationStringUnderline forKeyPath:@"underline"];
51+
[mapping setValue:PSPDFAnnotationMenuSquiggle forKeyPath:@"squiggly"];
52+
[mapping setValue:PSPDFAnnotationStringNote forKeyPath:@"note"];
53+
[mapping setValue:PSPDFAnnotationStringFreeText forKeyPath:@"freetext"];
54+
[mapping setValue:PSPDFAnnotationStringInk forKeyPath:@"ink"];
55+
[mapping setValue:PSPDFAnnotationStringSquare forKeyPath:@"square"];
56+
[mapping setValue:PSPDFAnnotationStringCircle forKeyPath:@"circle"];
57+
[mapping setValue:PSPDFAnnotationStringLine forKeyPath:@"line"];
58+
[mapping setValue:PSPDFAnnotationStringPolygon forKeyPath:@"polygon"];
59+
[mapping setValue:PSPDFAnnotationStringPolyLine forKeyPath:@"polyline"];
60+
[mapping setValue:PSPDFAnnotationStringSignature forKeyPath:@"signature"];
61+
[mapping setValue:PSPDFAnnotationStringStamp forKeyPath:@"stamp"];
62+
[mapping setValue:PSPDFAnnotationStringEraser forKeyPath:@"eraser"];
63+
[mapping setValue:PSPDFAnnotationStringSound forKeyPath:@"sound"];
64+
[mapping setValue:PSPDFAnnotationStringImage forKeyPath:@"image"];
65+
[mapping setValue:PSPDFAnnotationStringRedaction forKeyPath:@"redaction"];
66+
67+
nameToAnnotationStringMapping = [[NSDictionary alloc] initWithDictionary:mapping];
68+
});
69+
70+
return nameToAnnotationStringMapping[name];
71+
}
72+
73+
@end

0 commit comments

Comments
 (0)