diff options
author | Bibiko <bibiko@eva.mpg.de> | 2009-04-05 16:12:30 +0000 |
---|---|---|
committer | Bibiko <bibiko@eva.mpg.de> | 2009-04-05 16:12:30 +0000 |
commit | cf83a507b6732f20f3b49b453333b7e20e80037b (patch) | |
tree | ff174a8e24eef270e227aa7e534b77be087b4e2b /Source | |
parent | b5372b610516c06aca19f17b262ba00df611ebc9 (diff) | |
download | sequelpro-cf83a507b6732f20f3b49b453333b7e20e80037b.tar.gz sequelpro-cf83a507b6732f20f3b49b453333b7e20e80037b.tar.bz2 sequelpro-cf83a507b6732f20f3b49b453333b7e20e80037b.zip |
• ADDED to SPTextViewAdditions:
- (NSRange)getRangeForCurrentWord
- (IBAction)selectCurrentWord:(id)sender;
- (IBAction)selectCurrentLine:(id)sender;
- (IBAction)doSelectionUpperCase:(id)sender;
- (IBAction)doSelectionLowerCase:(id)sender;
- (IBAction)doSelectionTitleCase:(id)sender;
- (IBAction)doDecomposedStringWithCanonicalMapping:(id)sender;
- (IBAction)doDecomposedStringWithCompatibilityMapping:(id)sender;
- (IBAction)doPrecomposedStringWithCanonicalMapping:(id)sender;
- (IBAction)doPrecomposedStringWithCompatibilityMapping:(id)sender;
• BOUNDED these IBAction to mainmenu.xib
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CMTextView.m | 147 | ||||
-rw-r--r-- | Source/SPTextViewAdditions.h | 10 | ||||
-rw-r--r-- | Source/SPTextViewAdditions.m | 180 |
3 files changed, 190 insertions, 147 deletions
diff --git a/Source/CMTextView.m b/Source/CMTextView.m index 49aee2cf..0493f0c8 100644 --- a/Source/CMTextView.m +++ b/Source/CMTextView.m @@ -117,46 +117,6 @@ YY_BUFFER_STATE yy_scan_string (const char *); } /* - * Select current line and returns found NSRange. - */ -- (NSRange)selectCurrentLine -{ - [self doCommandBySelector:@selector(moveToBeginningOfLine:)]; - [self doCommandBySelector:@selector(moveToEndOfLineAndModifySelection:)]; - - return([self selectedRange]); -} - -/* - * Select current word and returns found NSRange. - * finds: [| := caret] |word wo|rd word| - * If | is in between whitespaces nothing will be selected. - */ -- (NSRange)selectCurrentWord -{ - NSRange curRange = [self selectedRange]; - unsigned long curLocation = curRange.location; - [self doCommandBySelector:@selector(moveWordLeft:)]; - [self doCommandBySelector:@selector(moveWordRightAndModifySelection:)]; - - unsigned long newStartRange = [self selectedRange].location; - unsigned long newEndRange = newStartRange + [self selectedRange].length; - - // if current location does not intersect with found range - // then caret is at the begin of a word -> change strategy - if(curLocation < newStartRange || curLocation > newEndRange) - { - [self setSelectedRange:curRange]; - [self doCommandBySelector:@selector(moveWordRightAndModifySelection:)]; - } - - if([[[self string] substringWithRange:[self selectedRange]] rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].location != NSNotFound) - [self setSelectedRange:curRange]; - - return([self selectedRange]); -} - -/* * Copy selected text chunk as RTF to preserve syntax highlighting */ - (void)copyAsRTF @@ -175,76 +135,6 @@ YY_BUFFER_STATE yy_scan_string (const char *); } -/* - * Change selection or current word to upper case and preserves the selection. - */ -- (void)doSelectionUpperCase -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] uppercaseString]]; - [self setSelectedRange:curRange]; -} - -/* - * Change selection or current word to lower case and preserves the selection. - */ -- (void)doSelectionLowerCase -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] lowercaseString]]; - [self setSelectedRange:curRange]; -} - -/* - * Change selection or current word to title case and preserves the selection. - */ -- (void)doSelectionTitleCase -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] capitalizedString]]; - [self setSelectedRange:curRange]; -} - -/* - * Change selection or current word according to Unicode's NFD and preserves the selection. - */ -- (void)doDecomposedStringWithCanonicalMapping -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] decomposedStringWithCanonicalMapping]]; - [self setSelectedRange:curRange]; -} - -/* - * Change selection or current word according to Unicode's NFKD and preserves the selection. - */ -- (void)doDecomposedStringWithCompatibilityMapping -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] decomposedStringWithCompatibilityMapping]]; - [self setSelectedRange:curRange]; -} - -/* - * Change selection or current word according to Unicode's NFC and preserves the selection. - */ -- (void)doPrecomposedStringWithCanonicalMapping -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] precomposedStringWithCanonicalMapping]]; - [self setSelectedRange:curRange]; -} - -/* - * Change selection or current word according to Unicode's NFKC to title case and preserves the selection. - */ -- (void)doPrecomposedStringWithCompatibilityMapping -{ - NSRange curRange = [self selectedRange]; - [self insertText:[[[self string] substringWithRange:(curRange.length)?curRange:[self selectCurrentWord]] precomposedStringWithCompatibilityMapping]]; - [self setSelectedRange:curRange]; -} - /* * Handle some keyDown events in order to provide autopairing functionality (if enabled). @@ -271,20 +161,6 @@ YY_BUFFER_STATE yy_scan_string (const char *); // Note: switch(insertedCharacter) {} does not work instead use charactersIgnoringModifiers - if([charactersIgnMod isEqualToString:@"w"]) // ^W select current word - if(curFlags==(NSControlKeyMask)) - { - [self selectCurrentWord]; - return; - } - - if([charactersIgnMod isEqualToString:@"l"]) // ^L select current line - if(curFlags==(NSControlKeyMask)) - { - [self selectCurrentLine]; - return; - } - if([charactersIgnMod isEqualToString:@"c"]) // ^C copy as RTF if(curFlags==(NSControlKeyMask)) { @@ -292,29 +168,6 @@ YY_BUFFER_STATE yy_scan_string (const char *); return; } - if([charactersIgnMod isEqualToString:@"u"]) - // ^U upper case - if(curFlags==(NSControlKeyMask)) - { - [self doSelectionUpperCase]; - return; - } - // ^⌥U title case - if(curFlags==(NSControlKeyMask|NSAlternateKeyMask)) - { - [self doSelectionTitleCase]; - return; - } - - if([charactersIgnMod isEqualToString:@"U"]) // ^⇧U lower case - if(([theEvent modifierFlags] - & (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask))==(NSControlKeyMask)) - { - [self doSelectionLowerCase]; - return; - } - - // Only process for character autopairing if autopairing is enabled and a single character is being added. if (autopairEnabled && characters && [characters length] == 1) { diff --git a/Source/SPTextViewAdditions.h b/Source/SPTextViewAdditions.h index eacd7724..0aaa4cde 100644 --- a/Source/SPTextViewAdditions.h +++ b/Source/SPTextViewAdditions.h @@ -24,4 +24,14 @@ @interface NSTextView (SPTextViewAdditions) +- (IBAction)selectCurrentWord:(id)sender; +- (IBAction)selectCurrentLine:(id)sender; +- (IBAction)doSelectionUpperCase:(id)sender; +- (IBAction)doSelectionLowerCase:(id)sender; +- (IBAction)doSelectionTitleCase:(id)sender; +- (IBAction)doDecomposedStringWithCanonicalMapping:(id)sender; +- (IBAction)doDecomposedStringWithCompatibilityMapping:(id)sender; +- (IBAction)doPrecomposedStringWithCanonicalMapping:(id)sender; +- (IBAction)doPrecomposedStringWithCompatibilityMapping:(id)sender; + @end
\ No newline at end of file diff --git a/Source/SPTextViewAdditions.m b/Source/SPTextViewAdditions.m index 426cc1b5..6031399d 100644 --- a/Source/SPTextViewAdditions.m +++ b/Source/SPTextViewAdditions.m @@ -24,5 +24,185 @@ @implementation NSTextView (SPTextViewAdditions) +/* + * Returns the range of the current word. + * finds: [| := caret] |word wo|rd word| + * If | is in between whitespaces nothing will be selected. + */ +- (NSRange)getRangeForCurrentWord +{ + + NSRange curRange = [self selectedRange]; + unsigned long curLocation = curRange.location; + + [self moveWordLeft:self]; + [self moveWordRightAndModifySelection:self]; + + unsigned long newStartRange = [self selectedRange].location; + unsigned long newEndRange = newStartRange + [self selectedRange].length; + + // if current location does not intersect with found range + // then caret is at the begin of a word -> change strategy + if(curLocation < newStartRange || curLocation > newEndRange) + { + [self setSelectedRange:curRange]; + [self moveWordRightAndModifySelection:self]; + } + + if([[[self string] substringWithRange:[self selectedRange]] rangeOfCharacterFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].location != NSNotFound) + [self setSelectedRange:curRange]; + + NSRange wordRange = [self selectedRange]; + + [self setSelectedRange:curRange]; + + return(wordRange); + +} + +/* + * Select current word. + * finds: [| := caret] |word wo|rd word| + * If | is in between whitespaces nothing will be selected. + */ +- (IBAction)selectCurrentWord:(id)sender +{ + [self setSelectedRange:[self getRangeForCurrentWord]]; +} + +/* + * Select current line. + */ +- (IBAction)selectCurrentLine:(id)sender +{ + [self doCommandBySelector:@selector(moveToBeginningOfLine:)]; + [self doCommandBySelector:@selector(moveToEndOfLineAndModifySelection:)]; +} + +/* + * Change selection or current word to upper case and preserves the selection. + */ +- (IBAction)doSelectionUpperCase:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + [self insertText:[[[self string] substringWithRange:selRange] uppercaseString]]; + [self setSelectedRange:curRange]; +} + +/* + * Change selection or current word to lower case and preserves the selection. + */ +- (IBAction)doSelectionLowerCase:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + [self insertText:[[[self string] substringWithRange:selRange] lowercaseString]]; + [self setSelectedRange:curRange]; +} + +/* + * Change selection or current word to title case and preserves the selection. + */ +- (IBAction)doSelectionTitleCase:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + [self insertText:[[[self string] substringWithRange:selRange] capitalizedString]]; + [self setSelectedRange:curRange]; +} + +/* + * Change selection or current word according to Unicode's NFD and preserves the selection. + */ +- (IBAction)doDecomposedStringWithCanonicalMapping:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + NSString* convString = [[[self string] substringWithRange:selRange] decomposedStringWithCanonicalMapping]; + [self insertText:convString]; + + // correct range for combining characters + if(curRange.length) + [self setSelectedRange:NSMakeRange(selRange.location, [convString length])]; + else + // if no selection place the caret at the end of the current word + { + NSRange newRange = [self getRangeForCurrentWord]; + [self setSelectedRange:NSMakeRange(newRange.location + newRange.length, 0)]; + } +} + +/* + * Change selection or current word according to Unicode's NFKD and preserves the selection. + */ +- (IBAction)doDecomposedStringWithCompatibilityMapping:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + NSString* convString = [[[self string] substringWithRange:selRange] decomposedStringWithCompatibilityMapping]; + [self insertText:convString]; + + // correct range for combining characters + if(curRange.length) + [self setSelectedRange:NSMakeRange(selRange.location, [convString length])]; + else + // if no selection place the caret at the end of the current word + { + NSRange newRange = [self getRangeForCurrentWord]; + [self setSelectedRange:NSMakeRange(newRange.location + newRange.length, 0)]; + } +} + +/* + * Change selection or current word according to Unicode's NFC and preserves the selection. + */ +- (IBAction)doPrecomposedStringWithCanonicalMapping:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + NSString* convString = [[[self string] substringWithRange:selRange] precomposedStringWithCanonicalMapping]; + [self insertText:convString]; + + // correct range for combining characters + if(curRange.length) + [self setSelectedRange:NSMakeRange(selRange.location, [convString length])]; + else + // if no selection place the caret at the end of the current word + { + NSRange newRange = [self getRangeForCurrentWord]; + [self setSelectedRange:NSMakeRange(newRange.location + newRange.length, 0)]; + } +} + +/* + * Change selection or current word according to Unicode's NFKC to title case and preserves the selection. + */ +- (IBAction)doPrecomposedStringWithCompatibilityMapping:(id)sender +{ + NSRange curRange = [self selectedRange]; + NSRange selRange = (curRange.length) ? curRange : [self getRangeForCurrentWord]; + [self setSelectedRange:selRange]; + NSString* convString = [[[self string] substringWithRange:selRange] precomposedStringWithCompatibilityMapping]; + [self insertText:convString]; + + // correct range for combining characters + if(curRange.length) + [self setSelectedRange:NSMakeRange(selRange.location, [convString length])]; + else + // if no selection place the caret at the end of the current word + { + NSRange newRange = [self getRangeForCurrentWord]; + [self setSelectedRange:NSMakeRange(newRange.location + newRange.length, 0)]; + } +} + + @end |