aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPTextView.m
diff options
context:
space:
mode:
authorrowanbeentje <rowan@beent.je>2012-07-30 01:05:30 +0000
committerrowanbeentje <rowan@beent.je>2012-07-30 01:05:30 +0000
commit98aaa0f90f2520ba0662ae5c909d1d8adc4bc490 (patch)
treea0065a36e30f3d5427e00f80db2fce8cc3e9436c /Source/SPTextView.m
parent39acc61f00b719f69179e6add1513bb8886bd0e9 (diff)
downloadsequelpro-98aaa0f90f2520ba0662ae5c909d1d8adc4bc490.tar.gz
sequelpro-98aaa0f90f2520ba0662ae5c909d1d8adc4bc490.tar.bz2
sequelpro-98aaa0f90f2520ba0662ae5c909d1d8adc4bc490.zip
- Fix custom selection colours using a translucent colour being blended through to black or the window background, addressing incorrect colours in the Custom Query view when using selection colours with alpha values and window backgrounds showing through CREATE SYNTAX sheets (Issue #1099)
- Fix crashes when editing certain colours in editor preferences after a window had been closed, due to not unregistering all observers on SPTextView dealloc - Enable "Draws Background" on the main Custom Query view text view, as custom colours were no longer being drawn after a change in r3750
Diffstat (limited to 'Source/SPTextView.m')
-rw-r--r--Source/SPTextView.m67
1 files changed, 53 insertions, 14 deletions
diff --git a/Source/SPTextView.m b/Source/SPTextView.m
index e3d3d70c..44ee35d1 100644
--- a/Source/SPTextView.m
+++ b/Source/SPTextView.m
@@ -94,7 +94,13 @@ YY_BUFFER_STATE yy_scan_string (const char *);
#pragma mark -
+@interface SPTextView (Private_API)
+
NSInteger _alphabeticSort(id string1, id string2, void *reverse);
+- (void)_setTextSelectionColor:(NSColor *)newSelectionColor onBackgroundColor:(NSColor *)aBackgroundColor;
+
+@end
+
// some helper functions for handling rectangles and points
// needed in roundedBezierPathAroundRange:
@@ -128,14 +134,6 @@ static inline NSPoint SPPointOnLine(NSPoint a, NSPoint b, CGFloat t) { return NS
@synthesize mySQLConnection;
#endif
-/**
- * Sort function (mainly used to sort the words in the textView)
- */
-NSInteger _alphabeticSort(id string1, id string2, void *reverse)
-{
- return [string1 localizedCaseInsensitiveCompare:string2];
-}
-
- (void) awakeFromNib
{
#ifndef SP_REFACTOR /* init ivars */
@@ -212,7 +210,8 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
[self setTextColor:otherTextColor];
[self setInsertionPointColor:[NSUnarchiver unarchiveObjectWithData:[prefs dataForKey:SPCustomQueryEditorCaretColor]]];
[self setShouldHiliteQuery:[prefs boolForKey:SPCustomQueryHighlightCurrentQuery]];
- [self setSelectedTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSUnarchiver unarchiveObjectWithData:[prefs dataForKey:SPCustomQueryEditorSelectionColor]], NSBackgroundColorAttributeName, nil]];
+
+ [self _setTextSelectionColor:[NSUnarchiver unarchiveObjectWithData:[prefs dataForKey:SPCustomQueryEditorSelectionColor]] onBackgroundColor:backgroundColor];
// Register observers for the when editor background colors preference changes
[prefs addObserver:self forKeyPath:SPCustomQueryEditorSelectionColor options:NSKeyValueObservingOptionNew context:NULL];
@@ -264,6 +263,7 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
NSColor *backgroundColor = [NSUnarchiver unarchiveObjectWithData:[change objectForKey:NSKeyValueChangeNewKey]];
[self setQueryEditorBackgroundColor:backgroundColor];
[self setBackgroundColor:backgroundColor];
+ [self _setTextSelectionColor:[NSUnarchiver unarchiveObjectWithData:[prefs dataForKey:SPCustomQueryEditorSelectionColor]] onBackgroundColor:backgroundColor];
[self setNeedsDisplayInRect:[self bounds]];
} else if ([keyPath isEqualToString:SPCustomQueryEditorFont]) {
[self setFont:[NSUnarchiver unarchiveObjectWithData:[change objectForKey:NSKeyValueChangeNewKey]]];
@@ -275,7 +275,7 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
[self setInsertionPointColor:[NSUnarchiver unarchiveObjectWithData:[change objectForKey:NSKeyValueChangeNewKey]]];
[self setNeedsDisplayInRect:[self bounds]];
} else if ([keyPath isEqualToString:SPCustomQueryEditorSelectionColor]) {
- [self setSelectedTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSUnarchiver unarchiveObjectWithData:[change objectForKey:NSKeyValueChangeNewKey]], NSBackgroundColorAttributeName, nil]];
+ [self _setTextSelectionColor:[NSUnarchiver unarchiveObjectWithData:[change objectForKey:NSKeyValueChangeNewKey]] onBackgroundColor:[NSUnarchiver unarchiveObjectWithData:[prefs dataForKey:SPCustomQueryEditorBackgroundColor]]];
[self setNeedsDisplayInRect:[self bounds]];
} else if ([keyPath isEqualToString:SPCustomQueryHighlightCurrentQuery]) {
[self setShouldHiliteQuery:[[change objectForKey:NSKeyValueChangeNewKey] boolValue]];
@@ -2990,7 +2990,7 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
if([[self delegate] isKindOfClass:[SPCustomQuery class]]) {
- // Highlightes the current query if set in the Pref and no snippet session
+ // Highlights the current query if set in the Pref and no snippet session
// and if nothing is selected in the text view
if ([self shouldHiliteQuery] && snippetControlCounter<=-1 && ![self selectedRange].length && [[self string] length] < SP_MAX_TEXT_SIZE_FOR_SYNTAX_HIGHLIGHTING) {
NSUInteger rectCount;
@@ -3670,9 +3670,6 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
#pragma mark -
-
-#pragma mark -
-
- (void) dealloc
{
@@ -3682,6 +3679,8 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
// Remove observers
[[NSNotificationCenter defaultCenter] removeObserver:self];
#ifndef SP_REFACTOR
+ [prefs removeObserver:self forKeyPath:SPCustomQueryEditorSelectionColor];
+ [prefs removeObserver:self forKeyPath:SPCustomQueryEditorCaretColor];
[prefs removeObserver:self forKeyPath:SPCustomQueryEditorFont];
[prefs removeObserver:self forKeyPath:SPCustomQueryEditorBackgroundColor];
[prefs removeObserver:self forKeyPath:SPCustomQueryEditorHighlightQueryColor];
@@ -3715,3 +3714,43 @@ NSInteger _alphabeticSort(id string1, id string2, void *reverse)
}
@end
+
+#pragma mark -
+#pragma mark Private API
+
+@implementation SPTextView (Private_API)
+
+/**
+ * Sort function (mainly used to sort the words in the textView)
+ */
+NSInteger _alphabeticSort(id string1, id string2, void *reverse)
+{
+ return [string1 localizedCaseInsensitiveCompare:string2];
+}
+
+/**
+ * Take a supplied text selection colour, and if it contains an alpha component,
+ * pre-multiply it by the background colour before setting it to avoid drawing problems.
+ */
+- (void)_setTextSelectionColor:(NSColor *)newSelectionColor onBackgroundColor:(NSColor *)aBackgroundColor
+{
+
+ // If the selection colour has an alpha component, modify it
+ if ([newSelectionColor alphaComponent] < 1.f) {
+ NSColorSpace *rgbColorSpace = [NSColorSpace genericRGBColorSpace];
+
+ newSelectionColor = [newSelectionColor colorUsingColorSpace:rgbColorSpace];
+ NSColor *backgroundColor = [[NSUnarchiver unarchiveObjectWithData:[prefs dataForKey:SPCustomQueryEditorBackgroundColor]] colorUsingColorSpace:rgbColorSpace];
+
+ CGFloat modifiedRedComponent = ([backgroundColor redComponent] * (1.f - [newSelectionColor alphaComponent])) + ([newSelectionColor redComponent] * [newSelectionColor alphaComponent]);
+ CGFloat modifiedGreenComponent = ([backgroundColor greenComponent] * (1.f - [newSelectionColor alphaComponent])) + ([newSelectionColor greenComponent] * [newSelectionColor alphaComponent]);
+ CGFloat modifiedBlueComponent = ([backgroundColor blueComponent] * (1.f - [newSelectionColor alphaComponent])) + ([newSelectionColor blueComponent] * [newSelectionColor alphaComponent]);
+ newSelectionColor = [NSColor colorWithDeviceRed:modifiedRedComponent green:modifiedGreenComponent blue:modifiedBlueComponent alpha:1.f];
+ }
+
+ // Set the selection colour
+ [self setSelectedTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:newSelectionColor, NSBackgroundColorAttributeName, nil]];
+}
+
+@end
+