Cleans-up InputMethodController.mm.
This commit is contained in:
parent
a230705bbd
commit
c9d0378cd5
|
@ -94,6 +94,7 @@ SimpleLM LTLanguageModel;
|
||||||
|
|
||||||
- (void)_performDeferredSaveUserCandidatesDictionary;
|
- (void)_performDeferredSaveUserCandidatesDictionary;
|
||||||
- (void)saveUserCandidatesDictionary;
|
- (void)saveUserCandidatesDictionary;
|
||||||
|
- (void)_showCandidateWindowUsingVerticalMode:(BOOL)useVerticalMode client:(id)client;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// sort helper
|
// sort helper
|
||||||
|
@ -195,14 +196,7 @@ public:
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark IMKStateSetting protocol methods
|
#pragma mark - IMKStateSetting protocol methods
|
||||||
|
|
||||||
- (void)showPreferences:(id)sender
|
|
||||||
{
|
|
||||||
// show the preferences panel, and also make the IME app itself the focus
|
|
||||||
[super showPreferences:sender];
|
|
||||||
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)activateServer:(id)client
|
- (void)activateServer:(id)client
|
||||||
{
|
{
|
||||||
|
@ -270,6 +264,8 @@ public:
|
||||||
_currentCandidateClient = nil;
|
_currentCandidateClient = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - IMKServerInput protocol methods
|
||||||
|
|
||||||
- (void)commitComposition:(id)client
|
- (void)commitComposition:(id)client
|
||||||
{
|
{
|
||||||
// if it's Terminal, we don't commit at the first call (the client of which will not be IPMDServerClientWrapper)
|
// if it's Terminal, we don't commit at the first call (the client of which will not be IPMDServerClientWrapper)
|
||||||
|
@ -422,42 +418,6 @@ public:
|
||||||
NSBeep();
|
NSBeep();
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_showCandidateWindowUsingVerticalMode:(BOOL)useVerticalMode client:(id)client
|
|
||||||
{
|
|
||||||
// candidate
|
|
||||||
[LTSharedCandidates setDismissesAutomatically:YES];
|
|
||||||
|
|
||||||
// wrap NSNumber; we only allow number keys 1-9 as selection keys in this project
|
|
||||||
#define LTUIntObj(x) ([NSNumber numberWithInteger:x])
|
|
||||||
[LTSharedCandidates setSelectionKeys:[NSArray arrayWithObjects:LTUIntObj(18), LTUIntObj(19), LTUIntObj(20), LTUIntObj(21), LTUIntObj(23), LTUIntObj(22), LTUIntObj(26), LTUIntObj(28), LTUIntObj(25), nil]];
|
|
||||||
#undef LTUIntObj
|
|
||||||
|
|
||||||
// set the candidate panel style
|
|
||||||
BOOL useHorizontalCandidateList = [[NSUserDefaults standardUserDefaults] boolForKey:kUseHorizontalCandidateListPreferenceKey];
|
|
||||||
|
|
||||||
if (useVerticalMode) {
|
|
||||||
[LTSharedCandidates setPanelType:kIMKSingleColumnScrollingCandidatePanel];
|
|
||||||
}
|
|
||||||
else if (useHorizontalCandidateList) {
|
|
||||||
[LTSharedCandidates setPanelType:kIMKSingleRowSteppingCandidatePanel];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
[LTSharedCandidates setPanelType:kIMKSingleColumnScrollingCandidatePanel];
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the attributes for the candidate panel (which uses NSAttributedString)
|
|
||||||
NSInteger textSize = [[NSUserDefaults standardUserDefaults] integerForKey:kCandidateListTextSizeKey];
|
|
||||||
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSFont systemFontOfSize:textSize], NSFontAttributeName, nil];
|
|
||||||
[LTSharedCandidates setAttributes:attributes];
|
|
||||||
|
|
||||||
[LTSharedCandidates updateCandidates];
|
|
||||||
[LTSharedCandidates show:useVerticalMode ? kIMKLocateCandidatesLeftHint : kIMKLocateCandidatesBelowHint];
|
|
||||||
|
|
||||||
// update the composing text, set the client
|
|
||||||
[self updateClientComposingBuffer:client];
|
|
||||||
_currentCandidateClient = client;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)inputText:(NSString*)inputText key:(NSInteger)keyCode modifiers:(NSUInteger)flags client:(id)client
|
- (BOOL)inputText:(NSString*)inputText key:(NSInteger)keyCode modifiers:(NSUInteger)flags client:(id)client
|
||||||
{
|
{
|
||||||
NSRect textFrame = NSZeroRect;
|
NSRect textFrame = NSZeroRect;
|
||||||
|
@ -790,6 +750,69 @@ public:
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)candidateSelected:(NSAttributedString *)candidateString
|
||||||
|
{
|
||||||
|
// candidate selected, override the node with selection
|
||||||
|
|
||||||
|
string selectedValue;
|
||||||
|
|
||||||
|
if ([candidateString isKindOfClass:[NSString class]]) {
|
||||||
|
selectedValue = [(NSString *)candidateString UTF8String];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
selectedValue = [[candidateString string] UTF8String];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] boolForKey:kDisableUserCandidateSelectionLearning]) {
|
||||||
|
NSString *trigram = [self neighborTrigramString];
|
||||||
|
NSString *selectedNSString = [NSString stringWithUTF8String:selectedValue.c_str()];
|
||||||
|
[TLCandidateLearningDictionary setObject:selectedNSString forKey:trigram];
|
||||||
|
[self saveUserCandidatesDictionary];
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t cursorIndex = [self actualCandidateCursorIndex];
|
||||||
|
vector<NodeAnchor> nodes = _builder->grid().nodesCrossingOrEndingAt(cursorIndex);
|
||||||
|
|
||||||
|
for (vector<NodeAnchor>::iterator ni = nodes.begin(), ne = nodes.end(); ni != ne; ++ni) {
|
||||||
|
const vector<KeyValuePair>& candidates = (*ni).node->candidates();
|
||||||
|
|
||||||
|
for (size_t i = 0, c = candidates.size(); i < c; ++i) {
|
||||||
|
if (candidates[i].value == selectedValue) {
|
||||||
|
// found our node
|
||||||
|
const_cast<Node*>((*ni).node)->selectCandidateAtIndex(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[self walk];
|
||||||
|
[self updateClientComposingBuffer:_currentCandidateClient];
|
||||||
|
_currentCandidateClient = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Private methods
|
||||||
|
|
||||||
|
- (size_t)actualCandidateCursorIndex
|
||||||
|
{
|
||||||
|
size_t cursorIndex = _builder->cursorIndex();
|
||||||
|
|
||||||
|
BOOL candidatePhraseLocatedAfterCursor = [[NSUserDefaults standardUserDefaults] boolForKey:kSelectPhraseAfterCursorAsCandidatePreferenceKey];
|
||||||
|
|
||||||
|
if (candidatePhraseLocatedAfterCursor) {
|
||||||
|
// MS Phonetics IME style, phrase is *after* the cursor, i.e. cursor is always *before* the phrase
|
||||||
|
if (cursorIndex < _builder->length()) {
|
||||||
|
++cursorIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!cursorIndex) {
|
||||||
|
++cursorIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cursorIndex;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSString *)neighborTrigramString
|
- (NSString *)neighborTrigramString
|
||||||
{
|
{
|
||||||
// gather the "trigram" for user candidate selection learning
|
// gather the "trigram" for user candidate selection learning
|
||||||
|
@ -845,69 +868,6 @@ public:
|
||||||
return [termArray componentsJoinedByString:@"-"];
|
return [termArray componentsJoinedByString:@"-"];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)candidateSelected:(NSAttributedString *)candidateString
|
|
||||||
{
|
|
||||||
// candidate selected, override the node with selection
|
|
||||||
|
|
||||||
string selectedValue;
|
|
||||||
|
|
||||||
if ([candidateString isKindOfClass:[NSString class]]) {
|
|
||||||
selectedValue = [(NSString *)candidateString UTF8String];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
selectedValue = [[candidateString string] UTF8String];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (![[NSUserDefaults standardUserDefaults] boolForKey:kDisableUserCandidateSelectionLearning]) {
|
|
||||||
NSString *trigram = [self neighborTrigramString];
|
|
||||||
NSString *selectedNSString = [NSString stringWithUTF8String:selectedValue.c_str()];
|
|
||||||
[TLCandidateLearningDictionary setObject:selectedNSString forKey:trigram];
|
|
||||||
[self saveUserCandidatesDictionary];
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t cursorIndex = [self actualCandidateCursorIndex];
|
|
||||||
vector<NodeAnchor> nodes = _builder->grid().nodesCrossingOrEndingAt(cursorIndex);
|
|
||||||
|
|
||||||
for (vector<NodeAnchor>::iterator ni = nodes.begin(), ne = nodes.end(); ni != ne; ++ni) {
|
|
||||||
const vector<KeyValuePair>& candidates = (*ni).node->candidates();
|
|
||||||
|
|
||||||
for (size_t i = 0, c = candidates.size(); i < c; ++i) {
|
|
||||||
if (candidates[i].value == selectedValue) {
|
|
||||||
// found our node
|
|
||||||
const_cast<Node*>((*ni).node)->selectCandidateAtIndex(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[self walk];
|
|
||||||
[self updateClientComposingBuffer:_currentCandidateClient];
|
|
||||||
_currentCandidateClient = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark Private methods
|
|
||||||
|
|
||||||
- (size_t)actualCandidateCursorIndex
|
|
||||||
{
|
|
||||||
size_t cursorIndex = _builder->cursorIndex();
|
|
||||||
|
|
||||||
BOOL candidatePhraseLocatedAfterCursor = [[NSUserDefaults standardUserDefaults] boolForKey:kSelectPhraseAfterCursorAsCandidatePreferenceKey];
|
|
||||||
|
|
||||||
if (candidatePhraseLocatedAfterCursor) {
|
|
||||||
// MS Phonetics IME style, phrase is *after* the cursor, i.e. cursor is always *before* the phrase
|
|
||||||
if (cursorIndex < _builder->length()) {
|
|
||||||
++cursorIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!cursorIndex) {
|
|
||||||
++cursorIndex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return cursorIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)_performDeferredSaveUserCandidatesDictionary
|
- (void)_performDeferredSaveUserCandidatesDictionary
|
||||||
{
|
{
|
||||||
BOOL __unused success = [TLCandidateLearningDictionary writeToFile:TLUserCandidatesDictionaryPath atomically:YES];
|
BOOL __unused success = [TLCandidateLearningDictionary writeToFile:TLUserCandidatesDictionaryPath atomically:YES];
|
||||||
|
@ -925,7 +885,50 @@ public:
|
||||||
[self performSelector:@selector(_performDeferredSaveUserCandidatesDictionary) withObject:nil afterDelay:5.0];
|
[self performSelector:@selector(_performDeferredSaveUserCandidatesDictionary) withObject:nil afterDelay:5.0];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma Misc menu items
|
- (void)_showCandidateWindowUsingVerticalMode:(BOOL)useVerticalMode client:(id)client
|
||||||
|
{
|
||||||
|
// candidate
|
||||||
|
[LTSharedCandidates setDismissesAutomatically:YES];
|
||||||
|
|
||||||
|
// wrap NSNumber; we only allow number keys 1-9 as selection keys in this project
|
||||||
|
#define LTUIntObj(x) ([NSNumber numberWithInteger:x])
|
||||||
|
[LTSharedCandidates setSelectionKeys:[NSArray arrayWithObjects:LTUIntObj(18), LTUIntObj(19), LTUIntObj(20), LTUIntObj(21), LTUIntObj(23), LTUIntObj(22), LTUIntObj(26), LTUIntObj(28), LTUIntObj(25), nil]];
|
||||||
|
#undef LTUIntObj
|
||||||
|
|
||||||
|
// set the candidate panel style
|
||||||
|
BOOL useHorizontalCandidateList = [[NSUserDefaults standardUserDefaults] boolForKey:kUseHorizontalCandidateListPreferenceKey];
|
||||||
|
|
||||||
|
if (useVerticalMode) {
|
||||||
|
[LTSharedCandidates setPanelType:kIMKSingleColumnScrollingCandidatePanel];
|
||||||
|
}
|
||||||
|
else if (useHorizontalCandidateList) {
|
||||||
|
[LTSharedCandidates setPanelType:kIMKSingleRowSteppingCandidatePanel];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[LTSharedCandidates setPanelType:kIMKSingleColumnScrollingCandidatePanel];
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the attributes for the candidate panel (which uses NSAttributedString)
|
||||||
|
NSInteger textSize = [[NSUserDefaults standardUserDefaults] integerForKey:kCandidateListTextSizeKey];
|
||||||
|
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSFont systemFontOfSize:textSize], NSFontAttributeName, nil];
|
||||||
|
[LTSharedCandidates setAttributes:attributes];
|
||||||
|
|
||||||
|
[LTSharedCandidates updateCandidates];
|
||||||
|
[LTSharedCandidates show:useVerticalMode ? kIMKLocateCandidatesLeftHint : kIMKLocateCandidatesBelowHint];
|
||||||
|
|
||||||
|
// update the composing text, set the client
|
||||||
|
[self updateClientComposingBuffer:client];
|
||||||
|
_currentCandidateClient = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Misc menu items
|
||||||
|
|
||||||
|
- (void)showPreferences:(id)sender
|
||||||
|
{
|
||||||
|
// show the preferences panel, and also make the IME app itself the focus
|
||||||
|
[super showPreferences:sender];
|
||||||
|
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)showAbout:(id)sender
|
- (void)showAbout:(id)sender
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue