OSDN Git Service

move functions about manipulating unicode (and surrogate pair) to new class
[sawarabi-fonts/sawarabi-fonts.git] / chartool / objective-c / Controller.m
1 //
2 //  Controller.m
3 //  chartool
4 //
5 //  Created by mshio on 11/02/05.
6 //  Copyright 2011 mshio. All rights reserved.
7 //
8 #include <stdio.h>
9 #import "Controller.h"
10
11 @implementation Controller
12
13 - (id) init {
14         currentCharacter = nil;
15         engine = [JavaScriptEngine instance];
16         charUtil = [UnicharUtil instance];
17         return [super init];
18 }
19
20 - (void) setupFontMenu {
21         NSArray* nm = [engine getFontsNameArray];
22         NSMenuItem* menu = [glyphViewMenu itemAtIndex: 1];
23         NSMenu* p = [[NSMenu alloc] init];
24         
25         for (int i = 0; i <= [nm count]; i++) {
26                 NSString* t = i == 0 ? @"default" : [nm objectAtIndex: i - 1];
27                 NSMenuItem* m = [[NSMenuItem alloc] init];
28                 [m setTitle: t];
29                 [p addItem: m];
30         }
31         [menu setSubmenu: p];
32 }
33
34 - (void) awakeFromNib {
35         [self setupFontMenu];
36 }
37
38 - (NSDictionary*) genFontAttrDict: (NSString*) fontName size: (float) size {
39         NSFont* f = fontName == nil || [fontName isEqualToString: @"default"] ?
40                 [NSFont messageFontOfSize: size] : 
41                 [NSFont fontWithName: fontName size: size];
42
43         return [NSDictionary dictionaryWithObjectsAndKeys:
44                         f, NSFontAttributeName, nil];
45 }
46
47 - (void) drawOnGlyphView: (NSString*) s {
48         float dummy = 24.0;
49         
50         NSSize vsz = [glyphView bounds].size;
51         NSImage *m = [[NSImage alloc] initWithSize: vsz];
52         NSSize ssz = [s sizeWithAttributes: [self genFontAttrDict: nil size: dummy]];
53         float fsize = dummy * 
54                 (vsz.width >= vsz.height ? 1 / ssz.height * vsz.height :
55                  1 / ssz.width * vsz.width);
56         NSDictionary *attr = [self genFontAttrDict: nil size: fsize];
57         ssz = [s sizeWithAttributes: attr];
58         int margin = (vsz.width - ssz.width) / 2;
59         [m lockFocus];
60         [s drawAtPoint: NSMakePoint(margin, 0) withAttributes: attr];
61         [m unlockFocus];
62         [glyphView setImage: m];
63 }
64
65 - (NSRange) getTargetRangeFrom: (NSString*) text withLocation: (int) loc {
66         unichar ch = [text characterAtIndex: loc];
67         
68         int rlen = 0, llen = 0;
69         while (rlen <= 4 && [charUtil characterIsHexCharacter: ch]) {
70                 rlen++;
71                 if (loc + rlen >= [text length]) break;
72                 ch = [text characterAtIndex: loc + rlen];
73         }
74         if (rlen >= 1 && rlen < 5) {
75                 while (rlen + llen <= 4 && loc - llen > 0) {
76                         ch = [text characterAtIndex: loc - llen - 1];
77                         if (! [charUtil characterIsHexCharacter: ch]) break;
78                         llen++;
79                 }
80         }
81
82         return NSMakeRange(loc - llen, rlen + llen);
83 }
84
85 - (NSString*) getCharacterFrom: (NSString*) text withRange: (NSRange) range andLocation: (int) loc {
86         if (range.length >= 4) {
87                 return [charUtil getUnicharFromCharCode: [text substringWithRange: range]];
88         } else {
89                 unichar ch = [text characterAtIndex: range.location];
90                 BOOL high = [charUtil characterIsHighSurrogate: ch];
91                 BOOL low = [charUtil characterIsLowSurrogate: ch];
92                 int p = loc - (low ? 1 : 0);
93                 return [text substringWithRange: 
94                                 NSMakeRange(p < 0 ? 0 : loc, high || low ? 2 : 1)];
95         }
96 }
97
98 - (IBAction) search: (id) sender {
99         NSString *text = [searchField stringValue];
100         if ([text length] <=0) return;
101
102         NSText* editor = [searchField currentEditor];
103         NSRange r = [editor selectedRange];
104         int loc = r.location + r.length < [text length] ? r.location + r.length : 0;
105         NSRange tr = [self getTargetRangeFrom: text withLocation: loc];
106         NSString* ch = [self getCharacterFrom: text withRange: tr andLocation: loc];
107         
108         currentCharacter = ch;
109         [editor setSelectedRange: 
110          tr.length < 4 ? NSMakeRange(loc, [ch length]) : NSMakeRange(tr.location, tr.length)];
111
112         [self drawOnGlyphView: ch];
113
114         NSString* code = [charUtil getCharCodeFromUnichar: ch];
115         [codeField setStringValue: code];
116 }
117
118 - (IBAction) clickScriptButton: (id) sender {
119 }
120
121 - (IBAction) copyGlyphCharacter: (id) sender {
122         if (currentCharacter) {
123                 NSPasteboard* cb = [NSPasteboard generalPasteboard];
124                 [cb declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil];
125                 [cb setString: currentCharacter forType: NSStringPboardType];
126         }
127 }
128
129 @end