123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- //
- // KMAnnotationFontWindowController.m
- // SignFlow
- //
- // Created by wanjun on 2021/6/22.
- //
- #import "KMAnnotationFontWindowController.h"
- //#import "NSUserDefaults_SKExtensions.h"
- #import "NSFont_SKExtensions.h"
- @interface KMAnnotationFontWindowController ()
- @property (assign) IBOutlet NSBox *lineBox;
- @property (assign) IBOutlet NSTextField *fontLabel;
- @property (assign) IBOutlet NSComboBox *fontComboBox;
- @property (assign) IBOutlet NSTextField *fontWeightLabel;
- @property (assign) IBOutlet NSPopUpButton *fontWeightPopUpButton;
- @property (assign) IBOutlet NSTextField *fontSizeLabel;
- @property (assign) IBOutlet NSPopUpButton *fontSizePopUpButton;
- @property (assign) IBOutlet NSTextField *fontColorLabel;
- @property (assign) IBOutlet NSColorWell *fontColorWell;
- @property (assign) IBOutlet NSTextField *fontAdjacencyLabel;
- @property (assign) IBOutlet NSBox *fontAdjacencyBox;
- @property (assign) IBOutlet NSTextField *fontAdjacencyBoxLabel;
- @property (assign) IBOutlet NSStepper *fontAdjacencyStepper;
- @property (assign) IBOutlet NSTextField *rowHeightLabel;
- @property (assign) IBOutlet NSBox *rowHeightBox;
- @property (assign) IBOutlet NSTextField *rowHeightBoxLabel;
- @property (assign) IBOutlet NSStepper *rowHeightStepper;
- @property (assign) IBOutlet NSTextField *alignmentLabel;
- @property (assign) IBOutlet NSSegmentedControl *alignmentSegmentedControl;
- @property (assign) IBOutlet NSLayoutConstraint *fontAdjacencyLayoutConstraint;
- @property (assign) IBOutlet NSLayoutConstraint *rowHeightLayoutConstraint;
- @property (assign) IBOutlet NSLayoutConstraint *alignmenBottomConstraint;
- @property (nonatomic, retain) NSMutableArray*fonts;
- @end
- static KMAnnotationFontWindowController *sharedAnnotationFont = nil;
- @implementation KMAnnotationFontWindowController
- - (void)dealloc {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- + (id)sharedAnnotationFont {
- if (sharedAnnotationFont == nil)
- sharedAnnotationFont = [[self alloc] init];
- return sharedAnnotationFont;
- }
- - (id)init {
- self = [super initWithWindowNibName:@"KMAnnotationFontWindowController"];
- if (self) {
-
- }
- return self;
- }
- - (void)windowDidLoad {
- [super windowDidLoad];
-
- self.fonts = [CPDFAnnotationModel supportFonts];
-
- self.window.title = NSLocalizedString(@"Fonts", nil);
-
- self.fontLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Fonts", nil)];
- self.fontWeightLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Font Weight", nil)];
- self.fontSizeLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Font Size", nil)];
- self.fontColorLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Text Color", nil)];
- self.fontAdjacencyLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Font Adjacency", nil)];
- self.rowHeightLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Row Height", nil)];
- self.alignmentLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Alignment", nil)];
- if (@available(macOS 10.13, *)) {
- [self.alignmentSegmentedControl setToolTip:NSLocalizedString(@"Left Alignment", nil) forSegment:0];
- [self.alignmentSegmentedControl setToolTip:NSLocalizedString(@"Center", nil) forSegment:1];
- [self.alignmentSegmentedControl setToolTip:NSLocalizedString(@"Right Alignment", nil) forSegment:2];
- }
- [self.alignmentSegmentedControl.cell setControlTint:NSClearControlTint];
- self.fontAdjacencyStepper.hidden = YES;
- self.rowHeightStepper.hidden = YES;
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(alignmentTypeNotification:) name:@"KMAnnotationAlignmentTypeNotification" object:nil];
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fontTypeNotification:) name:@"KMAnnotationFontTypeNotification" object:nil];
- }
- #pragma mark - View Methods
- -(void)setAnnotationModel:(CPDFAnnotationModel *)annotationModel
- {
- if (_annotationModel != annotationModel) {
- _annotationModel = annotationModel;
- }
- [self reloadData];
- }
- - (void)reloadData {
- NSFont *notefont = [NSFont fontWithName:self.annotationModel.fontName size:self.annotationModel.fontSize];
- NSColor *noteColor = self.annotationModel.fontColor;
- if (noteColor) {
- CGFloat r, g, b, a = 0.0;
- [[noteColor colorUsingColorSpaceName:NSDeviceRGBColorSpace] getRed:&r green:&g blue:&b alpha:&a];
- noteColor = [NSColor colorWithRed:r green:g blue:b alpha:self.annotationModel.opacity];
- }
- if (CAnnotationTypeFreeText == self.annotationModel.annotationType ||
- CAnnotationTypeSignText == self.annotationModel.annotationType ||
- CAnnotationTypeSignDate == self.annotationModel.annotationType ||
- CAnnotationTypeTextField == self.annotationModel.annotationType) {
- if (self.annotationModel.alignment == NSTextAlignmentLeft) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftOtherSel"] forSegment:0];
- if (@available(macOS 11.0, *)) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftSel"] forSegment:0];
- }
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
- self.alignmentSegmentedControl.selectedSegment = 0;
- } else if (self.annotationModel.alignment == NSTextAlignmentCenter) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterOtherSel"] forSegment:1];
- if (@available(macOS 11.0, *)) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterSel"] forSegment:1];
- }
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
- self.alignmentSegmentedControl.selectedSegment = 1;
- } else if (self.annotationModel.alignment == NSTextAlignmentRight) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightOtherSel"] forSegment:2];
- if (@available(macOS 11.0, *)) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightSel"] forSegment:2];
- }
- self.alignmentSegmentedControl.selectedSegment = 2;
- } else if (self.annotationModel.alignment == NSTextAlignmentJustified) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
- self.alignmentSegmentedControl.selectedSegment = 3;
- }
- }
-
- [self.fontWeightPopUpButton removeAllItems];
- self.fontSizePopUpButton.title = [NSString stringWithFormat:@"%@ pt",@(notefont.pointSize)];
-
- NSDictionary * dic = nil;
- NSMutableArray * fontNames = [NSMutableArray array];
- for (NSUInteger i=0; i<self.fonts.count; i++) {
- NSDictionary *fontDic = self.fonts[i];
- NSString * fontName = fontDic.allKeys.firstObject?:@"Helvetica";
- NSString * family = [notefont.fontDescriptor objectForKey:NSFontFamilyAttribute];
- [fontNames addObject:fontName];
- if ([family isEqualToString:fontName]) {
- dic = fontDic;
- }
- }
- NSString * style = [notefont.fontDescriptor objectForKey:NSFontFaceAttribute];
- [self.fontComboBox removeAllItems];
- [self.fontComboBox addItemsWithObjectValues:fontNames];
-
- if (dic) {
- NSInteger selectedIndex = [self.fonts indexOfObject:dic];
- [self.fontComboBox selectItemAtIndex:selectedIndex];
- NSString * fontName = dic.allKeys.firstObject;
- NSInteger selectIndex = [self setFontStyleWithFontName:fontName currentStyle:style];
- if (selectIndex != -1) {
- [self.fontWeightPopUpButton selectItemAtIndex:selectIndex];
- } else {
- [self.fontWeightPopUpButton setTitle:@""];
- }
- } else{
- [self.fontWeightPopUpButton setTitle:@""];
- [self.fontWeightPopUpButton setTitle:@""];
- }
- self.fontColorWell.color = noteColor?:[NSColor clearColor];
- [[NSColorPanel sharedColorPanel] setTarget:self];
- [[NSColorPanel sharedColorPanel] setAction:nil];
-
- self.fontAdjacencyLayoutConstraint.constant = self.fontAdjacencyStepper.hidden ? -self.fontAdjacencyStepper.frame.size.height : 16.0;
- self.fontAdjacencyBox.hidden = self.fontAdjacencyStepper.hidden ? YES : NO;
- self.fontAdjacencyLabel.hidden = self.fontAdjacencyStepper.hidden ? YES : NO;
- self.rowHeightLayoutConstraint.constant = self.rowHeightStepper.hidden ? -self.rowHeightStepper.frame.size.height + 11.0 : 11.0;
- self.rowHeightBox.hidden = self.rowHeightStepper.hidden ? YES : NO;
- self.rowHeightLabel.hidden = self.rowHeightStepper.hidden ? YES : NO;
-
- if (CAnnotationTypeComboBox == self.annotationModel.annotationType || CAnnotationTypeListMenu == self.annotationModel.annotationType) {
- self.alignmentSegmentedControl.hidden = self.alignmentLabel.hidden = self.lineBox.hidden = YES;
-
- self.alignmenBottomConstraint.constant = 0;
- } else {
- self.alignmentSegmentedControl.hidden = self.lineBox.hidden = self.alignmentLabel.hidden = NO;
- self.alignmenBottomConstraint.constant = 46;
- }
- }
- #pragma mark - private
- -(NSUInteger)setFontStyleWithFontName:(NSString *)fontName currentStyle:(NSString *)style
- {
- NSUInteger selectIndex = -1;
- NSMenu *menu = [[NSMenu alloc] init];
- for (NSDictionary *dic in self.fonts) {
- NSString *familyString = dic.allKeys.firstObject;
- if ([familyString isEqual:fontName]) {
- NSArray *styles = [dic objectForKey:fontName];
- for (NSUInteger i = 0; i < styles.count; i++) {
- NSString * styleName = [styles objectAtIndex:i];
- if ([style isEqualToString:styleName]) {
- selectIndex = i;
- }
- NSFontDescriptor *attributeFontDescriptor = [NSFontDescriptor fontDescriptorWithFontAttributes:@{NSFontFamilyAttribute:fontName,NSFontFaceAttribute:styleName}];
- NSFont *font = [NSFont fontWithDescriptor:attributeFontDescriptor size:12.0];
- NSDictionary *attrited = @{NSFontAttributeName:font};
- NSAttributedString *string = [[NSAttributedString alloc] initWithString:styleName attributes:attrited];
- NSMenuItem *item = [[NSMenuItem alloc] init];
- item.attributedTitle = string;
-
- [menu addItem:item];
- }
- break;
- }
- }
- if (!style) {
- selectIndex = 0;
- }
- [self.fontWeightPopUpButton setMenu:menu];
-
- return selectIndex;
- }
- #pragma mark - Action
- - (IBAction)fontComboBoxAction:(NSComboBox *)sender {
- NSInteger selectItem = [self.fontComboBox indexOfSelectedItem];
- NSString * familyString = [self.fontComboBox itemObjectValueAtIndex:selectItem];
- NSInteger selectIndex = [self setFontStyleWithFontName:familyString currentStyle:nil];
- NSString * styleString = self.fontWeightPopUpButton.selectedItem.title;
- if (selectIndex != -1) {
- [self.fontWeightPopUpButton selectItemAtIndex:selectIndex];
- }
-
- if (self.annotationFreeText) {
- [self.annotationFreeText setFont:[NSFont fontWithName:[NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]] size:self.annotationFreeText.font.pointSize]];
- } else {
- self.annotationModel.fontName = [NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]];
- }
- if (self.annotationCallback) {
- self.annotationCallback(self.annotationModel.annotation);
- }
- }
- - (IBAction)fontSizeComboBoxAction:(NSPopUpButton *)sender
- {
- CGFloat fontSize = [[self.fontSizePopUpButton.title stringByReplacingOccurrencesOfString:@" pt" withString:@""] floatValue];
- if (self.annotationFreeText) {
- [self.annotationFreeText setFont:[NSFont fontWithName:self.annotationFreeText.font.fontName size:fontSize]];
- } else {
- self.annotationModel.fontSize = fontSize;
- }
- if (self.annotationCallback) {
- self.annotationCallback(self.annotationModel.annotation);
- }
- }
- //字重 NSFontWeight
- - (IBAction)fontStylePopUpButtonAction:(NSPopUpButton *)sender {
- NSString * styleString = self.fontWeightPopUpButton.selectedItem.title;
- NSFont *font = [NSFont fontWithName:self.annotationModel.fontName size:self.annotationModel.fontSize];
- NSString * familyString = [font.fontDescriptor objectForKey:NSFontFamilyAttribute];
- if (self.annotationFreeText) {
- [self.annotationFreeText setFont:[NSFont fontWithName:[NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]] size:self.annotationFreeText.font.pointSize]];
- } else {
- self.annotationModel.fontName = [NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]];
- }
- if (self.annotationCallback) {
- self.annotationCallback(self.annotationModel.annotation);
- }
- }
- - (IBAction)fontColorWellAction:(NSColorWell *)sender {
-
- NSColor *currentColor = sender.color;
- CGFloat r, g, b, a = 0.0;
- [[currentColor colorUsingColorSpaceName:NSDeviceRGBColorSpace] getRed:&r green:&g blue:&b alpha:&a];
- if (self.annotationFreeText) {
- if (fabs(a - 0) < 0.001) {
- //设置透明色必须要设一个颜色值
- self.annotationFreeText.fontColor = [NSColor blackColor];
- self.annotationFreeText.opacity = 0;
- } else {
- self.annotationFreeText.fontColor = currentColor;
- self.annotationFreeText.opacity = a;
- }
- } else {
- if (fabs(a - 0) < 0.001) {
- //设置透明色必须要设一个颜色值
- self.annotationModel.fontColor = [NSColor blackColor];
- self.annotationModel.opacity = 0;
- } else {
- self.annotationModel.fontColor = currentColor;
- self.annotationModel.opacity = a;
- }
- }
- if (self.annotationCallback) {
- self.annotationCallback(self.annotationModel.annotation);
- }
- }
- - (IBAction)alignButtonAction:(NSSegmentedControl *)sender {
- NSInteger alignCount = [self reloadSegmentControlImage:sender.selectedSegment];
- if (self.annotationFreeText) {
- self.annotationFreeText.alignment = alignCount;
- }
- if (self.annotationAlignCallback) {
- self.annotationAlignCallback(alignCount);
- }
- }
- - (NSInteger)reloadSegmentControlImage:(NSInteger)selectedIndex {
- NSInteger alignCount = 0;
- switch (selectedIndex) {
- case 0:
- alignCount = 0;
- self.annotationModel.alignment = NSTextAlignmentLeft;
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftOtherSel"] forSegment:0];
- if (@available(macOS 11.0, *)) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftSel"] forSegment:0];
- }
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignJustifyNor"] forSegment:3];
- break;
- case 1:
- alignCount = 2;
- self.annotationModel.alignment = NSTextAlignmentCenter;
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterOtherSel"] forSegment:1];
- if (@available(macOS 11.0, *)) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterSel"] forSegment:1];
- }
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignJustifyNor"] forSegment:3];
- break;
- case 2:
- alignCount = 1;
- self.annotationModel.alignment = NSTextAlignmentRight;
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightOtherSel"] forSegment:2];
- if (@available(macOS 11.0, *)) {
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightSel"] forSegment:2];
- }
- [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignJustifyNor"] forSegment:3];
- break;
- default:
- break;
- }
- return alignCount;
- }
- #pragma mark - notification
- - (void)alignmentTypeNotification:(NSNotification *)notification {
- NSString *count = notification.object;
-
- if ([count isEqualToString:@"0"]) {
- self.alignmentSegmentedControl.selectedSegment = 0;
-
- } else if ([count isEqualToString:@"1"]) {
- self.alignmentSegmentedControl.selectedSegment = 2;
- } else if ([count isEqualToString:@"2"]) {
- self.alignmentSegmentedControl.selectedSegment = 1;
- }
- [self reloadSegmentControlImage:self.alignmentSegmentedControl.selectedSegment];
- }
- - (void)fontTypeNotification:(NSNotification *)notification
- {
- if (notification.object == self.PDFListView) {
- [self reloadData];
- }
- }
- @end
|