aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/SPIdMenu.h47
-rw-r--r--Source/SPIdMenu.m73
-rw-r--r--Source/SPTableStructureDelegate.m6
3 files changed, 124 insertions, 2 deletions
diff --git a/Source/SPIdMenu.h b/Source/SPIdMenu.h
new file mode 100644
index 00000000..dbda8952
--- /dev/null
+++ b/Source/SPIdMenu.h
@@ -0,0 +1,47 @@
+//
+// SPIdMenu.h
+// sequel-pro
+//
+// Created by Max Lohrmann on 02.11.15.
+// Copyright (c) 2015 Max Lohrmann. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// More info at <https://github.com/sequelpro/sequelpro>
+
+#import <Cocoa/Cocoa.h>
+
+/**
+ * This class aims to solve the problem, that the only strong connection between
+ * a menu in IB and code can be made via an outlet. Since comparing breaks once
+ * the menu is copied (which NSTableView does for its cells) and the menu title
+ * is localizable, ie. not constant either, we need to add another field.
+ *
+ * Note that menuId can be set via IB's "Custom Runtime Attribute" section.
+ */
+@interface SPIdMenu : NSMenu {
+ NSString *_menuId;
+}
+
+@property (copy) NSString *menuId;
+
+@end
diff --git a/Source/SPIdMenu.m b/Source/SPIdMenu.m
new file mode 100644
index 00000000..7cb7d97e
--- /dev/null
+++ b/Source/SPIdMenu.m
@@ -0,0 +1,73 @@
+//
+// SPIdMenu.m
+// sequel-pro
+//
+// Created by Max Lohrmann on 02.11.15.
+// Copyright (c) 2015 Max Lohrmann. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// More info at <https://github.com/sequelpro/sequelpro>
+
+#import "SPIdMenu.h"
+
+@implementation SPIdMenu
+
+@synthesize menuId = _menuId;
+
+-(id)copyWithZone:(NSZone *)zone
+{
+ SPIdMenu *copy = [super copyWithZone:zone];
+ copy->_menuId = [[self menuId] copyWithZone:zone];
+ return copy;
+}
+
+-(void)dealloc
+{
+ [self setMenuId:nil];
+ [super dealloc];
+}
+
+- (void)encodeWithCoder:(NSCoder *)aCoder
+{
+ [super encodeWithCoder:aCoder];
+ if([aCoder allowsKeyedCoding]) {
+ [aCoder encodeObject:[self menuId] forKey:@"SPMenuId"];
+ }
+}
+
+- (id)initWithCoder:(NSCoder *)aDecoder
+{
+ if(self = [super initWithCoder:aDecoder]) {
+ if([aDecoder allowsKeyedCoding]) {
+ [self setMenuId:[aDecoder decodeObjectForKey:@"SPMenuId"]];
+ }
+ }
+ return self;
+}
+
+- (NSString *)description
+{
+ return [[super description] stringByAppendingFormat:@" with menuId=%@",[self menuId]];
+}
+
+@end
diff --git a/Source/SPTableStructureDelegate.m b/Source/SPTableStructureDelegate.m
index 3ff4d6e4..6b2249dc 100644
--- a/Source/SPTableStructureDelegate.m
+++ b/Source/SPTableStructureDelegate.m
@@ -39,6 +39,7 @@
#import "SPServerSupport.h"
#import "SPTablesList.h"
#import "SPPillAttachmentCell.h"
+#import "SPIdMenu.h"
#import <SPMySQL/SPMySQL.h>
@@ -654,6 +655,7 @@ static void _BuildMenuWithPills(NSMenu *menu,struct _cmpMap *map,size_t mapEntri
- (void)menuNeedsUpdate:(NSMenu *)menu
{
+ if(![menu isKindOfClass:[SPIdMenu class]]) return;
//NOTE: NSTableView will usually copy the menu and call this method on the copy. Matching with == won't work!
//walk through the menu and clear the attributedTitle if set. This will remove the gray color from the default items
@@ -665,7 +667,7 @@ static void _BuildMenuWithPills(NSMenu *menu,struct _cmpMap *map,size_t mapEntri
NSDictionary *rowData = NSArrayObjectAtIndex(tableFields, [tableSourceView selectedRow]);
- if([[menu title] isEqualToString:@"encodingPopupMenu"]) {
+ if([[menu menuId] isEqualToString:@"encodingPopupMenu"]) {
NSString *tableEncoding = [tableDataInstance tableEncoding];
//NSString *databaseEncoding = [databaseDataInstance getDatabaseDefaultCharacterSet];
//NSString *serverEncoding = [databaseDataInstance getServerDefaultCharacterSet];
@@ -691,7 +693,7 @@ static void _BuildMenuWithPills(NSMenu *menu,struct _cmpMap *map,size_t mapEntri
_BuildMenuWithPills(menu, defaultCmp, COUNT_OF(defaultCmp));
}
- else if([[menu title] isEqualToString:@"collationPopupMenu"]) {
+ else if([[menu menuId] isEqualToString:@"collationPopupMenu"]) {
NSString *encoding = [rowData objectForKey:@"encodingName"];
NSString *encodingDefaultCollation = [databaseDataInstance getDefaultCollationForEncoding:encoding];
NSString *tableCollation = [tableDataInstance statusValueForKey:@"Collation"];