зеркало из https://github.com/mozilla/gecko-dev.git
151716 - fixing some annoying autocomplete problems, most importantly that escape should work to undo typing, and fixes some situations where the popup would appear and not go away, r=pink
This commit is contained in:
Родитель
4f9e09571b
Коммит
d4e1bdf9f6
|
@ -0,0 +1,9 @@
|
||||||
|
/* BrowserWindow */
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface BrowserWindow : NSWindow
|
||||||
|
{
|
||||||
|
IBOutlet id mAutoCompleteTextField;
|
||||||
|
}
|
||||||
|
@end
|
|
@ -0,0 +1,22 @@
|
||||||
|
#import "BrowserWindow.h"
|
||||||
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
|
||||||
|
static const int kEscapeKeyCode = 53;
|
||||||
|
|
||||||
|
@implementation BrowserWindow
|
||||||
|
|
||||||
|
- (void)sendEvent:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
// We need this hack because NSWindow::sendEvent will eat the escape key
|
||||||
|
// and won't pass it down to the key handler of responders in the window.
|
||||||
|
// We have to override sendEvent for all of our escape key needs.
|
||||||
|
if ([theEvent keyCode] == kEscapeKeyCode && [theEvent type] == NSKeyDown) {
|
||||||
|
NSText *fieldEditor = [self fieldEditor:NO forObject:mAutoCompleteTextField];
|
||||||
|
if (fieldEditor && [self firstResponder] == fieldEditor) {
|
||||||
|
[mAutoCompleteTextField revertText];
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
[super sendEvent:theEvent];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -16,7 +16,12 @@
|
||||||
SUPERCLASS = NSObject;
|
SUPERCLASS = NSObject;
|
||||||
},
|
},
|
||||||
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
||||||
{CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
|
{
|
||||||
|
CLASS = BrowserWindow;
|
||||||
|
LANGUAGE = ObjC;
|
||||||
|
OUTLETS = {mAutoCompleteTextField = id; };
|
||||||
|
SUPERCLASS = NSWindow;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ACTIONS = {
|
ACTIONS = {
|
||||||
back = id;
|
back = id;
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
<key>336</key>
|
<key>336</key>
|
||||||
<string>630 666 200 132 0 0 1152 848 </string>
|
<string>630 666 200 132 0 0 1152 848 </string>
|
||||||
<key>365</key>
|
<key>365</key>
|
||||||
<string>22 587 93 162 0 0 1152 848 </string>
|
<string>25 719 93 162 0 0 1280 1002 </string>
|
||||||
<key>463</key>
|
<key>463</key>
|
||||||
<string>7 536 200 180 0 0 1152 848 </string>
|
<string>7 536 200 180 0 0 1152 848 </string>
|
||||||
<key>56</key>
|
<key>56</key>
|
||||||
<string>404 546 343 68 0 0 1152 848 </string>
|
<string>442 634 343 68 0 0 1280 1002 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IBFramework Version</key>
|
<key>IBFramework Version</key>
|
||||||
<string>248.0</string>
|
<string>248.0</string>
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
<array>
|
<array>
|
||||||
<integer>497</integer>
|
<integer>497</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBOpenObjects</key>
|
|
||||||
<array>
|
|
||||||
<integer>365</integer>
|
|
||||||
</array>
|
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>5S60</string>
|
<string>5S60</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
Двоичный файл не отображается.
|
@ -42,7 +42,11 @@
|
||||||
nsIAutoCompleteListener *mListener;
|
nsIAutoCompleteListener *mListener;
|
||||||
|
|
||||||
NSString *mSearchString;
|
NSString *mSearchString;
|
||||||
|
|
||||||
|
// used to remember if backspace was pressed in complete: so we can check this in controlTextDidChange
|
||||||
BOOL mBackspaced;
|
BOOL mBackspaced;
|
||||||
|
// determines if the search currently pending should complete the default result when it is ready
|
||||||
|
BOOL mCompleteResult;
|
||||||
|
|
||||||
NSTimer *mOpenTimer;
|
NSTimer *mOpenTimer;
|
||||||
}
|
}
|
||||||
|
@ -53,15 +57,17 @@
|
||||||
- (NSTableView *) tableView;
|
- (NSTableView *) tableView;
|
||||||
- (int) visibleRows;
|
- (int) visibleRows;
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString;
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete;
|
||||||
- (void) performSearch;
|
- (void) performSearch;
|
||||||
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
||||||
- (void) searchTimer:(NSTimer *)aTimer;
|
- (void) searchTimer:(NSTimer *)aTimer;
|
||||||
|
- (void) clearResults;
|
||||||
|
|
||||||
- (void) completeDefaultResult;
|
- (void) completeDefaultResult;
|
||||||
- (void) completeSelectedResult;
|
- (void) completeSelectedResult;
|
||||||
- (void) completeResult:(int)aRow;
|
- (void) completeResult:(int)aRow;
|
||||||
- (void) enterResult:(int)aRow;
|
- (void) enterResult:(int)aRow;
|
||||||
|
- (void) revertText;
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow;
|
- (void) selectRowAt:(int)aRow;
|
||||||
- (void) selectRowBy:(int)aRows;
|
- (void) selectRowBy:(int)aRows;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "CHAutoCompleteTextField.h"
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
#import "BrowserWindowController.h"
|
||||||
#import "CHPageProxyIcon.h"
|
#import "CHPageProxyIcon.h"
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsMemory.h"
|
#include "nsMemory.h"
|
||||||
|
@ -69,6 +70,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mSearchString = nil;
|
mSearchString = nil;
|
||||||
mBackspaced = NO;
|
mBackspaced = NO;
|
||||||
|
mCompleteResult = NO;
|
||||||
mOpenTimer = nil;
|
mOpenTimer = nil;
|
||||||
|
|
||||||
mSession = nsnull;
|
mSession = nsnull;
|
||||||
|
@ -182,12 +184,14 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
// searching ////////////////////////////
|
// searching ////////////////////////////
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete
|
||||||
{
|
{
|
||||||
if (mSearchString)
|
if (mSearchString)
|
||||||
[mSearchString release];
|
[mSearchString release];
|
||||||
mSearchString = [aString retain];
|
mSearchString = [aString retain];
|
||||||
|
|
||||||
|
mCompleteResult = aComplete;
|
||||||
|
|
||||||
if ([self isOpen]) {
|
if ([self isOpen]) {
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
} else {
|
} else {
|
||||||
|
@ -200,11 +204,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
||||||
userInfo:nil repeats:NO] retain];
|
userInfo:nil repeats:NO] retain];
|
||||||
|
|
||||||
// we need to reset mBackspaced here, or else it might still be true if the user backspaces
|
|
||||||
// the textfield to be empty, then starts typing, because it is normally reset in selectRowAt
|
|
||||||
// which won't be called until perhaps after several keystrokes (due to the timer)
|
|
||||||
mBackspaced = NO;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +253,17 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) clearResults
|
||||||
|
{
|
||||||
|
// clear out search data
|
||||||
|
mSearchString = nil;
|
||||||
|
mResults = nil;
|
||||||
|
|
||||||
|
[mDataSource setResults:nil];
|
||||||
|
|
||||||
|
[self closePopup];
|
||||||
|
}
|
||||||
|
|
||||||
// handling the popup /////////////////////////////////
|
// handling the popup /////////////////////////////////
|
||||||
|
|
||||||
- (void) openPopup
|
- (void) openPopup
|
||||||
|
@ -271,6 +281,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSPoint locationOrigin;
|
NSPoint locationOrigin;
|
||||||
int tableHeight;
|
int tableHeight;
|
||||||
|
|
||||||
|
if ([self visibleRows] == 0) {
|
||||||
|
[self closePopup];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// get the origin of the location bar in coordinates of the root view
|
// get the origin of the location bar in coordinates of the root view
|
||||||
locationFrame = [[self superview] frame];
|
locationFrame = [[self superview] frame];
|
||||||
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
||||||
|
@ -307,12 +322,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
PRInt32 defaultRow;
|
PRInt32 defaultRow;
|
||||||
mResults->GetDefaultItemIndex(&defaultRow);
|
mResults->GetDefaultItemIndex(&defaultRow);
|
||||||
|
|
||||||
if (mBackspaced) {
|
if (mCompleteResult) {
|
||||||
[self selectRowAt:-1];
|
|
||||||
mBackspaced = NO;
|
|
||||||
} else {
|
|
||||||
[self selectRowAt:defaultRow];
|
[self selectRowAt:defaultRow];
|
||||||
[self completeResult:defaultRow];
|
[self completeResult:defaultRow];
|
||||||
|
} else {
|
||||||
|
[self selectRowAt:-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +341,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSText *text;
|
NSText *text;
|
||||||
NSString *result1;
|
NSString *result1;
|
||||||
|
|
||||||
if (aRow < 0) {
|
if (aRow < 0 && mSearchString) {
|
||||||
[self setStringValue:mSearchString];
|
[self setStringValue:mSearchString];
|
||||||
} else {
|
} else {
|
||||||
if ([mDataSource rowCount] <= 0)
|
if ([mDataSource rowCount] <= 0)
|
||||||
|
@ -351,10 +365,27 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) enterResult:(int)aRow
|
- (void) enterResult:(int)aRow
|
||||||
{
|
{
|
||||||
if ([self isOpen] && aRow >= 0) {
|
if (aRow >= 0 && [mDataSource rowCount] > 0) {
|
||||||
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
||||||
[self selectText:self];
|
[self selectText:self];
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
|
} else if (mOpenTimer) {
|
||||||
|
// if there was a search timer going when we hit enter, cancel it
|
||||||
|
[mOpenTimer invalidate];
|
||||||
|
[mOpenTimer release];
|
||||||
|
mOpenTimer = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) revertText
|
||||||
|
{
|
||||||
|
BrowserWindowController *controller = (BrowserWindowController *)[[self window] windowController];
|
||||||
|
NSString *url = [[controller getBrowserWrapper] getCurrentURLSpec];
|
||||||
|
if (url) {
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
[self setStringValue:url];
|
||||||
|
[self selectText:self];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,9 +393,15 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow
|
- (void) selectRowAt:(int)aRow
|
||||||
{
|
{
|
||||||
|
if (aRow >= -1 && [mDataSource rowCount] > 0) {
|
||||||
|
// show the popup
|
||||||
|
if ([mPopupWin isVisible] == NO)
|
||||||
|
[mPopupWin orderFront:nil];
|
||||||
|
|
||||||
[mTableView selectRow:aRow byExtendingSelection:NO];
|
[mTableView selectRow:aRow byExtendingSelection:NO];
|
||||||
[mTableView scrollRowToVisible: aRow];
|
[mTableView scrollRowToVisible: aRow];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) selectRowBy:(int)aRows
|
- (void) selectRowBy:(int)aRows
|
||||||
{
|
{
|
||||||
|
@ -414,11 +451,20 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self resizePopup];
|
[self resizePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField ////////////////////////////////////////////
|
// NSTextField delegate //////////////////////////////////
|
||||||
|
|
||||||
- (void)controlTextDidChange:(NSNotification *)aNotification
|
- (void)controlTextDidChange:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[self startSearch:[self stringValue]];
|
NSText *text = [[self window] fieldEditor:NO forObject:self];
|
||||||
|
NSRange range = [text selectedRange];
|
||||||
|
|
||||||
|
// make sure we're typing at the end of the string
|
||||||
|
if (range.location == [[self stringValue] length])
|
||||||
|
[self startSearch:[self stringValue] complete:!mBackspaced];
|
||||||
|
else
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
mBackspaced = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
||||||
|
@ -426,8 +472,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField delegate //////////////////////////////////
|
|
||||||
|
|
||||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
||||||
{
|
{
|
||||||
if (command == @selector(insertNewline:)) {
|
if (command == @selector(insertNewline:)) {
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
F517395B020CE3740189DA0C,
|
F517395B020CE3740189DA0C,
|
||||||
F528E21A020FD9620168DE43,
|
F528E21A020FD9620168DE43,
|
||||||
F5DE10EA0209DC0601A967DF,
|
F5DE10EA0209DC0601A967DF,
|
||||||
|
F632AF8402B9AEBB01000103,
|
||||||
F5DE10EB0209DC0601A967DF,
|
F5DE10EB0209DC0601A967DF,
|
||||||
F51B70B7026EC98B01A80166,
|
F51B70B7026EC98B01A80166,
|
||||||
F5AE04BA0206A4FE01A967DF,
|
F5AE04BA0206A4FE01A967DF,
|
||||||
|
@ -447,6 +448,7 @@
|
||||||
2E748B74029A448D4B000102,
|
2E748B74029A448D4B000102,
|
||||||
F53E012A02AEE91D01A967F3,
|
F53E012A02AEE91D01A967F3,
|
||||||
F53E013302AEEA2901A967F3,
|
F53E013302AEEA2901A967F3,
|
||||||
|
F632AF8502B9AEBB01000103,
|
||||||
);
|
);
|
||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
name = Headers;
|
name = Headers;
|
||||||
|
@ -560,6 +562,7 @@
|
||||||
2EEC3E64028138724B000102,
|
2EEC3E64028138724B000102,
|
||||||
2E748B75029A448D4B000102,
|
2E748B75029A448D4B000102,
|
||||||
F53E012D02AEE93701A967F3,
|
F53E012D02AEE93701A967F3,
|
||||||
|
F632AF8602B9AEBC01000103,
|
||||||
);
|
);
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
name = Sources;
|
name = Sources;
|
||||||
|
@ -1196,6 +1199,7 @@
|
||||||
F517395A020CE3740189DA0C,
|
F517395A020CE3740189DA0C,
|
||||||
F528E218020FD8400168DE43,
|
F528E218020FD8400168DE43,
|
||||||
F5DE10E70209DC0601A967DF,
|
F5DE10E70209DC0601A967DF,
|
||||||
|
F632AF8302B9AEBB01000103,
|
||||||
F5DE10E80209DC0601A967DF,
|
F5DE10E80209DC0601A967DF,
|
||||||
F51B70B6026EC98B01A80166,
|
F51B70B6026EC98B01A80166,
|
||||||
F5125A110202064D01FAFD9F,
|
F5125A110202064D01FAFD9F,
|
||||||
|
@ -2006,7 +2010,6 @@
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
path = CHPreferenceManager.mm;
|
path = CHPreferenceManager.mm;
|
||||||
refType = 4;
|
refType = 4;
|
||||||
indentWidth = 2;
|
|
||||||
};
|
};
|
||||||
F52D5CD9027D3D5001A80166 = {
|
F52D5CD9027D3D5001A80166 = {
|
||||||
fileRef = F52D5CD7027D3D5001A80166;
|
fileRef = F52D5CD7027D3D5001A80166;
|
||||||
|
@ -6575,6 +6578,28 @@
|
||||||
//F62
|
//F62
|
||||||
//F63
|
//F63
|
||||||
//F64
|
//F64
|
||||||
|
F632AF8302B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.h;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8402B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.mm;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8502B9AEBB01000103 = {
|
||||||
|
fileRef = F632AF8302B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
F632AF8602B9AEBC01000103 = {
|
||||||
|
fileRef = F632AF8402B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
F655020201B480F201A962F7 = {
|
F655020201B480F201A962F7 = {
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
name = libnkcache.dylib;
|
name = libnkcache.dylib;
|
||||||
|
|
|
@ -16,7 +16,12 @@
|
||||||
SUPERCLASS = NSObject;
|
SUPERCLASS = NSObject;
|
||||||
},
|
},
|
||||||
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
||||||
{CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
|
{
|
||||||
|
CLASS = BrowserWindow;
|
||||||
|
LANGUAGE = ObjC;
|
||||||
|
OUTLETS = {mAutoCompleteTextField = id; };
|
||||||
|
SUPERCLASS = NSWindow;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ACTIONS = {
|
ACTIONS = {
|
||||||
back = id;
|
back = id;
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
<key>336</key>
|
<key>336</key>
|
||||||
<string>630 666 200 132 0 0 1152 848 </string>
|
<string>630 666 200 132 0 0 1152 848 </string>
|
||||||
<key>365</key>
|
<key>365</key>
|
||||||
<string>22 587 93 162 0 0 1152 848 </string>
|
<string>25 719 93 162 0 0 1280 1002 </string>
|
||||||
<key>463</key>
|
<key>463</key>
|
||||||
<string>7 536 200 180 0 0 1152 848 </string>
|
<string>7 536 200 180 0 0 1152 848 </string>
|
||||||
<key>56</key>
|
<key>56</key>
|
||||||
<string>404 546 343 68 0 0 1152 848 </string>
|
<string>442 634 343 68 0 0 1280 1002 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IBFramework Version</key>
|
<key>IBFramework Version</key>
|
||||||
<string>248.0</string>
|
<string>248.0</string>
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
<array>
|
<array>
|
||||||
<integer>497</integer>
|
<integer>497</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBOpenObjects</key>
|
|
||||||
<array>
|
|
||||||
<integer>365</integer>
|
|
||||||
</array>
|
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>5S60</string>
|
<string>5S60</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
Двоичный файл не отображается.
|
@ -11,6 +11,7 @@
|
||||||
F517395B020CE3740189DA0C,
|
F517395B020CE3740189DA0C,
|
||||||
F528E21A020FD9620168DE43,
|
F528E21A020FD9620168DE43,
|
||||||
F5DE10EA0209DC0601A967DF,
|
F5DE10EA0209DC0601A967DF,
|
||||||
|
F632AF8402B9AEBB01000103,
|
||||||
F5DE10EB0209DC0601A967DF,
|
F5DE10EB0209DC0601A967DF,
|
||||||
F51B70B7026EC98B01A80166,
|
F51B70B7026EC98B01A80166,
|
||||||
F5AE04BA0206A4FE01A967DF,
|
F5AE04BA0206A4FE01A967DF,
|
||||||
|
@ -447,6 +448,7 @@
|
||||||
2E748B74029A448D4B000102,
|
2E748B74029A448D4B000102,
|
||||||
F53E012A02AEE91D01A967F3,
|
F53E012A02AEE91D01A967F3,
|
||||||
F53E013302AEEA2901A967F3,
|
F53E013302AEEA2901A967F3,
|
||||||
|
F632AF8502B9AEBB01000103,
|
||||||
);
|
);
|
||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
name = Headers;
|
name = Headers;
|
||||||
|
@ -560,6 +562,7 @@
|
||||||
2EEC3E64028138724B000102,
|
2EEC3E64028138724B000102,
|
||||||
2E748B75029A448D4B000102,
|
2E748B75029A448D4B000102,
|
||||||
F53E012D02AEE93701A967F3,
|
F53E012D02AEE93701A967F3,
|
||||||
|
F632AF8602B9AEBC01000103,
|
||||||
);
|
);
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
name = Sources;
|
name = Sources;
|
||||||
|
@ -1196,6 +1199,7 @@
|
||||||
F517395A020CE3740189DA0C,
|
F517395A020CE3740189DA0C,
|
||||||
F528E218020FD8400168DE43,
|
F528E218020FD8400168DE43,
|
||||||
F5DE10E70209DC0601A967DF,
|
F5DE10E70209DC0601A967DF,
|
||||||
|
F632AF8302B9AEBB01000103,
|
||||||
F5DE10E80209DC0601A967DF,
|
F5DE10E80209DC0601A967DF,
|
||||||
F51B70B6026EC98B01A80166,
|
F51B70B6026EC98B01A80166,
|
||||||
F5125A110202064D01FAFD9F,
|
F5125A110202064D01FAFD9F,
|
||||||
|
@ -2006,7 +2010,6 @@
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
path = CHPreferenceManager.mm;
|
path = CHPreferenceManager.mm;
|
||||||
refType = 4;
|
refType = 4;
|
||||||
indentWidth = 2;
|
|
||||||
};
|
};
|
||||||
F52D5CD9027D3D5001A80166 = {
|
F52D5CD9027D3D5001A80166 = {
|
||||||
fileRef = F52D5CD7027D3D5001A80166;
|
fileRef = F52D5CD7027D3D5001A80166;
|
||||||
|
@ -6575,6 +6578,28 @@
|
||||||
//F62
|
//F62
|
||||||
//F63
|
//F63
|
||||||
//F64
|
//F64
|
||||||
|
F632AF8302B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.h;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8402B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.mm;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8502B9AEBB01000103 = {
|
||||||
|
fileRef = F632AF8302B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
F632AF8602B9AEBC01000103 = {
|
||||||
|
fileRef = F632AF8402B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
F655020201B480F201A962F7 = {
|
F655020201B480F201A962F7 = {
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
name = libnkcache.dylib;
|
name = libnkcache.dylib;
|
||||||
|
|
|
@ -16,7 +16,12 @@
|
||||||
SUPERCLASS = NSObject;
|
SUPERCLASS = NSObject;
|
||||||
},
|
},
|
||||||
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
||||||
{CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
|
{
|
||||||
|
CLASS = BrowserWindow;
|
||||||
|
LANGUAGE = ObjC;
|
||||||
|
OUTLETS = {mAutoCompleteTextField = id; };
|
||||||
|
SUPERCLASS = NSWindow;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ACTIONS = {
|
ACTIONS = {
|
||||||
back = id;
|
back = id;
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
<key>336</key>
|
<key>336</key>
|
||||||
<string>630 666 200 132 0 0 1152 848 </string>
|
<string>630 666 200 132 0 0 1152 848 </string>
|
||||||
<key>365</key>
|
<key>365</key>
|
||||||
<string>22 587 93 162 0 0 1152 848 </string>
|
<string>25 719 93 162 0 0 1280 1002 </string>
|
||||||
<key>463</key>
|
<key>463</key>
|
||||||
<string>7 536 200 180 0 0 1152 848 </string>
|
<string>7 536 200 180 0 0 1152 848 </string>
|
||||||
<key>56</key>
|
<key>56</key>
|
||||||
<string>404 546 343 68 0 0 1152 848 </string>
|
<string>442 634 343 68 0 0 1280 1002 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IBFramework Version</key>
|
<key>IBFramework Version</key>
|
||||||
<string>248.0</string>
|
<string>248.0</string>
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
<array>
|
<array>
|
||||||
<integer>497</integer>
|
<integer>497</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBOpenObjects</key>
|
|
||||||
<array>
|
|
||||||
<integer>365</integer>
|
|
||||||
</array>
|
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>5S60</string>
|
<string>5S60</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
Двоичные данные
camino/resources/localized/English.lproj/BrowserWindow.nib/objects.nib
сгенерированный
Двоичные данные
camino/resources/localized/English.lproj/BrowserWindow.nib/objects.nib
сгенерированный
Двоичный файл не отображается.
|
@ -42,7 +42,11 @@
|
||||||
nsIAutoCompleteListener *mListener;
|
nsIAutoCompleteListener *mListener;
|
||||||
|
|
||||||
NSString *mSearchString;
|
NSString *mSearchString;
|
||||||
|
|
||||||
|
// used to remember if backspace was pressed in complete: so we can check this in controlTextDidChange
|
||||||
BOOL mBackspaced;
|
BOOL mBackspaced;
|
||||||
|
// determines if the search currently pending should complete the default result when it is ready
|
||||||
|
BOOL mCompleteResult;
|
||||||
|
|
||||||
NSTimer *mOpenTimer;
|
NSTimer *mOpenTimer;
|
||||||
}
|
}
|
||||||
|
@ -53,15 +57,17 @@
|
||||||
- (NSTableView *) tableView;
|
- (NSTableView *) tableView;
|
||||||
- (int) visibleRows;
|
- (int) visibleRows;
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString;
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete;
|
||||||
- (void) performSearch;
|
- (void) performSearch;
|
||||||
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
||||||
- (void) searchTimer:(NSTimer *)aTimer;
|
- (void) searchTimer:(NSTimer *)aTimer;
|
||||||
|
- (void) clearResults;
|
||||||
|
|
||||||
- (void) completeDefaultResult;
|
- (void) completeDefaultResult;
|
||||||
- (void) completeSelectedResult;
|
- (void) completeSelectedResult;
|
||||||
- (void) completeResult:(int)aRow;
|
- (void) completeResult:(int)aRow;
|
||||||
- (void) enterResult:(int)aRow;
|
- (void) enterResult:(int)aRow;
|
||||||
|
- (void) revertText;
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow;
|
- (void) selectRowAt:(int)aRow;
|
||||||
- (void) selectRowBy:(int)aRows;
|
- (void) selectRowBy:(int)aRows;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "CHAutoCompleteTextField.h"
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
#import "BrowserWindowController.h"
|
||||||
#import "CHPageProxyIcon.h"
|
#import "CHPageProxyIcon.h"
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsMemory.h"
|
#include "nsMemory.h"
|
||||||
|
@ -69,6 +70,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mSearchString = nil;
|
mSearchString = nil;
|
||||||
mBackspaced = NO;
|
mBackspaced = NO;
|
||||||
|
mCompleteResult = NO;
|
||||||
mOpenTimer = nil;
|
mOpenTimer = nil;
|
||||||
|
|
||||||
mSession = nsnull;
|
mSession = nsnull;
|
||||||
|
@ -182,12 +184,14 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
// searching ////////////////////////////
|
// searching ////////////////////////////
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete
|
||||||
{
|
{
|
||||||
if (mSearchString)
|
if (mSearchString)
|
||||||
[mSearchString release];
|
[mSearchString release];
|
||||||
mSearchString = [aString retain];
|
mSearchString = [aString retain];
|
||||||
|
|
||||||
|
mCompleteResult = aComplete;
|
||||||
|
|
||||||
if ([self isOpen]) {
|
if ([self isOpen]) {
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
} else {
|
} else {
|
||||||
|
@ -200,11 +204,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
||||||
userInfo:nil repeats:NO] retain];
|
userInfo:nil repeats:NO] retain];
|
||||||
|
|
||||||
// we need to reset mBackspaced here, or else it might still be true if the user backspaces
|
|
||||||
// the textfield to be empty, then starts typing, because it is normally reset in selectRowAt
|
|
||||||
// which won't be called until perhaps after several keystrokes (due to the timer)
|
|
||||||
mBackspaced = NO;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +253,17 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) clearResults
|
||||||
|
{
|
||||||
|
// clear out search data
|
||||||
|
mSearchString = nil;
|
||||||
|
mResults = nil;
|
||||||
|
|
||||||
|
[mDataSource setResults:nil];
|
||||||
|
|
||||||
|
[self closePopup];
|
||||||
|
}
|
||||||
|
|
||||||
// handling the popup /////////////////////////////////
|
// handling the popup /////////////////////////////////
|
||||||
|
|
||||||
- (void) openPopup
|
- (void) openPopup
|
||||||
|
@ -271,6 +281,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSPoint locationOrigin;
|
NSPoint locationOrigin;
|
||||||
int tableHeight;
|
int tableHeight;
|
||||||
|
|
||||||
|
if ([self visibleRows] == 0) {
|
||||||
|
[self closePopup];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// get the origin of the location bar in coordinates of the root view
|
// get the origin of the location bar in coordinates of the root view
|
||||||
locationFrame = [[self superview] frame];
|
locationFrame = [[self superview] frame];
|
||||||
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
||||||
|
@ -307,12 +322,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
PRInt32 defaultRow;
|
PRInt32 defaultRow;
|
||||||
mResults->GetDefaultItemIndex(&defaultRow);
|
mResults->GetDefaultItemIndex(&defaultRow);
|
||||||
|
|
||||||
if (mBackspaced) {
|
if (mCompleteResult) {
|
||||||
[self selectRowAt:-1];
|
|
||||||
mBackspaced = NO;
|
|
||||||
} else {
|
|
||||||
[self selectRowAt:defaultRow];
|
[self selectRowAt:defaultRow];
|
||||||
[self completeResult:defaultRow];
|
[self completeResult:defaultRow];
|
||||||
|
} else {
|
||||||
|
[self selectRowAt:-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +341,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSText *text;
|
NSText *text;
|
||||||
NSString *result1;
|
NSString *result1;
|
||||||
|
|
||||||
if (aRow < 0) {
|
if (aRow < 0 && mSearchString) {
|
||||||
[self setStringValue:mSearchString];
|
[self setStringValue:mSearchString];
|
||||||
} else {
|
} else {
|
||||||
if ([mDataSource rowCount] <= 0)
|
if ([mDataSource rowCount] <= 0)
|
||||||
|
@ -351,10 +365,27 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) enterResult:(int)aRow
|
- (void) enterResult:(int)aRow
|
||||||
{
|
{
|
||||||
if ([self isOpen] && aRow >= 0) {
|
if (aRow >= 0 && [mDataSource rowCount] > 0) {
|
||||||
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
||||||
[self selectText:self];
|
[self selectText:self];
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
|
} else if (mOpenTimer) {
|
||||||
|
// if there was a search timer going when we hit enter, cancel it
|
||||||
|
[mOpenTimer invalidate];
|
||||||
|
[mOpenTimer release];
|
||||||
|
mOpenTimer = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) revertText
|
||||||
|
{
|
||||||
|
BrowserWindowController *controller = (BrowserWindowController *)[[self window] windowController];
|
||||||
|
NSString *url = [[controller getBrowserWrapper] getCurrentURLSpec];
|
||||||
|
if (url) {
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
[self setStringValue:url];
|
||||||
|
[self selectText:self];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,9 +393,15 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow
|
- (void) selectRowAt:(int)aRow
|
||||||
{
|
{
|
||||||
|
if (aRow >= -1 && [mDataSource rowCount] > 0) {
|
||||||
|
// show the popup
|
||||||
|
if ([mPopupWin isVisible] == NO)
|
||||||
|
[mPopupWin orderFront:nil];
|
||||||
|
|
||||||
[mTableView selectRow:aRow byExtendingSelection:NO];
|
[mTableView selectRow:aRow byExtendingSelection:NO];
|
||||||
[mTableView scrollRowToVisible: aRow];
|
[mTableView scrollRowToVisible: aRow];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) selectRowBy:(int)aRows
|
- (void) selectRowBy:(int)aRows
|
||||||
{
|
{
|
||||||
|
@ -414,11 +451,20 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self resizePopup];
|
[self resizePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField ////////////////////////////////////////////
|
// NSTextField delegate //////////////////////////////////
|
||||||
|
|
||||||
- (void)controlTextDidChange:(NSNotification *)aNotification
|
- (void)controlTextDidChange:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[self startSearch:[self stringValue]];
|
NSText *text = [[self window] fieldEditor:NO forObject:self];
|
||||||
|
NSRange range = [text selectedRange];
|
||||||
|
|
||||||
|
// make sure we're typing at the end of the string
|
||||||
|
if (range.location == [[self stringValue] length])
|
||||||
|
[self startSearch:[self stringValue] complete:!mBackspaced];
|
||||||
|
else
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
mBackspaced = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
||||||
|
@ -426,8 +472,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField delegate //////////////////////////////////
|
|
||||||
|
|
||||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
||||||
{
|
{
|
||||||
if (command == @selector(insertNewline:)) {
|
if (command == @selector(insertNewline:)) {
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
/* BrowserWindow */
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface BrowserWindow : NSWindow
|
||||||
|
{
|
||||||
|
IBOutlet id mAutoCompleteTextField;
|
||||||
|
}
|
||||||
|
@end
|
|
@ -0,0 +1,22 @@
|
||||||
|
#import "BrowserWindow.h"
|
||||||
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
|
||||||
|
static const int kEscapeKeyCode = 53;
|
||||||
|
|
||||||
|
@implementation BrowserWindow
|
||||||
|
|
||||||
|
- (void)sendEvent:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
// We need this hack because NSWindow::sendEvent will eat the escape key
|
||||||
|
// and won't pass it down to the key handler of responders in the window.
|
||||||
|
// We have to override sendEvent for all of our escape key needs.
|
||||||
|
if ([theEvent keyCode] == kEscapeKeyCode && [theEvent type] == NSKeyDown) {
|
||||||
|
NSText *fieldEditor = [self fieldEditor:NO forObject:mAutoCompleteTextField];
|
||||||
|
if (fieldEditor && [self firstResponder] == fieldEditor) {
|
||||||
|
[mAutoCompleteTextField revertText];
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
[super sendEvent:theEvent];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -0,0 +1,9 @@
|
||||||
|
/* BrowserWindow */
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface BrowserWindow : NSWindow
|
||||||
|
{
|
||||||
|
IBOutlet id mAutoCompleteTextField;
|
||||||
|
}
|
||||||
|
@end
|
|
@ -0,0 +1,22 @@
|
||||||
|
#import "BrowserWindow.h"
|
||||||
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
|
||||||
|
static const int kEscapeKeyCode = 53;
|
||||||
|
|
||||||
|
@implementation BrowserWindow
|
||||||
|
|
||||||
|
- (void)sendEvent:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
// We need this hack because NSWindow::sendEvent will eat the escape key
|
||||||
|
// and won't pass it down to the key handler of responders in the window.
|
||||||
|
// We have to override sendEvent for all of our escape key needs.
|
||||||
|
if ([theEvent keyCode] == kEscapeKeyCode && [theEvent type] == NSKeyDown) {
|
||||||
|
NSText *fieldEditor = [self fieldEditor:NO forObject:mAutoCompleteTextField];
|
||||||
|
if (fieldEditor && [self firstResponder] == fieldEditor) {
|
||||||
|
[mAutoCompleteTextField revertText];
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
[super sendEvent:theEvent];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -16,7 +16,12 @@
|
||||||
SUPERCLASS = NSObject;
|
SUPERCLASS = NSObject;
|
||||||
},
|
},
|
||||||
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
||||||
{CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
|
{
|
||||||
|
CLASS = BrowserWindow;
|
||||||
|
LANGUAGE = ObjC;
|
||||||
|
OUTLETS = {mAutoCompleteTextField = id; };
|
||||||
|
SUPERCLASS = NSWindow;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ACTIONS = {
|
ACTIONS = {
|
||||||
back = id;
|
back = id;
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
<key>336</key>
|
<key>336</key>
|
||||||
<string>630 666 200 132 0 0 1152 848 </string>
|
<string>630 666 200 132 0 0 1152 848 </string>
|
||||||
<key>365</key>
|
<key>365</key>
|
||||||
<string>22 587 93 162 0 0 1152 848 </string>
|
<string>25 719 93 162 0 0 1280 1002 </string>
|
||||||
<key>463</key>
|
<key>463</key>
|
||||||
<string>7 536 200 180 0 0 1152 848 </string>
|
<string>7 536 200 180 0 0 1152 848 </string>
|
||||||
<key>56</key>
|
<key>56</key>
|
||||||
<string>404 546 343 68 0 0 1152 848 </string>
|
<string>442 634 343 68 0 0 1280 1002 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IBFramework Version</key>
|
<key>IBFramework Version</key>
|
||||||
<string>248.0</string>
|
<string>248.0</string>
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
<array>
|
<array>
|
||||||
<integer>497</integer>
|
<integer>497</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBOpenObjects</key>
|
|
||||||
<array>
|
|
||||||
<integer>365</integer>
|
|
||||||
</array>
|
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>5S60</string>
|
<string>5S60</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
Двоичный файл не отображается.
|
@ -42,7 +42,11 @@
|
||||||
nsIAutoCompleteListener *mListener;
|
nsIAutoCompleteListener *mListener;
|
||||||
|
|
||||||
NSString *mSearchString;
|
NSString *mSearchString;
|
||||||
|
|
||||||
|
// used to remember if backspace was pressed in complete: so we can check this in controlTextDidChange
|
||||||
BOOL mBackspaced;
|
BOOL mBackspaced;
|
||||||
|
// determines if the search currently pending should complete the default result when it is ready
|
||||||
|
BOOL mCompleteResult;
|
||||||
|
|
||||||
NSTimer *mOpenTimer;
|
NSTimer *mOpenTimer;
|
||||||
}
|
}
|
||||||
|
@ -53,15 +57,17 @@
|
||||||
- (NSTableView *) tableView;
|
- (NSTableView *) tableView;
|
||||||
- (int) visibleRows;
|
- (int) visibleRows;
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString;
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete;
|
||||||
- (void) performSearch;
|
- (void) performSearch;
|
||||||
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
||||||
- (void) searchTimer:(NSTimer *)aTimer;
|
- (void) searchTimer:(NSTimer *)aTimer;
|
||||||
|
- (void) clearResults;
|
||||||
|
|
||||||
- (void) completeDefaultResult;
|
- (void) completeDefaultResult;
|
||||||
- (void) completeSelectedResult;
|
- (void) completeSelectedResult;
|
||||||
- (void) completeResult:(int)aRow;
|
- (void) completeResult:(int)aRow;
|
||||||
- (void) enterResult:(int)aRow;
|
- (void) enterResult:(int)aRow;
|
||||||
|
- (void) revertText;
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow;
|
- (void) selectRowAt:(int)aRow;
|
||||||
- (void) selectRowBy:(int)aRows;
|
- (void) selectRowBy:(int)aRows;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "CHAutoCompleteTextField.h"
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
#import "BrowserWindowController.h"
|
||||||
#import "CHPageProxyIcon.h"
|
#import "CHPageProxyIcon.h"
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsMemory.h"
|
#include "nsMemory.h"
|
||||||
|
@ -69,6 +70,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mSearchString = nil;
|
mSearchString = nil;
|
||||||
mBackspaced = NO;
|
mBackspaced = NO;
|
||||||
|
mCompleteResult = NO;
|
||||||
mOpenTimer = nil;
|
mOpenTimer = nil;
|
||||||
|
|
||||||
mSession = nsnull;
|
mSession = nsnull;
|
||||||
|
@ -182,12 +184,14 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
// searching ////////////////////////////
|
// searching ////////////////////////////
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete
|
||||||
{
|
{
|
||||||
if (mSearchString)
|
if (mSearchString)
|
||||||
[mSearchString release];
|
[mSearchString release];
|
||||||
mSearchString = [aString retain];
|
mSearchString = [aString retain];
|
||||||
|
|
||||||
|
mCompleteResult = aComplete;
|
||||||
|
|
||||||
if ([self isOpen]) {
|
if ([self isOpen]) {
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
} else {
|
} else {
|
||||||
|
@ -200,11 +204,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
||||||
userInfo:nil repeats:NO] retain];
|
userInfo:nil repeats:NO] retain];
|
||||||
|
|
||||||
// we need to reset mBackspaced here, or else it might still be true if the user backspaces
|
|
||||||
// the textfield to be empty, then starts typing, because it is normally reset in selectRowAt
|
|
||||||
// which won't be called until perhaps after several keystrokes (due to the timer)
|
|
||||||
mBackspaced = NO;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +253,17 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) clearResults
|
||||||
|
{
|
||||||
|
// clear out search data
|
||||||
|
mSearchString = nil;
|
||||||
|
mResults = nil;
|
||||||
|
|
||||||
|
[mDataSource setResults:nil];
|
||||||
|
|
||||||
|
[self closePopup];
|
||||||
|
}
|
||||||
|
|
||||||
// handling the popup /////////////////////////////////
|
// handling the popup /////////////////////////////////
|
||||||
|
|
||||||
- (void) openPopup
|
- (void) openPopup
|
||||||
|
@ -271,6 +281,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSPoint locationOrigin;
|
NSPoint locationOrigin;
|
||||||
int tableHeight;
|
int tableHeight;
|
||||||
|
|
||||||
|
if ([self visibleRows] == 0) {
|
||||||
|
[self closePopup];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// get the origin of the location bar in coordinates of the root view
|
// get the origin of the location bar in coordinates of the root view
|
||||||
locationFrame = [[self superview] frame];
|
locationFrame = [[self superview] frame];
|
||||||
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
||||||
|
@ -307,12 +322,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
PRInt32 defaultRow;
|
PRInt32 defaultRow;
|
||||||
mResults->GetDefaultItemIndex(&defaultRow);
|
mResults->GetDefaultItemIndex(&defaultRow);
|
||||||
|
|
||||||
if (mBackspaced) {
|
if (mCompleteResult) {
|
||||||
[self selectRowAt:-1];
|
|
||||||
mBackspaced = NO;
|
|
||||||
} else {
|
|
||||||
[self selectRowAt:defaultRow];
|
[self selectRowAt:defaultRow];
|
||||||
[self completeResult:defaultRow];
|
[self completeResult:defaultRow];
|
||||||
|
} else {
|
||||||
|
[self selectRowAt:-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +341,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSText *text;
|
NSText *text;
|
||||||
NSString *result1;
|
NSString *result1;
|
||||||
|
|
||||||
if (aRow < 0) {
|
if (aRow < 0 && mSearchString) {
|
||||||
[self setStringValue:mSearchString];
|
[self setStringValue:mSearchString];
|
||||||
} else {
|
} else {
|
||||||
if ([mDataSource rowCount] <= 0)
|
if ([mDataSource rowCount] <= 0)
|
||||||
|
@ -351,10 +365,27 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) enterResult:(int)aRow
|
- (void) enterResult:(int)aRow
|
||||||
{
|
{
|
||||||
if ([self isOpen] && aRow >= 0) {
|
if (aRow >= 0 && [mDataSource rowCount] > 0) {
|
||||||
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
||||||
[self selectText:self];
|
[self selectText:self];
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
|
} else if (mOpenTimer) {
|
||||||
|
// if there was a search timer going when we hit enter, cancel it
|
||||||
|
[mOpenTimer invalidate];
|
||||||
|
[mOpenTimer release];
|
||||||
|
mOpenTimer = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) revertText
|
||||||
|
{
|
||||||
|
BrowserWindowController *controller = (BrowserWindowController *)[[self window] windowController];
|
||||||
|
NSString *url = [[controller getBrowserWrapper] getCurrentURLSpec];
|
||||||
|
if (url) {
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
[self setStringValue:url];
|
||||||
|
[self selectText:self];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,9 +393,15 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow
|
- (void) selectRowAt:(int)aRow
|
||||||
{
|
{
|
||||||
|
if (aRow >= -1 && [mDataSource rowCount] > 0) {
|
||||||
|
// show the popup
|
||||||
|
if ([mPopupWin isVisible] == NO)
|
||||||
|
[mPopupWin orderFront:nil];
|
||||||
|
|
||||||
[mTableView selectRow:aRow byExtendingSelection:NO];
|
[mTableView selectRow:aRow byExtendingSelection:NO];
|
||||||
[mTableView scrollRowToVisible: aRow];
|
[mTableView scrollRowToVisible: aRow];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) selectRowBy:(int)aRows
|
- (void) selectRowBy:(int)aRows
|
||||||
{
|
{
|
||||||
|
@ -414,11 +451,20 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self resizePopup];
|
[self resizePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField ////////////////////////////////////////////
|
// NSTextField delegate //////////////////////////////////
|
||||||
|
|
||||||
- (void)controlTextDidChange:(NSNotification *)aNotification
|
- (void)controlTextDidChange:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[self startSearch:[self stringValue]];
|
NSText *text = [[self window] fieldEditor:NO forObject:self];
|
||||||
|
NSRange range = [text selectedRange];
|
||||||
|
|
||||||
|
// make sure we're typing at the end of the string
|
||||||
|
if (range.location == [[self stringValue] length])
|
||||||
|
[self startSearch:[self stringValue] complete:!mBackspaced];
|
||||||
|
else
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
mBackspaced = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
||||||
|
@ -426,8 +472,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField delegate //////////////////////////////////
|
|
||||||
|
|
||||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
||||||
{
|
{
|
||||||
if (command == @selector(insertNewline:)) {
|
if (command == @selector(insertNewline:)) {
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
F517395B020CE3740189DA0C,
|
F517395B020CE3740189DA0C,
|
||||||
F528E21A020FD9620168DE43,
|
F528E21A020FD9620168DE43,
|
||||||
F5DE10EA0209DC0601A967DF,
|
F5DE10EA0209DC0601A967DF,
|
||||||
|
F632AF8402B9AEBB01000103,
|
||||||
F5DE10EB0209DC0601A967DF,
|
F5DE10EB0209DC0601A967DF,
|
||||||
F51B70B7026EC98B01A80166,
|
F51B70B7026EC98B01A80166,
|
||||||
F5AE04BA0206A4FE01A967DF,
|
F5AE04BA0206A4FE01A967DF,
|
||||||
|
@ -447,6 +448,7 @@
|
||||||
2E748B74029A448D4B000102,
|
2E748B74029A448D4B000102,
|
||||||
F53E012A02AEE91D01A967F3,
|
F53E012A02AEE91D01A967F3,
|
||||||
F53E013302AEEA2901A967F3,
|
F53E013302AEEA2901A967F3,
|
||||||
|
F632AF8502B9AEBB01000103,
|
||||||
);
|
);
|
||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
name = Headers;
|
name = Headers;
|
||||||
|
@ -560,6 +562,7 @@
|
||||||
2EEC3E64028138724B000102,
|
2EEC3E64028138724B000102,
|
||||||
2E748B75029A448D4B000102,
|
2E748B75029A448D4B000102,
|
||||||
F53E012D02AEE93701A967F3,
|
F53E012D02AEE93701A967F3,
|
||||||
|
F632AF8602B9AEBC01000103,
|
||||||
);
|
);
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
name = Sources;
|
name = Sources;
|
||||||
|
@ -1196,6 +1199,7 @@
|
||||||
F517395A020CE3740189DA0C,
|
F517395A020CE3740189DA0C,
|
||||||
F528E218020FD8400168DE43,
|
F528E218020FD8400168DE43,
|
||||||
F5DE10E70209DC0601A967DF,
|
F5DE10E70209DC0601A967DF,
|
||||||
|
F632AF8302B9AEBB01000103,
|
||||||
F5DE10E80209DC0601A967DF,
|
F5DE10E80209DC0601A967DF,
|
||||||
F51B70B6026EC98B01A80166,
|
F51B70B6026EC98B01A80166,
|
||||||
F5125A110202064D01FAFD9F,
|
F5125A110202064D01FAFD9F,
|
||||||
|
@ -2006,7 +2010,6 @@
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
path = CHPreferenceManager.mm;
|
path = CHPreferenceManager.mm;
|
||||||
refType = 4;
|
refType = 4;
|
||||||
indentWidth = 2;
|
|
||||||
};
|
};
|
||||||
F52D5CD9027D3D5001A80166 = {
|
F52D5CD9027D3D5001A80166 = {
|
||||||
fileRef = F52D5CD7027D3D5001A80166;
|
fileRef = F52D5CD7027D3D5001A80166;
|
||||||
|
@ -6575,6 +6578,28 @@
|
||||||
//F62
|
//F62
|
||||||
//F63
|
//F63
|
||||||
//F64
|
//F64
|
||||||
|
F632AF8302B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.h;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8402B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.mm;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8502B9AEBB01000103 = {
|
||||||
|
fileRef = F632AF8302B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
F632AF8602B9AEBC01000103 = {
|
||||||
|
fileRef = F632AF8402B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
F655020201B480F201A962F7 = {
|
F655020201B480F201A962F7 = {
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
name = libnkcache.dylib;
|
name = libnkcache.dylib;
|
||||||
|
|
|
@ -16,7 +16,12 @@
|
||||||
SUPERCLASS = NSObject;
|
SUPERCLASS = NSObject;
|
||||||
},
|
},
|
||||||
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
||||||
{CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
|
{
|
||||||
|
CLASS = BrowserWindow;
|
||||||
|
LANGUAGE = ObjC;
|
||||||
|
OUTLETS = {mAutoCompleteTextField = id; };
|
||||||
|
SUPERCLASS = NSWindow;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ACTIONS = {
|
ACTIONS = {
|
||||||
back = id;
|
back = id;
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
<key>336</key>
|
<key>336</key>
|
||||||
<string>630 666 200 132 0 0 1152 848 </string>
|
<string>630 666 200 132 0 0 1152 848 </string>
|
||||||
<key>365</key>
|
<key>365</key>
|
||||||
<string>22 587 93 162 0 0 1152 848 </string>
|
<string>25 719 93 162 0 0 1280 1002 </string>
|
||||||
<key>463</key>
|
<key>463</key>
|
||||||
<string>7 536 200 180 0 0 1152 848 </string>
|
<string>7 536 200 180 0 0 1152 848 </string>
|
||||||
<key>56</key>
|
<key>56</key>
|
||||||
<string>404 546 343 68 0 0 1152 848 </string>
|
<string>442 634 343 68 0 0 1280 1002 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IBFramework Version</key>
|
<key>IBFramework Version</key>
|
||||||
<string>248.0</string>
|
<string>248.0</string>
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
<array>
|
<array>
|
||||||
<integer>497</integer>
|
<integer>497</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBOpenObjects</key>
|
|
||||||
<array>
|
|
||||||
<integer>365</integer>
|
|
||||||
</array>
|
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>5S60</string>
|
<string>5S60</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
Двоичный файл не отображается.
|
@ -11,6 +11,7 @@
|
||||||
F517395B020CE3740189DA0C,
|
F517395B020CE3740189DA0C,
|
||||||
F528E21A020FD9620168DE43,
|
F528E21A020FD9620168DE43,
|
||||||
F5DE10EA0209DC0601A967DF,
|
F5DE10EA0209DC0601A967DF,
|
||||||
|
F632AF8402B9AEBB01000103,
|
||||||
F5DE10EB0209DC0601A967DF,
|
F5DE10EB0209DC0601A967DF,
|
||||||
F51B70B7026EC98B01A80166,
|
F51B70B7026EC98B01A80166,
|
||||||
F5AE04BA0206A4FE01A967DF,
|
F5AE04BA0206A4FE01A967DF,
|
||||||
|
@ -447,6 +448,7 @@
|
||||||
2E748B74029A448D4B000102,
|
2E748B74029A448D4B000102,
|
||||||
F53E012A02AEE91D01A967F3,
|
F53E012A02AEE91D01A967F3,
|
||||||
F53E013302AEEA2901A967F3,
|
F53E013302AEEA2901A967F3,
|
||||||
|
F632AF8502B9AEBB01000103,
|
||||||
);
|
);
|
||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
name = Headers;
|
name = Headers;
|
||||||
|
@ -560,6 +562,7 @@
|
||||||
2EEC3E64028138724B000102,
|
2EEC3E64028138724B000102,
|
||||||
2E748B75029A448D4B000102,
|
2E748B75029A448D4B000102,
|
||||||
F53E012D02AEE93701A967F3,
|
F53E012D02AEE93701A967F3,
|
||||||
|
F632AF8602B9AEBC01000103,
|
||||||
);
|
);
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
name = Sources;
|
name = Sources;
|
||||||
|
@ -1196,6 +1199,7 @@
|
||||||
F517395A020CE3740189DA0C,
|
F517395A020CE3740189DA0C,
|
||||||
F528E218020FD8400168DE43,
|
F528E218020FD8400168DE43,
|
||||||
F5DE10E70209DC0601A967DF,
|
F5DE10E70209DC0601A967DF,
|
||||||
|
F632AF8302B9AEBB01000103,
|
||||||
F5DE10E80209DC0601A967DF,
|
F5DE10E80209DC0601A967DF,
|
||||||
F51B70B6026EC98B01A80166,
|
F51B70B6026EC98B01A80166,
|
||||||
F5125A110202064D01FAFD9F,
|
F5125A110202064D01FAFD9F,
|
||||||
|
@ -2006,7 +2010,6 @@
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
path = CHPreferenceManager.mm;
|
path = CHPreferenceManager.mm;
|
||||||
refType = 4;
|
refType = 4;
|
||||||
indentWidth = 2;
|
|
||||||
};
|
};
|
||||||
F52D5CD9027D3D5001A80166 = {
|
F52D5CD9027D3D5001A80166 = {
|
||||||
fileRef = F52D5CD7027D3D5001A80166;
|
fileRef = F52D5CD7027D3D5001A80166;
|
||||||
|
@ -6575,6 +6578,28 @@
|
||||||
//F62
|
//F62
|
||||||
//F63
|
//F63
|
||||||
//F64
|
//F64
|
||||||
|
F632AF8302B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.h;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8402B9AEBB01000103 = {
|
||||||
|
isa = PBXFileReference;
|
||||||
|
path = BrowserWindow.mm;
|
||||||
|
refType = 4;
|
||||||
|
};
|
||||||
|
F632AF8502B9AEBB01000103 = {
|
||||||
|
fileRef = F632AF8302B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
F632AF8602B9AEBC01000103 = {
|
||||||
|
fileRef = F632AF8402B9AEBB01000103;
|
||||||
|
isa = PBXBuildFile;
|
||||||
|
settings = {
|
||||||
|
};
|
||||||
|
};
|
||||||
F655020201B480F201A962F7 = {
|
F655020201B480F201A962F7 = {
|
||||||
isa = PBXFileReference;
|
isa = PBXFileReference;
|
||||||
name = libnkcache.dylib;
|
name = libnkcache.dylib;
|
||||||
|
|
|
@ -16,7 +16,12 @@
|
||||||
SUPERCLASS = NSObject;
|
SUPERCLASS = NSObject;
|
||||||
},
|
},
|
||||||
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
{CLASS = BookmarksToolbar; LANGUAGE = ObjC; SUPERCLASS = NSView; },
|
||||||
{CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; },
|
{
|
||||||
|
CLASS = BrowserWindow;
|
||||||
|
LANGUAGE = ObjC;
|
||||||
|
OUTLETS = {mAutoCompleteTextField = id; };
|
||||||
|
SUPERCLASS = NSWindow;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ACTIONS = {
|
ACTIONS = {
|
||||||
back = id;
|
back = id;
|
||||||
|
|
|
@ -19,11 +19,11 @@
|
||||||
<key>336</key>
|
<key>336</key>
|
||||||
<string>630 666 200 132 0 0 1152 848 </string>
|
<string>630 666 200 132 0 0 1152 848 </string>
|
||||||
<key>365</key>
|
<key>365</key>
|
||||||
<string>22 587 93 162 0 0 1152 848 </string>
|
<string>25 719 93 162 0 0 1280 1002 </string>
|
||||||
<key>463</key>
|
<key>463</key>
|
||||||
<string>7 536 200 180 0 0 1152 848 </string>
|
<string>7 536 200 180 0 0 1152 848 </string>
|
||||||
<key>56</key>
|
<key>56</key>
|
||||||
<string>404 546 343 68 0 0 1152 848 </string>
|
<string>442 634 343 68 0 0 1280 1002 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>IBFramework Version</key>
|
<key>IBFramework Version</key>
|
||||||
<string>248.0</string>
|
<string>248.0</string>
|
||||||
|
@ -41,10 +41,6 @@
|
||||||
<array>
|
<array>
|
||||||
<integer>497</integer>
|
<integer>497</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBOpenObjects</key>
|
|
||||||
<array>
|
|
||||||
<integer>365</integer>
|
|
||||||
</array>
|
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>5S60</string>
|
<string>5S60</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
Двоичные данные
chimera/resources/localized/English.lproj/BrowserWindow.nib/objects.nib
сгенерированный
Двоичные данные
chimera/resources/localized/English.lproj/BrowserWindow.nib/objects.nib
сгенерированный
Двоичный файл не отображается.
|
@ -42,7 +42,11 @@
|
||||||
nsIAutoCompleteListener *mListener;
|
nsIAutoCompleteListener *mListener;
|
||||||
|
|
||||||
NSString *mSearchString;
|
NSString *mSearchString;
|
||||||
|
|
||||||
|
// used to remember if backspace was pressed in complete: so we can check this in controlTextDidChange
|
||||||
BOOL mBackspaced;
|
BOOL mBackspaced;
|
||||||
|
// determines if the search currently pending should complete the default result when it is ready
|
||||||
|
BOOL mCompleteResult;
|
||||||
|
|
||||||
NSTimer *mOpenTimer;
|
NSTimer *mOpenTimer;
|
||||||
}
|
}
|
||||||
|
@ -53,15 +57,17 @@
|
||||||
- (NSTableView *) tableView;
|
- (NSTableView *) tableView;
|
||||||
- (int) visibleRows;
|
- (int) visibleRows;
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString;
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete;
|
||||||
- (void) performSearch;
|
- (void) performSearch;
|
||||||
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
- (void) dataReady:(nsIAutoCompleteResults*)aResults status:(AutoCompleteStatus)aStatus;
|
||||||
- (void) searchTimer:(NSTimer *)aTimer;
|
- (void) searchTimer:(NSTimer *)aTimer;
|
||||||
|
- (void) clearResults;
|
||||||
|
|
||||||
- (void) completeDefaultResult;
|
- (void) completeDefaultResult;
|
||||||
- (void) completeSelectedResult;
|
- (void) completeSelectedResult;
|
||||||
- (void) completeResult:(int)aRow;
|
- (void) completeResult:(int)aRow;
|
||||||
- (void) enterResult:(int)aRow;
|
- (void) enterResult:(int)aRow;
|
||||||
|
- (void) revertText;
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow;
|
- (void) selectRowAt:(int)aRow;
|
||||||
- (void) selectRowBy:(int)aRows;
|
- (void) selectRowBy:(int)aRows;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import "CHAutoCompleteTextField.h"
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
#import "BrowserWindowController.h"
|
||||||
#import "CHPageProxyIcon.h"
|
#import "CHPageProxyIcon.h"
|
||||||
#include "nsIServiceManager.h"
|
#include "nsIServiceManager.h"
|
||||||
#include "nsMemory.h"
|
#include "nsMemory.h"
|
||||||
|
@ -69,6 +70,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mSearchString = nil;
|
mSearchString = nil;
|
||||||
mBackspaced = NO;
|
mBackspaced = NO;
|
||||||
|
mCompleteResult = NO;
|
||||||
mOpenTimer = nil;
|
mOpenTimer = nil;
|
||||||
|
|
||||||
mSession = nsnull;
|
mSession = nsnull;
|
||||||
|
@ -182,12 +184,14 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
// searching ////////////////////////////
|
// searching ////////////////////////////
|
||||||
|
|
||||||
- (void) startSearch:(NSString*)aString
|
- (void) startSearch:(NSString*)aString complete:(BOOL)aComplete
|
||||||
{
|
{
|
||||||
if (mSearchString)
|
if (mSearchString)
|
||||||
[mSearchString release];
|
[mSearchString release];
|
||||||
mSearchString = [aString retain];
|
mSearchString = [aString retain];
|
||||||
|
|
||||||
|
mCompleteResult = aComplete;
|
||||||
|
|
||||||
if ([self isOpen]) {
|
if ([self isOpen]) {
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
} else {
|
} else {
|
||||||
|
@ -200,11 +204,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
mOpenTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(searchTimer:)
|
||||||
userInfo:nil repeats:NO] retain];
|
userInfo:nil repeats:NO] retain];
|
||||||
|
|
||||||
// we need to reset mBackspaced here, or else it might still be true if the user backspaces
|
|
||||||
// the textfield to be empty, then starts typing, because it is normally reset in selectRowAt
|
|
||||||
// which won't be called until perhaps after several keystrokes (due to the timer)
|
|
||||||
mBackspaced = NO;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,6 +253,17 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self performSearch];
|
[self performSearch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void) clearResults
|
||||||
|
{
|
||||||
|
// clear out search data
|
||||||
|
mSearchString = nil;
|
||||||
|
mResults = nil;
|
||||||
|
|
||||||
|
[mDataSource setResults:nil];
|
||||||
|
|
||||||
|
[self closePopup];
|
||||||
|
}
|
||||||
|
|
||||||
// handling the popup /////////////////////////////////
|
// handling the popup /////////////////////////////////
|
||||||
|
|
||||||
- (void) openPopup
|
- (void) openPopup
|
||||||
|
@ -271,6 +281,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSPoint locationOrigin;
|
NSPoint locationOrigin;
|
||||||
int tableHeight;
|
int tableHeight;
|
||||||
|
|
||||||
|
if ([self visibleRows] == 0) {
|
||||||
|
[self closePopup];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// get the origin of the location bar in coordinates of the root view
|
// get the origin of the location bar in coordinates of the root view
|
||||||
locationFrame = [[self superview] frame];
|
locationFrame = [[self superview] frame];
|
||||||
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
locationOrigin = [[[self superview] superview] convertPoint:locationFrame.origin
|
||||||
|
@ -307,12 +322,11 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
PRInt32 defaultRow;
|
PRInt32 defaultRow;
|
||||||
mResults->GetDefaultItemIndex(&defaultRow);
|
mResults->GetDefaultItemIndex(&defaultRow);
|
||||||
|
|
||||||
if (mBackspaced) {
|
if (mCompleteResult) {
|
||||||
[self selectRowAt:-1];
|
|
||||||
mBackspaced = NO;
|
|
||||||
} else {
|
|
||||||
[self selectRowAt:defaultRow];
|
[self selectRowAt:defaultRow];
|
||||||
[self completeResult:defaultRow];
|
[self completeResult:defaultRow];
|
||||||
|
} else {
|
||||||
|
[self selectRowAt:-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +341,7 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
NSText *text;
|
NSText *text;
|
||||||
NSString *result1;
|
NSString *result1;
|
||||||
|
|
||||||
if (aRow < 0) {
|
if (aRow < 0 && mSearchString) {
|
||||||
[self setStringValue:mSearchString];
|
[self setStringValue:mSearchString];
|
||||||
} else {
|
} else {
|
||||||
if ([mDataSource rowCount] <= 0)
|
if ([mDataSource rowCount] <= 0)
|
||||||
|
@ -351,10 +365,27 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) enterResult:(int)aRow
|
- (void) enterResult:(int)aRow
|
||||||
{
|
{
|
||||||
if ([self isOpen] && aRow >= 0) {
|
if (aRow >= 0 && [mDataSource rowCount] > 0) {
|
||||||
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
[self setStringValue: [mDataSource resultString:[mTableView selectedRow] column:@"col1"]];
|
||||||
[self selectText:self];
|
[self selectText:self];
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
|
} else if (mOpenTimer) {
|
||||||
|
// if there was a search timer going when we hit enter, cancel it
|
||||||
|
[mOpenTimer invalidate];
|
||||||
|
[mOpenTimer release];
|
||||||
|
mOpenTimer = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) revertText
|
||||||
|
{
|
||||||
|
BrowserWindowController *controller = (BrowserWindowController *)[[self window] windowController];
|
||||||
|
NSString *url = [[controller getBrowserWrapper] getCurrentURLSpec];
|
||||||
|
if (url) {
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
[self setStringValue:url];
|
||||||
|
[self selectText:self];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,9 +393,15 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
|
|
||||||
- (void) selectRowAt:(int)aRow
|
- (void) selectRowAt:(int)aRow
|
||||||
{
|
{
|
||||||
|
if (aRow >= -1 && [mDataSource rowCount] > 0) {
|
||||||
|
// show the popup
|
||||||
|
if ([mPopupWin isVisible] == NO)
|
||||||
|
[mPopupWin orderFront:nil];
|
||||||
|
|
||||||
[mTableView selectRow:aRow byExtendingSelection:NO];
|
[mTableView selectRow:aRow byExtendingSelection:NO];
|
||||||
[mTableView scrollRowToVisible: aRow];
|
[mTableView scrollRowToVisible: aRow];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) selectRowBy:(int)aRows
|
- (void) selectRowBy:(int)aRows
|
||||||
{
|
{
|
||||||
|
@ -414,11 +451,20 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self resizePopup];
|
[self resizePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField ////////////////////////////////////////////
|
// NSTextField delegate //////////////////////////////////
|
||||||
|
|
||||||
- (void)controlTextDidChange:(NSNotification *)aNotification
|
- (void)controlTextDidChange:(NSNotification *)aNotification
|
||||||
{
|
{
|
||||||
[self startSearch:[self stringValue]];
|
NSText *text = [[self window] fieldEditor:NO forObject:self];
|
||||||
|
NSRange range = [text selectedRange];
|
||||||
|
|
||||||
|
// make sure we're typing at the end of the string
|
||||||
|
if (range.location == [[self stringValue] length])
|
||||||
|
[self startSearch:[self stringValue] complete:!mBackspaced];
|
||||||
|
else
|
||||||
|
[self clearResults];
|
||||||
|
|
||||||
|
mBackspaced = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
|
||||||
|
@ -426,8 +472,6 @@ NS_IMPL_ISUPPORTS1(AutoCompleteListener, nsIAutoCompleteListener)
|
||||||
[self closePopup];
|
[self closePopup];
|
||||||
}
|
}
|
||||||
|
|
||||||
// NSTextField delegate //////////////////////////////////
|
|
||||||
|
|
||||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)command
|
||||||
{
|
{
|
||||||
if (command == @selector(insertNewline:)) {
|
if (command == @selector(insertNewline:)) {
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
/* BrowserWindow */
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface BrowserWindow : NSWindow
|
||||||
|
{
|
||||||
|
IBOutlet id mAutoCompleteTextField;
|
||||||
|
}
|
||||||
|
@end
|
|
@ -0,0 +1,22 @@
|
||||||
|
#import "BrowserWindow.h"
|
||||||
|
#import "CHAutoCompleteTextField.h"
|
||||||
|
|
||||||
|
static const int kEscapeKeyCode = 53;
|
||||||
|
|
||||||
|
@implementation BrowserWindow
|
||||||
|
|
||||||
|
- (void)sendEvent:(NSEvent *)theEvent
|
||||||
|
{
|
||||||
|
// We need this hack because NSWindow::sendEvent will eat the escape key
|
||||||
|
// and won't pass it down to the key handler of responders in the window.
|
||||||
|
// We have to override sendEvent for all of our escape key needs.
|
||||||
|
if ([theEvent keyCode] == kEscapeKeyCode && [theEvent type] == NSKeyDown) {
|
||||||
|
NSText *fieldEditor = [self fieldEditor:NO forObject:mAutoCompleteTextField];
|
||||||
|
if (fieldEditor && [self firstResponder] == fieldEditor) {
|
||||||
|
[mAutoCompleteTextField revertText];
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
[super sendEvent:theEvent];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
Загрузка…
Ссылка в новой задаче