aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/SPExportController.h2
-rw-r--r--Source/SPExportController.m134
-rw-r--r--Source/SPExportControllerDelegate.m28
-rw-r--r--Source/SPExportFile.m3
-rw-r--r--Source/SPExportFilenameUtilities.m89
-rw-r--r--Source/SPExportInterfaceController.h37
-rw-r--r--Source/SPExportInterfaceController.m152
-rw-r--r--sequel-pro.xcodeproj/project.pbxproj6
8 files changed, 316 insertions, 135 deletions
diff --git a/Source/SPExportController.h b/Source/SPExportController.h
index 9c084334..4dbb2000 100644
--- a/Source/SPExportController.h
+++ b/Source/SPExportController.h
@@ -263,6 +263,4 @@
- (IBAction)toggleSQLIncludeDropSyntax:(NSButton *)sender;
- (IBAction)toggleNewFilePerTable:(NSButton *)sender;
-- (void)savePanelDidEnd:(NSSavePanel *)panel returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
-
@end
diff --git a/Source/SPExportController.m b/Source/SPExportController.m
index 0223386a..c9ab3c32 100644
--- a/Source/SPExportController.m
+++ b/Source/SPExportController.m
@@ -59,6 +59,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled";
- (void)_toggleExportButton:(id)uiStateDict;
- (void)_toggleExportButtonOnBackgroundThread;
- (void)_toggleExportButtonWithBool:(NSNumber *)enable;
+- (void)_toggleSQLExportTableNameTokenAvailability;
- (void)_resizeWindowForCustomFilenameViewByHeightDelta:(NSInteger)delta;
- (void)_resizeWindowForAdvancedOptionsViewByHeightDelta:(NSInteger)delta;
@@ -615,6 +616,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled";
- (IBAction)toggleNewFilePerTable:(NSButton *)sender
{
[self _updateExportFormatInformation];
+ [self updateAvailableExportFilenameTokens];
}
/**
@@ -835,7 +837,7 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled";
}
if (j > i) {
- NSUInteger diff = (j - i);
+ NSUInteger diff = j - i;
SPBeginAlertSheet(NSLocalizedString(@"The list of tables has changed", @"table list change alert message"),
NSLocalizedString(@"Continue", @"continue button"),
@@ -975,9 +977,9 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled";
BOOL isHTML = (exportType == SPHTMLExport);
BOOL isPDF = (exportType == SPPDFExport);
- BOOL structureEnabled = [[uiStateDict objectForKey:SPSQLExportStructureEnabled] integerValue];
- BOOL contentEnabled = [[uiStateDict objectForKey:SPSQLExportContentEnabled] integerValue];
- BOOL dropEnabled = [[uiStateDict objectForKey:SPSQLExportDropEnabled] integerValue];
+ BOOL structureEnabled = [[uiStateDict objectForKey:SPSQLExportStructureEnabled] boolValue];
+ BOOL contentEnabled = [[uiStateDict objectForKey:SPSQLExportContentEnabled] boolValue];
+ BOOL dropEnabled = [[uiStateDict objectForKey:SPSQLExportDropEnabled] boolValue];
if (isCSV || isXML || isHTML || isPDF || (isSQL && ((!structureEnabled) || (!dropEnabled)))) {
enable = NO;
@@ -1012,8 +1014,8 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled";
}
}
}
- // Disable if structure is unchecked, but content and drop are as dropping a table then trying to insert
- // into it is obviously an error.
+ // Disable if structure is unchecked, but content and drop are as dropping a
+ // table then trying to insert into it is obviously an error.
else if (contentEnabled && (!structureEnabled) && (dropEnabled)) {
enable = NO;
}
@@ -1054,118 +1056,24 @@ static const NSString *SPSQLExportDropEnabled = @"SQLExportDropEnabled";
}
/**
- * Resizes the export window's height by the supplied delta, while retaining the position of
- * all interface controls to accommodate the custom filename view.
- *
- * @param delta The height delta for which the height should be adjusted for.
+ * Toggles the available filename tokens for and SQL export.
*/
-- (void)_resizeWindowForCustomFilenameViewByHeightDelta:(NSInteger)delta
+- (void)_toggleSQLExportTableNameTokenAvailability
{
- NSUInteger popUpMask = [exportInputPopUpButton autoresizingMask];
- NSUInteger fileCheckMask = [exportFilePerTableCheck autoresizingMask];
- NSUInteger scrollMask = [exportTablelistScrollView autoresizingMask];
- NSUInteger buttonBarMask = [exportTableListButtonBar autoresizingMask];
- NSUInteger buttonMask = [exportCustomFilenameViewButton autoresizingMask];
- NSUInteger textFieldMask = [exportCustomFilenameViewLabelButton autoresizingMask];
- NSUInteger customFilenameViewMask = [exportCustomFilenameView autoresizingMask];
- NSUInteger tabBarMask = [exportOptionsTabBar autoresizingMask];
-
- NSRect frame = [[self window] frame];
-
- if (frame.size.height > 600 && delta > heightOffset1) {
- frame.origin.y += [exportCustomFilenameView frame].size.height;
- frame.size.height -= [exportCustomFilenameView frame].size.height;
-
- [[self window] setFrame:frame display:YES animate:YES];
- }
-
- [exportInputPopUpButton setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
- [exportFilePerTableCheck setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
- [exportTablelistScrollView setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
- [exportTableListButtonBar setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
- [exportOptionsTabBar setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
- [exportCustomFilenameViewButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportCustomFilenameViewLabelButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportCustomFilenameView setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
-
- NSInteger newMinHeight = (windowMinHeigth - heightOffset1 + delta < windowMinHeigth) ? windowMinHeigth : windowMinHeigth - heightOffset1 + delta;
-
- [[self window] setMinSize:NSMakeSize(windowMinWidth, newMinHeight)];
+ NSUInteger i = 0;
- frame.origin.y += heightOffset1;
- frame.size.height -= heightOffset1;
-
- heightOffset1 = delta;
-
- frame.origin.y -= heightOffset1;
- frame.size.height += heightOffset1;
-
- [[self window] setFrame:frame display:YES animate:YES];
-
- [exportInputPopUpButton setAutoresizingMask:popUpMask];
- [exportFilePerTableCheck setAutoresizingMask:fileCheckMask];
- [exportTablelistScrollView setAutoresizingMask:scrollMask];
- [exportTableListButtonBar setAutoresizingMask:buttonBarMask];
- [exportCustomFilenameViewButton setAutoresizingMask:buttonMask];
- [exportCustomFilenameViewLabelButton setAutoresizingMask:textFieldMask];
- [exportCustomFilenameView setAutoresizingMask:customFilenameViewMask];
- [exportOptionsTabBar setAutoresizingMask:tabBarMask];
-}
-
-/**
- * Resizes the export window's height by the supplied delta, while retaining the position of
- * all interface controls to accommodate the advanced options view.
- *
- * @param delta The height delta for which the height should be adjusted for.
- */
-- (void)_resizeWindowForAdvancedOptionsViewByHeightDelta:(NSInteger)delta
-{
- NSUInteger scrollMask = [exportTablelistScrollView autoresizingMask];
- NSUInteger buttonBarMask = [exportTableListButtonBar autoresizingMask];
- NSUInteger tabBarMask = [exportTypeTabBar autoresizingMask];
- NSUInteger optionsTabBarMask = [exportOptionsTabBar autoresizingMask];
- NSUInteger buttonMask = [exportAdvancedOptionsViewButton autoresizingMask];
- NSUInteger textFieldMask = [exportAdvancedOptionsViewLabelButton autoresizingMask];
- NSUInteger advancedViewMask = [exportAdvancedOptionsView autoresizingMask];
-
- NSRect frame = [[self window] frame];
-
- if (frame.size.height > 600 && delta > heightOffset2) {
- frame.origin.y += [exportAdvancedOptionsView frame].size.height;
- frame.size.height -= [exportAdvancedOptionsView frame].size.height;
-
- [[self window] setFrame:frame display:YES animate:YES];
+ for (NSArray *table in tables)
+ {
+ if ([NSArrayObjectAtIndex(table, 2) boolValue]) {
+ i++;
+
+ if (i == 2) break;
+ }
}
- [exportTablelistScrollView setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportTableListButtonBar setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportTypeTabBar setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportOptionsTabBar setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportAdvancedOptionsViewButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportAdvancedOptionsViewLabelButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
- [exportAdvancedOptionsView setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
-
- NSInteger newMinHeight = (windowMinHeigth - heightOffset2 + delta < windowMinHeigth) ? windowMinHeigth : windowMinHeigth - heightOffset2 + delta;
-
- [[self window] setMinSize:NSMakeSize(windowMinWidth, newMinHeight)];
-
- frame.origin.y += heightOffset2;
- frame.size.height -= heightOffset2;
-
- heightOffset2 = delta;
-
- frame.origin.y -= heightOffset2;
- frame.size.height += heightOffset2;
-
- [[self window] setFrame:frame display:YES animate:YES];
-
- [exportTablelistScrollView setAutoresizingMask:scrollMask];
- [exportTableListButtonBar setAutoresizingMask:buttonBarMask];
- [exportTypeTabBar setAutoresizingMask:tabBarMask];
- [exportOptionsTabBar setAutoresizingMask:optionsTabBarMask];
- [exportAdvancedOptionsViewButton setAutoresizingMask:buttonMask];
- [exportAdvancedOptionsViewLabelButton setAutoresizingMask:textFieldMask];
- [exportAdvancedOptionsView setAutoresizingMask:advancedViewMask];
+ [exportCustomFilenameTokensField setStringValue:(i > 1) ?
+ NSLocalizedString(@"host,database,date,year,month,day,time", @"custom export filename tokens without table") :
+ NSLocalizedString(@"host,database,table,date,year,month,day,time", @"default custom export filename tokens")];
}
@end
diff --git a/Source/SPExportControllerDelegate.m b/Source/SPExportControllerDelegate.m
index e8e9f1c6..23821d12 100644
--- a/Source/SPExportControllerDelegate.m
+++ b/Source/SPExportControllerDelegate.m
@@ -31,6 +31,7 @@
@interface SPExportController (SPExportControllerPrivateAPI)
- (void)_toggleExportButtonOnBackgroundThread;
+- (void)_toggleSQLExportTableNameTokenAvailability;
- (void)_updateExportFormatInformation;
- (void)_switchTab;
@@ -55,6 +56,7 @@
{
[[tables objectAtIndex:rowIndex] replaceObjectAtIndex:[exportTableList columnWithIdentifier:[tableColumn identifier]] withObject:anObject];
+ [self updateAvailableExportFilenameTokens];
[self _toggleExportButtonOnBackgroundThread];
[self _updateExportFormatInformation];
}
@@ -67,9 +69,9 @@
return (tableView == exportTableList);
}
-- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex
+- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex
{
- [aCell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
+ [cell setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
}
#pragma mark -
@@ -102,23 +104,29 @@
*/
- (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)tokens atIndex:(NSUInteger)index
{
- NSMutableArray *processedTokens = [NSMutableArray array];
NSUInteger i, j;
+ NSMutableArray *processedTokens = [NSMutableArray array];
NSCharacterSet *alphanumericSet = [NSCharacterSet alphanumericCharacterSet];
- for (NSString *inputToken in tokens) {
+ for (NSString *inputToken in tokens)
+ {
j = 0;
- for (i = 0; i < [inputToken length]; i++) {
+
+ for (i = 0; i < [inputToken length]; i++)
+ {
if (![alphanumericSet characterIsMember:[inputToken characterAtIndex:i]]) {
if (i > j) {
- [processedTokens addObject:[self tokenObjectForString:[inputToken substringWithRange:NSMakeRange(j, i-j)]]];
+ [processedTokens addObject:[self tokenObjectForString:[inputToken substringWithRange:NSMakeRange(j, i - j)]]];
}
+
[processedTokens addObject:[inputToken substringWithRange:NSMakeRange(i, 1)]];
- j = i+1;
+
+ j = i + 1;
}
}
+
if (j < i) {
- [processedTokens addObject:[self tokenObjectForString:[inputToken substringWithRange:NSMakeRange(j, i-j)]]];
+ [processedTokens addObject:[self tokenObjectForString:[inputToken substringWithRange:NSMakeRange(j, i - j)]]];
}
}
@@ -146,9 +154,9 @@
* During text entry into the token field, update the displayed filename and also
* trigger tokenization after a short delay.
*/
-- (void)controlTextDidChange:(NSNotification *)aNotification
+- (void)controlTextDidChange:(NSNotification *)notification
{
- if ([aNotification object] == exportCustomFilenameTokenField) {
+ if ([notification object] == exportCustomFilenameTokenField) {
[self updateDisplayedExportFilename];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tokenizeCustomFilenameTokenField) object:nil];
[self performSelector:@selector(tokenizeCustomFilenameTokenField) withObject:nil afterDelay:0.5];
diff --git a/Source/SPExportFile.m b/Source/SPExportFile.m
index 66131139..6fd4e217 100644
--- a/Source/SPExportFile.m
+++ b/Source/SPExportFile.m
@@ -26,7 +26,7 @@
#import "SPExportFile.h"
#import "SPFileHandle.h"
-@interface SPExportFile (PrivateAPI)
+@interface SPExportFile ()
- (SPExportFileHandleStatus)_createFileHandle;
@@ -107,6 +107,7 @@
if ([fileManager fileExistsAtPath:[self exportFilePath]]) {
return [[NSFileManager defaultManager] removeItemAtPath:[self exportFilePath] error:nil];
}
+
return NO;
}
diff --git a/Source/SPExportFilenameUtilities.m b/Source/SPExportFilenameUtilities.m
index 31625a4c..ad5ab36b 100644
--- a/Source/SPExportFilenameUtilities.m
+++ b/Source/SPExportFilenameUtilities.m
@@ -54,11 +54,61 @@
}
/**
- * Updates the available export filename tokens.
+ * Updates the available export filename tokens based on the currently selected options.
*/
- (void)updateAvailableExportFilenameTokens
{
- [exportCustomFilenameTokensField setStringValue:((exportSource == SPQueryExport) || (exportType == SPDotExport)) ? NSLocalizedString(@"host,database,date,year,month,day,time", @"custom export filename tokens without table") : NSLocalizedString(@"host,database,table,date,year,month,day,time", @"default custom export filename tokens")];
+ NSUInteger i = 0;
+ BOOL removeTable = NO;
+
+ BOOL isSQL = exportType == SPSQLExport;
+ BOOL isCSV = exportType == SPCSVExport;
+ BOOL isDot = exportType == SPDotExport;
+ BOOL isXML = exportType == SPXMLExport;
+
+ NSString *tokens = NSLocalizedString(@"host,database,table,date,year,month,day,time", @"default custom export filename tokens");;
+ NSString *tokensWithoutTable = NSLocalizedString(@"host,database,date,year,month,day,time", @"custom export filename tokens without table");
+
+ if (exportSource == SPQueryExport || isDot) {
+ tokens = tokensWithoutTable;
+ }
+ else if (isSQL || isCSV || isXML) {
+ for (NSArray *table in tables)
+ {
+ if ([NSArrayObjectAtIndex(table, 2) boolValue]) {
+ i++;
+ removeTable = YES;
+
+ if (i == 2) break;
+ }
+ }
+
+ if (i > 1) {
+ removeTable = isSQL ? YES : ![exportFilePerTableCheck state];
+
+ tokens = isSQL ? tokensWithoutTable : ([exportFilePerTableCheck state] ? tokens : tokensWithoutTable);
+ }
+ }
+
+ if (removeTable) {
+ NSArray *tokenParts = [exportCustomFilenameTokenField objectValue];
+
+ for (id token in [exportCustomFilenameTokenField objectValue])
+ {
+ if ([token isKindOfClass:[SPExportFileNameTokenObject class]]) {
+ if ([[token tokenContent] isEqualToString:NSLocalizedString(@"table", @"table")]) {
+ NSMutableArray *newTokens = [NSMutableArray arrayWithArray:tokenParts];
+
+ [newTokens removeObjectAtIndex:[tokenParts indexOfObject:token]];
+
+ [exportCustomFilenameTokenField setObjectValue:newTokens];
+ break;
+ }
+ }
+ }
+ }
+
+ [exportCustomFilenameTokensField setStringValue:tokens];
}
/**
@@ -69,7 +119,9 @@
{
if ([[exportCustomFilenameTokensField objectValue] containsObject:stringToTokenize]) {
SPExportFileNameTokenObject *newToken = [[SPExportFileNameTokenObject alloc] init];
+
[newToken setTokenContent:stringToTokenize];
+
return [newToken autorelease];
}
@@ -78,6 +130,7 @@
/**
* Tokenize the filename field.
+ *
* This is called on a delay after text entry to update the tokens during text entry.
* There's no API to perform tokenizing, but the same result can be achieved by using the return key;
* however, this only works if the cursor is after text, not after a token.
@@ -90,6 +143,7 @@
if ([exportCustomFilenameTokenField currentEditor] == nil) return;
NSRange selectedRange = [[exportCustomFilenameTokenField currentEditor] selectedRange];
+
if (selectedRange.location == NSNotFound) return;
if (selectedRange.length > 0) return;
@@ -98,10 +152,15 @@
// Walk through the strings - not the tokens - and determine whether any need tokenizing
BOOL tokenizingRequired = NO;
- for (id representedObject in representedObjects) {
+
+ for (id representedObject in representedObjects)
+ {
if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]]) continue;
+
NSArray *tokenParts = [representedObject componentsSeparatedByCharactersInSet:nonAlphanumericSet];
- for (NSString *tokenPart in tokenParts) {
+
+ for (NSString *tokenPart in tokenParts)
+ {
if ([validTokens containsObject:tokenPart]) {
tokenizingRequired = YES;
break;
@@ -115,12 +174,16 @@
// Detect where the cursor is currently located. If it's at the end of a token, also return -
// or the enter key would result in closing the sheet.
NSUInteger stringPosition = 0;
- for (id representedObject in representedObjects) {
+
+ for (id representedObject in representedObjects)
+ {
if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]]) {
stringPosition++;
- } else {
+ }
+ else {
stringPosition += [(NSString *)representedObject length];
}
+
if (selectedRange.location <= stringPosition) {
if ([representedObject isKindOfClass:[SPExportFileNameTokenObject class]]) return;
break;
@@ -128,7 +191,17 @@
}
// All conditions met - synthesize the return key to trigger tokenization.
- NSEvent *tokenizingEvent = [NSEvent keyEventWithType:NSKeyDown location:NSMakePoint(0,0) modifierFlags:0 timestamp:0 windowNumber:[[exportCustomFilenameTokenField window] windowNumber] context:[NSGraphicsContext currentContext] characters:nil charactersIgnoringModifiers:nil isARepeat:NO keyCode:0x24];
+ NSEvent *tokenizingEvent = [NSEvent keyEventWithType:NSKeyDown
+ location:NSMakePoint(0,0)
+ modifierFlags:0
+ timestamp:0
+ windowNumber:[[exportCustomFilenameTokenField window] windowNumber]
+ context:[NSGraphicsContext currentContext]
+ characters:nil
+ charactersIgnoringModifiers:nil
+ isARepeat:NO
+ keyCode:0x24];
+
[[NSApplication sharedApplication] postEvent:tokenizingEvent atStart:NO];
// Update the filename preview
@@ -235,7 +308,6 @@
}
else if ([tokenContent isEqualToString:NSLocalizedString(@"table", @"table")]) {
[string appendString:(table) ? table : @""];
-
}
else if ([tokenContent isEqualToString:NSLocalizedString(@"date", @"export filename date token")]) {
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
@@ -259,7 +331,6 @@
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[string appendString:[dateFormatter stringFromDate:[NSDate date]]];
-
}
}
else {
diff --git a/Source/SPExportInterfaceController.h b/Source/SPExportInterfaceController.h
new file mode 100644
index 00000000..8a4e5188
--- /dev/null
+++ b/Source/SPExportInterfaceController.h
@@ -0,0 +1,37 @@
+//
+// $Id$
+//
+// SPExportInterfaceController.h
+// Sequel Pro
+//
+// Created by Stuart Connolly (stuconnolly.com) on March 31, 2012
+// Copyright (c) 2012 Stuart Connolly. 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 <http://code.google.com/p/sequel-pro/>
+
+#import "SPExportController.h"
+
+@interface SPExportController (SPExportInterfaceController)
+
+@end
diff --git a/Source/SPExportInterfaceController.m b/Source/SPExportInterfaceController.m
new file mode 100644
index 00000000..7c2615a4
--- /dev/null
+++ b/Source/SPExportInterfaceController.m
@@ -0,0 +1,152 @@
+//
+// $Id$
+//
+// SPExportInterfaceController.m
+// Sequel Pro
+//
+// Created by Stuart Connolly (stuconnolly.com) on March 31, 2012
+// Copyright (c) 2012 Stuart Connolly. 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 <http://code.google.com/p/sequel-pro/>
+
+#import "SPExportInterfaceController.h"
+
+@implementation SPExportController (SPExportInterfaceController)
+
+/**
+ * Resizes the export window's height by the supplied delta, while retaining the position of
+ * all interface controls to accommodate the custom filename view.
+ *
+ * @param delta The height delta for which the height should be adjusted for.
+ */
+- (void)_resizeWindowForCustomFilenameViewByHeightDelta:(NSInteger)delta
+{
+ NSUInteger popUpMask = [exportInputPopUpButton autoresizingMask];
+ NSUInteger fileCheckMask = [exportFilePerTableCheck autoresizingMask];
+ NSUInteger scrollMask = [exportTablelistScrollView autoresizingMask];
+ NSUInteger buttonBarMask = [exportTableListButtonBar autoresizingMask];
+ NSUInteger buttonMask = [exportCustomFilenameViewButton autoresizingMask];
+ NSUInteger textFieldMask = [exportCustomFilenameViewLabelButton autoresizingMask];
+ NSUInteger customFilenameViewMask = [exportCustomFilenameView autoresizingMask];
+ NSUInteger tabBarMask = [exportOptionsTabBar autoresizingMask];
+
+ NSRect frame = [[self window] frame];
+
+ if (frame.size.height > 600 && delta > heightOffset1) {
+ frame.origin.y += [exportCustomFilenameView frame].size.height;
+ frame.size.height -= [exportCustomFilenameView frame].size.height;
+
+ [[self window] setFrame:frame display:YES animate:YES];
+ }
+
+ [exportInputPopUpButton setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
+ [exportFilePerTableCheck setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
+ [exportTablelistScrollView setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
+ [exportTableListButtonBar setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
+ [exportOptionsTabBar setAutoresizingMask:NSViewNotSizable | NSViewMaxYMargin];
+ [exportCustomFilenameViewButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportCustomFilenameViewLabelButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportCustomFilenameView setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+
+ NSInteger newMinHeight = (windowMinHeigth - heightOffset1 + delta < windowMinHeigth) ? windowMinHeigth : windowMinHeigth - heightOffset1 + delta;
+
+ [[self window] setMinSize:NSMakeSize(windowMinWidth, newMinHeight)];
+
+ frame.origin.y += heightOffset1;
+ frame.size.height -= heightOffset1;
+
+ heightOffset1 = delta;
+
+ frame.origin.y -= heightOffset1;
+ frame.size.height += heightOffset1;
+
+ [[self window] setFrame:frame display:YES animate:YES];
+
+ [exportInputPopUpButton setAutoresizingMask:popUpMask];
+ [exportFilePerTableCheck setAutoresizingMask:fileCheckMask];
+ [exportTablelistScrollView setAutoresizingMask:scrollMask];
+ [exportTableListButtonBar setAutoresizingMask:buttonBarMask];
+ [exportCustomFilenameViewButton setAutoresizingMask:buttonMask];
+ [exportCustomFilenameViewLabelButton setAutoresizingMask:textFieldMask];
+ [exportCustomFilenameView setAutoresizingMask:customFilenameViewMask];
+ [exportOptionsTabBar setAutoresizingMask:tabBarMask];
+}
+
+/**
+ * Resizes the export window's height by the supplied delta, while retaining the position of
+ * all interface controls to accommodate the advanced options view.
+ *
+ * @param delta The height delta for which the height should be adjusted for.
+ */
+- (void)_resizeWindowForAdvancedOptionsViewByHeightDelta:(NSInteger)delta
+{
+ NSUInteger scrollMask = [exportTablelistScrollView autoresizingMask];
+ NSUInteger buttonBarMask = [exportTableListButtonBar autoresizingMask];
+ NSUInteger tabBarMask = [exportTypeTabBar autoresizingMask];
+ NSUInteger optionsTabBarMask = [exportOptionsTabBar autoresizingMask];
+ NSUInteger buttonMask = [exportAdvancedOptionsViewButton autoresizingMask];
+ NSUInteger textFieldMask = [exportAdvancedOptionsViewLabelButton autoresizingMask];
+ NSUInteger advancedViewMask = [exportAdvancedOptionsView autoresizingMask];
+
+ NSRect frame = [[self window] frame];
+
+ if (frame.size.height > 600 && delta > heightOffset2) {
+ frame.origin.y += [exportAdvancedOptionsView frame].size.height;
+ frame.size.height -= [exportAdvancedOptionsView frame].size.height;
+
+ [[self window] setFrame:frame display:YES animate:YES];
+ }
+
+ [exportTablelistScrollView setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportTableListButtonBar setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportTypeTabBar setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportOptionsTabBar setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportAdvancedOptionsViewButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportAdvancedOptionsViewLabelButton setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+ [exportAdvancedOptionsView setAutoresizingMask:NSViewNotSizable | NSViewMinYMargin];
+
+ NSInteger newMinHeight = (windowMinHeigth - heightOffset2 + delta < windowMinHeigth) ? windowMinHeigth : windowMinHeigth - heightOffset2 + delta;
+
+ [[self window] setMinSize:NSMakeSize(windowMinWidth, newMinHeight)];
+
+ frame.origin.y += heightOffset2;
+ frame.size.height -= heightOffset2;
+
+ heightOffset2 = delta;
+
+ frame.origin.y -= heightOffset2;
+ frame.size.height += heightOffset2;
+
+ [[self window] setFrame:frame display:YES animate:YES];
+
+ [exportTablelistScrollView setAutoresizingMask:scrollMask];
+ [exportTableListButtonBar setAutoresizingMask:buttonBarMask];
+ [exportTypeTabBar setAutoresizingMask:tabBarMask];
+ [exportOptionsTabBar setAutoresizingMask:optionsTabBarMask];
+ [exportAdvancedOptionsViewButton setAutoresizingMask:buttonMask];
+ [exportAdvancedOptionsViewLabelButton setAutoresizingMask:textFieldMask];
+ [exportAdvancedOptionsView setAutoresizingMask:advancedViewMask];
+}
+
+@end
diff --git a/sequel-pro.xcodeproj/project.pbxproj b/sequel-pro.xcodeproj/project.pbxproj
index c5ef6664..fbb5a5c2 100644
--- a/sequel-pro.xcodeproj/project.pbxproj
+++ b/sequel-pro.xcodeproj/project.pbxproj
@@ -92,6 +92,7 @@
17A7773411C52D8E001E27B4 /* SPIndexesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17A7773311C52D8E001E27B4 /* SPIndexesController.m */; };
17A7773811C52E61001E27B4 /* IndexesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17A7773611C52E61001E27B4 /* IndexesView.xib */; };
17AF787B11FC41C00073D043 /* SPExportFilenameUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 17AF787A11FC41C00073D043 /* SPExportFilenameUtilities.m */; };
+ 17BA2A3215275D8600389803 /* SPExportInterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BA2A3115275D8600389803 /* SPExportInterfaceController.m */; };
17C058880FC9FC390077E9CF /* SPNarrowDownCompletion.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C058870FC9FC390077E9CF /* SPNarrowDownCompletion.m */; };
17CC97F310B4ABE90034CD7A /* SPAboutController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17CC97F210B4ABE90034CD7A /* SPAboutController.m */; };
17CC97F710B4AC6C0034CD7A /* AboutPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 17CC97F510B4AC6C0034CD7A /* AboutPanel.xib */; };
@@ -717,6 +718,8 @@
17B7B58F1016028F00F057DE /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libcrypto.dylib; path = /usr/lib/libcrypto.dylib; sourceTree = "<absolute>"; };
17B7B591101602AE00F057DE /* libssl.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libssl.dylib; path = /usr/lib/libssl.dylib; sourceTree = "<absolute>"; };
17B7B698101611C800F057DE /* build-mysql-client.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "build-mysql-client.sh"; sourceTree = "<group>"; };
+ 17BA2A3015275D8600389803 /* SPExportInterfaceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPExportInterfaceController.h; sourceTree = "<group>"; };
+ 17BA2A3115275D8600389803 /* SPExportInterfaceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPExportInterfaceController.m; sourceTree = "<group>"; };
17C058860FC9FC390077E9CF /* SPNarrowDownCompletion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPNarrowDownCompletion.h; sourceTree = "<group>"; };
17C058870FC9FC390077E9CF /* SPNarrowDownCompletion.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPNarrowDownCompletion.m; sourceTree = "<group>"; };
17CC97F110B4ABE90034CD7A /* SPAboutController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPAboutController.h; sourceTree = "<group>"; };
@@ -2184,6 +2187,8 @@
17F90E4A1210B43A00274C98 /* SPExportFileUtilities.m */,
17AF787911FC41C00073D043 /* SPExportFilenameUtilities.h */,
17AF787A11FC41C00073D043 /* SPExportFilenameUtilities.m */,
+ 17BA2A3015275D8600389803 /* SPExportInterfaceController.h */,
+ 17BA2A3115275D8600389803 /* SPExportInterfaceController.m */,
175EC63312733B36009A7C0F /* SPExportControllerDelegate.h */,
175EC63412733B36009A7C0F /* SPExportControllerDelegate.m */,
582F022F1370B52600B30621 /* SPExportFileNameTokenObject.h */,
@@ -3237,6 +3242,7 @@
17386E0B15192526002DC206 /* SPTableContentDataSource.m in Sources */,
17386E0E1519257E002DC206 /* SPTableContentDelegate.m in Sources */,
17381856151FB34E0078FFE2 /* SPUserManagerDelegate.m in Sources */,
+ 17BA2A3215275D8600389803 /* SPExportInterfaceController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};