Revision: 22224 http://sourceforge.net/p/bibdesk/svn/22224 Author: hofman Date: 2018-05-07 09:44:32 +0000 (Mon, 07 May 2018) Log Message: ----------- Use standard completion controller, this handles undo better and I cannot figure out how to does
Modified Paths: -------------- trunk/bibdesk/BDSKFieldEditor.h trunk/bibdesk/BDSKFieldEditor.m Modified: trunk/bibdesk/BDSKFieldEditor.h =================================================================== --- trunk/bibdesk/BDSKFieldEditor.h 2018-05-07 06:34:11 UTC (rev 22223) +++ trunk/bibdesk/BDSKFieldEditor.h 2018-05-07 09:44:32 UTC (rev 22224) @@ -54,6 +54,7 @@ NSMutableArray *delegatedDraggedTypes; BOOL isEditing; BOOL isAutoComplete; + BOOL isCompleting; } - (void)registerForDelegatedDraggedTypes:(NSArray *)pboardTypes; - (id <BDSKFieldEditorDelegate>)delegate; Modified: trunk/bibdesk/BDSKFieldEditor.m =================================================================== --- trunk/bibdesk/BDSKFieldEditor.m 2018-05-07 06:34:11 UTC (rev 22223) +++ trunk/bibdesk/BDSKFieldEditor.m 2018-05-07 09:44:32 UTC (rev 22224) @@ -56,9 +56,11 @@ [self setFieldEditor:YES]; delegatedDraggedTypes = nil; isEditing = NO; + isAutoComplete = NO; + isCompleting = NO; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(handleTextDidBeginEditingNotification:) + selector:@selector(handleTextDidBeginEditingNotification:) name:NSTextDidBeginEditingNotification object:self]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -210,28 +212,10 @@ #pragma mark Completion methods -static inline BOOL completionWindowIsVisibleForTextView(NSTextView *textView) -{ - BDSKTextViewCompletionController *controller = [BDSKTextViewCompletionController sharedController]; - return ([[controller window] isVisible] && [[controller currentTextView] isEqual:textView]); -} - -static inline BOOL forwardSelectorForCompletionInTextView(SEL selector, NSTextView *textView) -{ - BDSKPRECONDITION([[BDSKTextViewCompletionController sharedController] respondsToSelector:selector]); - if(completionWindowIsVisibleForTextView(textView)){ - [[BDSKTextViewCompletionController sharedController] performSelector:selector withObject:nil]; - return YES; - } - return NO; -} - // insertText: and deleteBackward: affect the text content, so we send to super first, then autocomplete unconditionally since the completion controller needs to see the changes - (void)insertText:(id)insertString { [super insertText:insertString]; [self doAutoCompleteIfPossible]; - // passing a nil argument to the completion controller's insertText: is safe, and we can ensure the completion window is visible this way - forwardSelectorForCompletionInTextView(_cmd, self); } - (void)deleteBackward:(id)sender { @@ -238,41 +222,8 @@ [super deleteBackward:(id)sender]; // deleting a spelling error should also show the completions again [self doAutoCompleteIfPossible]; - forwardSelectorForCompletionInTextView(_cmd, self); } -// moveLeft and moveRight should happen regardless of completion, or you can't navigate the line with arrow keys -- (void)moveLeft:(id)sender { - forwardSelectorForCompletionInTextView(_cmd, self); - [super moveLeft:sender]; -} - -- (void)moveRight:(id)sender { - forwardSelectorForCompletionInTextView(_cmd, self); - [super moveRight:sender]; -} - -// the following movement methods are conditional based on whether the autocomplete window is visible -- (void)moveUp:(id)sender { - if(forwardSelectorForCompletionInTextView(_cmd, self) == NO) - [super moveUp:sender]; -} - -- (void)moveDown:(id)sender { - if(forwardSelectorForCompletionInTextView(_cmd, self) == NO) - [super moveDown:sender]; -} - -- (void)insertTab:(id)sender { - if(forwardSelectorForCompletionInTextView(_cmd, self) == NO) - [super insertTab:sender]; -} - -- (void)insertNewline:(id)sender { - if(forwardSelectorForCompletionInTextView(_cmd, self) == NO) - [super insertNewline:sender]; -} - - (NSRange)rangeForUserCompletion { // @@ check this if we have problems inserting accented characters; super's implementation can mess that up BDSKPRECONDITION([self markedRange].length == 0); @@ -304,43 +255,12 @@ return completions; } -- (void)complete:(id)sender; -{ - // forward this method so the controller can handle cancellation and undo - if(forwardSelectorForCompletionInTextView(_cmd, self)) - return; - - NSRange selRange = [self rangeForUserCompletion]; - NSString *string = [self string]; - if(selRange.location == NSNotFound || [string isEqualToString:@""] || selRange.length == 0) - return; - - // make sure to initialize this - NSInteger idx = 0; - NSArray *labels = nil; - NSArray *completions = [self completionsForPartialWordRange:selRange indexOfSelectedItem:&idx]; - - [[BDSKTextViewCompletionController sharedController] displayCompletions:completions indexOfSelectedItem:idx forPartialWordRange:selRange originalString:[string substringWithRange:selRange] forTextView:self]; +- (void)complete:(id)sender { + isCompleting = YES; + [super complete:sender]; + isCompleting = NO; } -- (NSRange)selectionRangeForProposedRange:(NSRange)proposedSelRange granularity:(NSSelectionGranularity)granularity { - if(completionWindowIsVisibleForTextView(self)) - [[BDSKTextViewCompletionController sharedController] endDisplayNoComplete]; - return [super selectionRangeForProposedRange:proposedSelRange granularity:granularity]; -} - -- (BOOL)becomeFirstResponder { - if(completionWindowIsVisibleForTextView(self)) - [[BDSKTextViewCompletionController sharedController] endDisplayNoComplete]; - return [super becomeFirstResponder]; -} - -- (BOOL)resignFirstResponder { - if(completionWindowIsVisibleForTextView(self)) - [[BDSKTextViewCompletionController sharedController] endDisplayNoComplete]; - return [super resignFirstResponder]; -} - - (id <BDSKFieldEditorDelegate>)delegate { return (id <BDSKFieldEditorDelegate>)[super delegate]; } - (void)setDelegate:(id <BDSKFieldEditorDelegate>)newDelegate { [super setDelegate:newDelegate]; } @@ -357,7 +277,7 @@ } - (void)doAutoCompleteIfPossible { - if (completionWindowIsVisibleForTextView(self) == NO && isEditing && + if (isEditing && isCompleting == NO && [[self delegate] respondsToSelector:@selector(textViewShouldAutoComplete:)] && [[self delegate] textViewShouldAutoComplete:self]) { isAutoComplete = YES; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Bibdesk-commit mailing list Bibdesk-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-commit