OSDN Git Service

implement a function to change font on the glyph view, and add the HOME variable...
[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         [p setAutoenablesItems: NO];
26         int i = 0;
27         do {
28                 NSString* t = i == 0 ? @"default" : [nm objectAtIndex: i - 1];
29                 NSMenuItem* m = [[NSMenuItem alloc] init];
30                 [m setTitle: t];
31                 [m setAction: @selector(changeFont:)];
32                 [m setTarget: self];
33                 [m setEnabled: YES];
34                 [p addItem: m];
35         } while (nm != NULL && ++i <= [nm count]);
36         [menu setSubmenu: p];
37 }
38
39 - (void) awakeFromNib {
40         [self setupFontMenu];
41 }
42
43 - (NSDictionary*) genFontAttrDict: (NSString*) fontName size: (float) size {
44         NSFont* f = fontName == nil || [fontName isEqualToString: @"default"] ?
45                 [NSFont messageFontOfSize: size] : 
46                 [NSFont fontWithName: fontName size: size];
47
48         return [NSDictionary dictionaryWithObjectsAndKeys:
49                         f, NSFontAttributeName, nil];
50 }
51
52 - (void) drawOnGlyphView: (NSString*) s {
53         float dummy = 24.0;
54         
55         NSSize vsz = [glyphView bounds].size;
56         NSImage *m = [[NSImage alloc] initWithSize: vsz];
57         NSSize ssz = [s sizeWithAttributes: [self genFontAttrDict: currentFont size: dummy]];
58         float fsize = dummy * 
59                 (vsz.width >= vsz.height ? 1 / ssz.height * vsz.height :
60                  1 / ssz.width * vsz.width);
61         NSDictionary *attr = [self genFontAttrDict: currentFont size: fsize];
62         ssz = [s sizeWithAttributes: attr];
63         int margin = (vsz.width - ssz.width) / 2;
64         [m lockFocus];
65         [s drawAtPoint: NSMakePoint(margin, 0) withAttributes: attr];
66         [m unlockFocus];
67         [glyphView setImage: m];
68 }
69
70 - (NSRange) getTargetRangeFrom: (NSString*) text withLocation: (int) loc {
71         unichar ch = [text characterAtIndex: loc];
72         
73         int rlen = 0, llen = 0;
74         while (rlen <= 4 && [charUtil characterIsHexCharacter: ch]) {
75                 rlen++;
76                 if (loc + rlen >= [text length]) break;
77                 ch = [text characterAtIndex: loc + rlen];
78         }
79         if (rlen >= 1 && rlen < 5) {
80                 while (rlen + llen <= 4 && loc - llen > 0) {
81                         ch = [text characterAtIndex: loc - llen - 1];
82                         if (! [charUtil characterIsHexCharacter: ch]) break;
83                         llen++;
84                 }
85         }
86
87         return NSMakeRange(loc - llen, rlen + llen);
88 }
89
90 - (NSString*) getCharacterFrom: (NSString*) text withRange: (NSRange) range andLocation: (int) loc {
91         if (range.length >= 4) {
92                 return [charUtil getUnicharFromCharCode: [text substringWithRange: range]];
93         } else {
94                 unichar ch = [text characterAtIndex: range.location];
95                 BOOL high = [charUtil characterIsHighSurrogate: ch];
96                 BOOL low = [charUtil characterIsLowSurrogate: ch];
97                 int p = loc - (low ? 1 : 0);
98                 return [text substringWithRange: 
99                                 NSMakeRange(p < 0 ? 0 : loc, high || low ? 2 : 1)];
100         }
101 }
102
103 - (IBAction) search: (id) sender {
104         NSString *text = [searchField stringValue];
105         if ([text length] <=0) return;
106
107         NSText* editor = [searchField currentEditor];
108         NSRange r = [editor selectedRange];
109         int loc = r.location + r.length < [text length] ? r.location + r.length : 0;
110         NSRange tr = [self getTargetRangeFrom: text withLocation: loc];
111         NSString* ch = [self getCharacterFrom: text withRange: tr andLocation: loc];
112         
113         currentCharacter = ch;
114         [editor setSelectedRange: 
115          tr.length < 4 ? NSMakeRange(loc, [ch length]) : NSMakeRange(tr.location, tr.length)];
116
117         [self drawOnGlyphView: ch];
118
119         NSString* code = [charUtil getCharCodeFromUnichar: ch];
120         [codeField setStringValue: code];
121 }
122
123 - (IBAction) clickScriptButton: (id) sender {
124         int tag = [sender tag];
125         NSString* str = tag == 0 ? [codeField stringValue] : [nameField stringValue];
126         NSUInteger m = [NSEvent modifierFlags];
127         NSString* script = [NSString stringWithFormat: 
128                                                 @"script[%d]('%@', %d);", tag, str, m];
129         [engine evaluate: script];
130 }
131
132 - (IBAction) copyGlyphCharacter: (id) sender {
133         if (currentCharacter) {
134                 NSPasteboard* cb = [NSPasteboard generalPasteboard];
135                 [cb declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil];
136                 [cb setString: currentCharacter forType: NSStringPboardType];
137         }
138 }
139
140 - (IBAction) changeFont: (id) sender {
141         currentFont = [sender title];
142         if (currentCharacter != nil) {
143                 [self drawOnGlyphView: currentCharacter];
144         }
145 }
146
147 @end