aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/CMTextView.m147
-rw-r--r--Source/SPTextViewAdditions.h10
-rw-r--r--Source/SPTextViewAdditions.m180
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