As a app launcher,不需要中文,but, as a desktop search engine,支援中文與否直接決定它的可用性。
感謝Patrick Robertson和Rob McBroom的協助,告訴我應該看QSCollectingSearchObjectView.m和QSInterfaceController.m,
今天研究了下QSCollectingSearchObjectView.m/.h。
這個類別就是Pane1和Pane3,接受user的keyboard input。
它的繼承架構如下:
QSCollectingSearchObjectView
QSSearchObjectView
QSObjectView
NSControl
NSView
NSResponder
NSObject
在QSSearchObjectView.h中宣告如下:
@interface QSSearchObjectView : QSObjectView <NSTextInput
#if (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
, NSTextDelegate
#endif
>
{
...
}
QSSearchObjectView使用了NSTextInput這個protocol,並實作
setMarkedText:selectedRange: insertText:
doCommandBySelector:
等幾個method。
其中doCommandBySelector:只是單純的呼叫
[super doCommandBySelector:aSelector]
。另外,關於doCommandBySelector:我發現一件奇怪的事,那就是
QSSearchObjectView有實作textView:doCommandBySelector:,這是NSTextViewDelegate這個protocol的一個method。不過它在宣告明明用到的是NSTextDelegate而非NSTextViewDelegate耶!?
delegate是什麼我也不太清楚,暫時先記著。
關於Cocoa的文字系統,有幾個重要的方法,根據
http://www.cocoabuilder.com/archive/cocoa/156808-keydown-and-japanese-input-methods.html
這篇文章解釋運作原理似乎是這樣的:
keyDown是進入點,基本上不太該改(QS可是大刀闊斧的改了阿XDD)
因為一不小心就會傷害到你的輸入法(這就是我現在的挑戰!)。
key stroke進入keyDown後會被傳送到key binding system,然後以
setMarkedText:selectedRange:replacementRange:
insertText:replacementRange:
doCommandBySelector:
這三種形式回來。它們都是NSTextInputClient Protocol的method。
但後者在NSResponder中有實作,也可在NSTextInput或NSTextInputClient這兩個protocol覆寫之。
這裡就是我們可以介入的地方了,可以在subclass重寫,或者是delegate(它到底是什麼@@)。
setMarkedText:selectedRange:replacementRange:
insertText:replacementRange:
doCommandBySelector:
這三種形式回來。它們都是NSTextInputClient Protocol的method。
但後者在NSResponder中有實作,也可在NSTextInput或NSTextInputClient這兩個protocol覆寫之。
這裡就是我們可以介入的地方了,可以在subclass重寫,或者是delegate(它到底是什麼@@)。
insertText:replacementRange:可以接收
NSString或是NSAttributedString這兩種object。前者是平常用途,後者在使用某些輸入法時會用到。我想中文就是其中一種吧!
然後這篇文章建議,如果要對enter/return做特別處理,應該要去實作
- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)
aSelector;
aSelector;
這個method。我測了一下,發現QS的這個method雖然有實作,但都沒被call到。
如果要在subclass中做,就把doCommandBySelector:重寫吧。
最後,要知道一個字是不是打完還是打到一半,要用NSTextInput protocol的-hasMarkedText這個method。
沒有留言:
張貼留言