KMAnnotationFontWindowController.m 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. //
  2. // KMAnnotationFontWindowController.m
  3. // SignFlow
  4. //
  5. // Created by wanjun on 2021/6/22.
  6. //
  7. #import "KMAnnotationFontWindowController.h"
  8. //#import "NSUserDefaults_SKExtensions.h"
  9. #import "NSFont_SKExtensions.h"
  10. @interface KMAnnotationFontWindowController ()
  11. @property (assign) IBOutlet NSBox *lineBox;
  12. @property (assign) IBOutlet NSTextField *fontLabel;
  13. @property (assign) IBOutlet NSComboBox *fontComboBox;
  14. @property (assign) IBOutlet NSTextField *fontWeightLabel;
  15. @property (assign) IBOutlet NSPopUpButton *fontWeightPopUpButton;
  16. @property (assign) IBOutlet NSTextField *fontSizeLabel;
  17. @property (assign) IBOutlet NSPopUpButton *fontSizePopUpButton;
  18. @property (assign) IBOutlet NSTextField *fontColorLabel;
  19. @property (assign) IBOutlet NSColorWell *fontColorWell;
  20. @property (assign) IBOutlet NSTextField *fontAdjacencyLabel;
  21. @property (assign) IBOutlet NSBox *fontAdjacencyBox;
  22. @property (assign) IBOutlet NSTextField *fontAdjacencyBoxLabel;
  23. @property (assign) IBOutlet NSStepper *fontAdjacencyStepper;
  24. @property (assign) IBOutlet NSTextField *rowHeightLabel;
  25. @property (assign) IBOutlet NSBox *rowHeightBox;
  26. @property (assign) IBOutlet NSTextField *rowHeightBoxLabel;
  27. @property (assign) IBOutlet NSStepper *rowHeightStepper;
  28. @property (assign) IBOutlet NSTextField *alignmentLabel;
  29. @property (assign) IBOutlet NSSegmentedControl *alignmentSegmentedControl;
  30. @property (assign) IBOutlet NSLayoutConstraint *fontAdjacencyLayoutConstraint;
  31. @property (assign) IBOutlet NSLayoutConstraint *rowHeightLayoutConstraint;
  32. @property (assign) IBOutlet NSLayoutConstraint *alignmenBottomConstraint;
  33. @property (nonatomic, retain) NSMutableArray*fonts;
  34. @end
  35. static KMAnnotationFontWindowController *sharedAnnotationFont = nil;
  36. @implementation KMAnnotationFontWindowController
  37. - (void)dealloc {
  38. [[NSNotificationCenter defaultCenter] removeObserver:self];
  39. }
  40. + (id)sharedAnnotationFont {
  41. if (sharedAnnotationFont == nil)
  42. sharedAnnotationFont = [[self alloc] init];
  43. return sharedAnnotationFont;
  44. }
  45. - (id)init {
  46. self = [super initWithWindowNibName:@"KMAnnotationFontWindowController"];
  47. if (self) {
  48. }
  49. return self;
  50. }
  51. - (void)windowDidLoad {
  52. [super windowDidLoad];
  53. self.fonts = [CPDFAnnotationModel supportFonts];
  54. self.window.title = NSLocalizedString(@"Fonts", nil);
  55. self.fontLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Fonts", nil)];
  56. self.fontWeightLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Font Weight", nil)];
  57. self.fontSizeLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Font Size", nil)];
  58. self.fontColorLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Text Color", nil)];
  59. self.fontAdjacencyLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Font Adjacency", nil)];
  60. self.rowHeightLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Row Height", nil)];
  61. self.alignmentLabel.stringValue = [NSString stringWithFormat:@"%@:",NSLocalizedString(@"Alignment", nil)];
  62. if (@available(macOS 10.13, *)) {
  63. [self.alignmentSegmentedControl setToolTip:NSLocalizedString(@"Left Alignment", nil) forSegment:0];
  64. [self.alignmentSegmentedControl setToolTip:NSLocalizedString(@"Center", nil) forSegment:1];
  65. [self.alignmentSegmentedControl setToolTip:NSLocalizedString(@"Right Alignment", nil) forSegment:2];
  66. }
  67. [self.alignmentSegmentedControl.cell setControlTint:NSClearControlTint];
  68. self.fontAdjacencyStepper.hidden = YES;
  69. self.rowHeightStepper.hidden = YES;
  70. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(alignmentTypeNotification:) name:@"KMAnnotationAlignmentTypeNotification" object:nil];
  71. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fontTypeNotification:) name:@"KMAnnotationFontTypeNotification" object:nil];
  72. }
  73. #pragma mark - View Methods
  74. -(void)setAnnotationModel:(CPDFAnnotationModel *)annotationModel
  75. {
  76. if (_annotationModel != annotationModel) {
  77. _annotationModel = annotationModel;
  78. }
  79. [self reloadData];
  80. }
  81. - (void)reloadData {
  82. NSFont *notefont = [NSFont fontWithName:self.annotationModel.fontName size:self.annotationModel.fontSize];
  83. NSColor *noteColor = self.annotationModel.fontColor;
  84. if (noteColor) {
  85. CGFloat r, g, b, a = 0.0;
  86. [[noteColor colorUsingColorSpaceName:NSDeviceRGBColorSpace] getRed:&r green:&g blue:&b alpha:&a];
  87. noteColor = [NSColor colorWithRed:r green:g blue:b alpha:self.annotationModel.opacity];
  88. }
  89. if (CAnnotationTypeFreeText == self.annotationModel.annotationType ||
  90. CAnnotationTypeSignText == self.annotationModel.annotationType ||
  91. CAnnotationTypeSignDate == self.annotationModel.annotationType ||
  92. CAnnotationTypeTextField == self.annotationModel.annotationType) {
  93. if (self.annotationModel.alignment == NSTextAlignmentLeft) {
  94. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftOtherSel"] forSegment:0];
  95. if (@available(macOS 11.0, *)) {
  96. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftSel"] forSegment:0];
  97. }
  98. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
  99. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
  100. self.alignmentSegmentedControl.selectedSegment = 0;
  101. } else if (self.annotationModel.alignment == NSTextAlignmentCenter) {
  102. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
  103. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterOtherSel"] forSegment:1];
  104. if (@available(macOS 11.0, *)) {
  105. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterSel"] forSegment:1];
  106. }
  107. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
  108. self.alignmentSegmentedControl.selectedSegment = 1;
  109. } else if (self.annotationModel.alignment == NSTextAlignmentRight) {
  110. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
  111. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
  112. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightOtherSel"] forSegment:2];
  113. if (@available(macOS 11.0, *)) {
  114. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightSel"] forSegment:2];
  115. }
  116. self.alignmentSegmentedControl.selectedSegment = 2;
  117. } else if (self.annotationModel.alignment == NSTextAlignmentJustified) {
  118. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
  119. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
  120. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
  121. self.alignmentSegmentedControl.selectedSegment = 3;
  122. }
  123. }
  124. [self.fontWeightPopUpButton removeAllItems];
  125. self.fontSizePopUpButton.title = [NSString stringWithFormat:@"%@ pt",@(notefont.pointSize)];
  126. NSDictionary * dic = nil;
  127. NSMutableArray * fontNames = [NSMutableArray array];
  128. for (NSUInteger i=0; i<self.fonts.count; i++) {
  129. NSDictionary *fontDic = self.fonts[i];
  130. NSString * fontName = fontDic.allKeys.firstObject?:@"Helvetica";
  131. NSString * family = [notefont.fontDescriptor objectForKey:NSFontFamilyAttribute];
  132. [fontNames addObject:fontName];
  133. if ([family isEqualToString:fontName]) {
  134. dic = fontDic;
  135. }
  136. }
  137. NSString * style = [notefont.fontDescriptor objectForKey:NSFontFaceAttribute];
  138. [self.fontComboBox removeAllItems];
  139. [self.fontComboBox addItemsWithObjectValues:fontNames];
  140. if (dic) {
  141. NSInteger selectedIndex = [self.fonts indexOfObject:dic];
  142. [self.fontComboBox selectItemAtIndex:selectedIndex];
  143. NSString * fontName = dic.allKeys.firstObject;
  144. NSInteger selectIndex = [self setFontStyleWithFontName:fontName currentStyle:style];
  145. if (selectIndex != -1) {
  146. [self.fontWeightPopUpButton selectItemAtIndex:selectIndex];
  147. } else {
  148. [self.fontWeightPopUpButton setTitle:@""];
  149. }
  150. } else{
  151. [self.fontWeightPopUpButton setTitle:@""];
  152. [self.fontWeightPopUpButton setTitle:@""];
  153. }
  154. self.fontColorWell.color = noteColor?:[NSColor clearColor];
  155. [[NSColorPanel sharedColorPanel] setTarget:self];
  156. [[NSColorPanel sharedColorPanel] setAction:nil];
  157. self.fontAdjacencyLayoutConstraint.constant = self.fontAdjacencyStepper.hidden ? -self.fontAdjacencyStepper.frame.size.height : 16.0;
  158. self.fontAdjacencyBox.hidden = self.fontAdjacencyStepper.hidden ? YES : NO;
  159. self.fontAdjacencyLabel.hidden = self.fontAdjacencyStepper.hidden ? YES : NO;
  160. self.rowHeightLayoutConstraint.constant = self.rowHeightStepper.hidden ? -self.rowHeightStepper.frame.size.height + 11.0 : 11.0;
  161. self.rowHeightBox.hidden = self.rowHeightStepper.hidden ? YES : NO;
  162. self.rowHeightLabel.hidden = self.rowHeightStepper.hidden ? YES : NO;
  163. if (CAnnotationTypeComboBox == self.annotationModel.annotationType || CAnnotationTypeListMenu == self.annotationModel.annotationType) {
  164. self.alignmentSegmentedControl.hidden = self.alignmentLabel.hidden = self.lineBox.hidden = YES;
  165. self.alignmenBottomConstraint.constant = 0;
  166. } else {
  167. self.alignmentSegmentedControl.hidden = self.lineBox.hidden = self.alignmentLabel.hidden = NO;
  168. self.alignmenBottomConstraint.constant = 46;
  169. }
  170. }
  171. #pragma mark - private
  172. -(NSUInteger)setFontStyleWithFontName:(NSString *)fontName currentStyle:(NSString *)style
  173. {
  174. NSUInteger selectIndex = -1;
  175. NSMenu *menu = [[NSMenu alloc] init];
  176. for (NSDictionary *dic in self.fonts) {
  177. NSString *familyString = dic.allKeys.firstObject;
  178. if ([familyString isEqual:fontName]) {
  179. NSArray *styles = [dic objectForKey:fontName];
  180. for (NSUInteger i = 0; i < styles.count; i++) {
  181. NSString * styleName = [styles objectAtIndex:i];
  182. if ([style isEqualToString:styleName]) {
  183. selectIndex = i;
  184. }
  185. NSFontDescriptor *attributeFontDescriptor = [NSFontDescriptor fontDescriptorWithFontAttributes:@{NSFontFamilyAttribute:fontName,NSFontFaceAttribute:styleName}];
  186. NSFont *font = [NSFont fontWithDescriptor:attributeFontDescriptor size:12.0];
  187. NSDictionary *attrited = @{NSFontAttributeName:font};
  188. NSAttributedString *string = [[NSAttributedString alloc] initWithString:styleName attributes:attrited];
  189. NSMenuItem *item = [[NSMenuItem alloc] init];
  190. item.attributedTitle = string;
  191. [menu addItem:item];
  192. }
  193. break;
  194. }
  195. }
  196. if (!style) {
  197. selectIndex = 0;
  198. }
  199. [self.fontWeightPopUpButton setMenu:menu];
  200. return selectIndex;
  201. }
  202. #pragma mark - Action
  203. - (IBAction)fontComboBoxAction:(NSComboBox *)sender {
  204. NSInteger selectItem = [self.fontComboBox indexOfSelectedItem];
  205. NSString * familyString = [self.fontComboBox itemObjectValueAtIndex:selectItem];
  206. NSInteger selectIndex = [self setFontStyleWithFontName:familyString currentStyle:nil];
  207. NSString * styleString = self.fontWeightPopUpButton.selectedItem.title;
  208. if (selectIndex != -1) {
  209. [self.fontWeightPopUpButton selectItemAtIndex:selectIndex];
  210. }
  211. if (self.annotationFreeText) {
  212. [self.annotationFreeText setFont:[NSFont fontWithName:[NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]] size:self.annotationFreeText.font.pointSize]];
  213. } else {
  214. self.annotationModel.fontName = [NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]];
  215. }
  216. if (self.annotationCallback) {
  217. self.annotationCallback(self.annotationModel.annotation);
  218. }
  219. }
  220. - (IBAction)fontSizeComboBoxAction:(NSPopUpButton *)sender
  221. {
  222. CGFloat fontSize = [[self.fontSizePopUpButton.title stringByReplacingOccurrencesOfString:@" pt" withString:@""] floatValue];
  223. if (self.annotationFreeText) {
  224. [self.annotationFreeText setFont:[NSFont fontWithName:self.annotationFreeText.font.fontName size:fontSize]];
  225. } else {
  226. self.annotationModel.fontSize = fontSize;
  227. }
  228. if (self.annotationCallback) {
  229. self.annotationCallback(self.annotationModel.annotation);
  230. }
  231. }
  232. //字重 NSFontWeight
  233. - (IBAction)fontStylePopUpButtonAction:(NSPopUpButton *)sender {
  234. NSString * styleString = self.fontWeightPopUpButton.selectedItem.title;
  235. NSFont *font = [NSFont fontWithName:self.annotationModel.fontName size:self.annotationModel.fontSize];
  236. NSString * familyString = [font.fontDescriptor objectForKey:NSFontFamilyAttribute];
  237. if (self.annotationFreeText) {
  238. [self.annotationFreeText setFont:[NSFont fontWithName:[NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]] size:self.annotationFreeText.font.pointSize]];
  239. } else {
  240. self.annotationModel.fontName = [NSString stringWithFormat:@"%@-%@",familyString,[styleString stringByReplacingOccurrencesOfString:@" " withString:@""]];
  241. }
  242. if (self.annotationCallback) {
  243. self.annotationCallback(self.annotationModel.annotation);
  244. }
  245. }
  246. - (IBAction)fontColorWellAction:(NSColorWell *)sender {
  247. NSColor *currentColor = sender.color;
  248. CGFloat r, g, b, a = 0.0;
  249. [[currentColor colorUsingColorSpaceName:NSDeviceRGBColorSpace] getRed:&r green:&g blue:&b alpha:&a];
  250. if (self.annotationFreeText) {
  251. if (fabs(a - 0) < 0.001) {
  252. //设置透明色必须要设一个颜色值
  253. self.annotationFreeText.fontColor = [NSColor blackColor];
  254. self.annotationFreeText.opacity = 0;
  255. } else {
  256. self.annotationFreeText.fontColor = currentColor;
  257. self.annotationFreeText.opacity = a;
  258. }
  259. } else {
  260. if (fabs(a - 0) < 0.001) {
  261. //设置透明色必须要设一个颜色值
  262. self.annotationModel.fontColor = [NSColor blackColor];
  263. self.annotationModel.opacity = 0;
  264. } else {
  265. self.annotationModel.fontColor = currentColor;
  266. self.annotationModel.opacity = a;
  267. }
  268. }
  269. if (self.annotationCallback) {
  270. self.annotationCallback(self.annotationModel.annotation);
  271. }
  272. }
  273. - (IBAction)alignButtonAction:(NSSegmentedControl *)sender {
  274. NSInteger alignCount = [self reloadSegmentControlImage:sender.selectedSegment];
  275. if (self.annotationFreeText) {
  276. self.annotationFreeText.alignment = alignCount;
  277. }
  278. if (self.annotationAlignCallback) {
  279. self.annotationAlignCallback(alignCount);
  280. }
  281. }
  282. - (NSInteger)reloadSegmentControlImage:(NSInteger)selectedIndex {
  283. NSInteger alignCount = 0;
  284. switch (selectedIndex) {
  285. case 0:
  286. alignCount = 0;
  287. self.annotationModel.alignment = NSTextAlignmentLeft;
  288. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftOtherSel"] forSegment:0];
  289. if (@available(macOS 11.0, *)) {
  290. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftSel"] forSegment:0];
  291. }
  292. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
  293. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
  294. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignJustifyNor"] forSegment:3];
  295. break;
  296. case 1:
  297. alignCount = 2;
  298. self.annotationModel.alignment = NSTextAlignmentCenter;
  299. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
  300. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterOtherSel"] forSegment:1];
  301. if (@available(macOS 11.0, *)) {
  302. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterSel"] forSegment:1];
  303. }
  304. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightNor"] forSegment:2];
  305. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignJustifyNor"] forSegment:3];
  306. break;
  307. case 2:
  308. alignCount = 1;
  309. self.annotationModel.alignment = NSTextAlignmentRight;
  310. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignLeftNor"] forSegment:0];
  311. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignCenterNor"] forSegment:1];
  312. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightOtherSel"] forSegment:2];
  313. if (@available(macOS 11.0, *)) {
  314. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignRightSel"] forSegment:2];
  315. }
  316. [self.alignmentSegmentedControl setImage:[NSImage imageNamed:@"KMImageNamePropertybarTextalignJustifyNor"] forSegment:3];
  317. break;
  318. default:
  319. break;
  320. }
  321. return alignCount;
  322. }
  323. #pragma mark - notification
  324. - (void)alignmentTypeNotification:(NSNotification *)notification {
  325. NSString *count = notification.object;
  326. if ([count isEqualToString:@"0"]) {
  327. self.alignmentSegmentedControl.selectedSegment = 0;
  328. } else if ([count isEqualToString:@"1"]) {
  329. self.alignmentSegmentedControl.selectedSegment = 2;
  330. } else if ([count isEqualToString:@"2"]) {
  331. self.alignmentSegmentedControl.selectedSegment = 1;
  332. }
  333. [self reloadSegmentControlImage:self.alignmentSegmentedControl.selectedSegment];
  334. }
  335. - (void)fontTypeNotification:(NSNotification *)notification
  336. {
  337. if (notification.object == self.PDFListView) {
  338. [self reloadData];
  339. }
  340. }
  341. @end