KMAnnotationFontWindowController.m 19 KB

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