Support typed in absolute paths and drag and drop of a single file.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@17993 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2003-10-28 16:52:14 +00:00
parent e8275452b1
commit 914ac48552
3 changed files with 243 additions and 101 deletions

View file

@ -1,3 +1,11 @@
2003-10-27 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSOpenPanel.m: Allow users to type in an absolute path name.
Support DnD of filename into panel.
* Source/NSSavePanel.m: ditto. Also, if the name of a non-existent
directory is typed in, provide a prompt to create the directory as
in NeXTstep/OPENSTEP.
2003-10-27 Richard Frith-Macdonald <rfm@gnu.org> 2003-10-27 Richard Frith-Macdonald <rfm@gnu.org>
* Source/GSServicesManager.m: Tidy last patch to match use of * Source/GSServicesManager.m: Tidy last patch to match use of

View file

@ -430,7 +430,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
/** Displays the open panel in a modal session, with the directory /** Displays the open panel in a modal session, with the directory
path shown and file name (if any) selected. Files are filtered for the path shown and file name (if any) selected. Files are filtered for the
specified types. If the directory is nil, then the directory shown in specified types. If the directory is nil, then the directory shown in
the opena panel is the last directory selected. the open panel is the last directory selected.
*/ */
- (int) runModalForDirectory: (NSString *)path - (int) runModalForDirectory: (NSString *)path
file: (NSString *)name file: (NSString *)name
@ -478,6 +478,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
NSBrowserCell *selectedCell = nil; NSBrowserCell *selectedCell = nil;
NSArray *selectedCells = nil; NSArray *selectedCells = nil;
int selectedColumn, lastColumn; int selectedColumn, lastColumn;
NSString *tmp;
selectedColumn = [_browser selectedColumn]; selectedColumn = [_browser selectedColumn];
lastColumn = [_browser lastColumn]; lastColumn = [_browser lastColumn];
@ -489,8 +490,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
{ {
selectedCells = [matrix selectedCells]; selectedCells = [matrix selectedCells];
if (selectedColumn == lastColumn && if (selectedColumn == lastColumn && [selectedCells count] == 1)
[selectedCells count] == 1)
selectedCell = [selectedCells objectAtIndex: 0]; selectedCell = [selectedCells objectAtIndex: 0];
} }
else else
@ -527,12 +527,20 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
} }
ASSIGN (_directory, [_browser pathToColumn: [_browser lastColumn]]); ASSIGN (_directory, [_browser pathToColumn: [_browser lastColumn]]);
if (selectedCell) if (selectedCell)
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent: tmp = [selectedCell stringValue];
[selectedCell stringValue]]);
else else
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent: tmp = [[_form cellAtIndex: 0] stringValue];
[[_form cellAtIndex: 0] stringValue]]);
if ([tmp isAbsolutePath] == YES)
{
ASSIGN (_fullFileName, tmp);
}
else
{
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent: tmp]);
}
if (_delegateHasValidNameFilter) if (_delegateHasValidNameFilter)
{ {
@ -550,6 +558,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
_OKButtonPressed = YES; _OKButtonPressed = YES;
[NSApp stopModal]; [NSApp stopModal];
[self close]; [self close];
} }
@ -604,13 +613,22 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
NSComparisonResult result; NSComparisonResult result;
NSRange range; NSRange range;
matrix = [_browser matrixInColumn: [_browser lastColumn]];
s = [[[aNotification userInfo] objectForKey: @"NSFieldEditor"] string]; s = [[[aNotification userInfo] objectForKey: @"NSFieldEditor"] string];
/*
* If the user typed in an absolute path, display it.
*/
if ([s isAbsolutePath] == YES)
{
[self setDirectory: s];
}
sLength = [s length]; sLength = [s length];
range.location = 0; range.location = 0;
range.length = sLength; range.length = sLength;
matrix = [_browser matrixInColumn: [_browser lastColumn]];
if (sLength == 0) if (sLength == 0)
{ {
[matrix deselectAllCells]; [matrix deselectAllCells];

View file

@ -48,6 +48,8 @@
#include "AppKit/NSImage.h" #include "AppKit/NSImage.h"
#include "AppKit/NSImageView.h" #include "AppKit/NSImageView.h"
#include "AppKit/NSMatrix.h" #include "AppKit/NSMatrix.h"
#include "AppKit/NSPasteboard.h"
#include "AppKit/NSDragging.h"
#include "AppKit/NSSavePanel.h" #include "AppKit/NSSavePanel.h"
#include "AppKit/NSTextField.h" #include "AppKit/NSTextField.h"
#include "AppKit/NSWorkspace.h" #include "AppKit/NSWorkspace.h"
@ -90,6 +92,64 @@ static BOOL _gs_display_reading_progress = NO;
- (NSComparisonResult) _compareFilename: (NSString *)n1 with: (NSString *)n2; - (NSComparisonResult) _compareFilename: (NSString *)n1 with: (NSString *)n2;
@end /* NSSavePanel (PrivateMethods) */ @end /* NSSavePanel (PrivateMethods) */
@interface PanelView : NSView
{
NSSavePanel *owner;
}
- (id) initWithFrame: (NSRect)r owner: (NSSavePanel*)p;
- (BOOL) performDragOperation: (id<NSDraggingInfo>)sender;
- (BOOL) prepareForDragOperation: (id<NSDraggingInfo>)sender;
@end
@implementation PanelView
- (unsigned int) draggingEntered: (id <NSDraggingInfo>)sender
{
NSPasteboard *pb;
pb = [sender draggingPasteboard];
if ([[pb types] indexOfObject: NSFilenamesPboardType] == NSNotFound)
{
return NSDragOperationNone;
}
return NSDragOperationAll;
}
- (id) initWithFrame: (NSRect)r owner: (NSSavePanel*)p
{
if ((self = [super initWithFrame: r]) != nil)
{
owner = p;
[self registerForDraggedTypes: [NSArray arrayWithObjects:
NSFilenamesPboardType, nil]];
}
return self;
}
- (BOOL) performDragOperation: (id<NSDraggingInfo>)sender
{
NSArray *types;
NSPasteboard *dragPb;
dragPb = [sender draggingPasteboard];
types = [dragPb types];
if ([types containsObject: NSFilenamesPboardType] == YES)
{
NSArray *names = [dragPb propertyListForType: NSFilenamesPboardType];
NSString *file = [names lastObject];
[owner setDirectory: file];
return YES;
}
return NO;
}
- (BOOL) prepareForDragOperation: (id<NSDraggingInfo>)sender
{
return YES;
}
@end
@implementation NSSavePanel (_PrivateMethods) @implementation NSSavePanel (_PrivateMethods)
-(id) _initWithoutGModel -(id) _initWithoutGModel
{ {
@ -98,6 +158,7 @@ static BOOL _gs_display_reading_progress = NO;
NSImage *image; NSImage *image;
NSRect r; NSRect r;
id lastKeyView; id lastKeyView;
id panelView;
// Track window resizing so we can change number of browser columns. // Track window resizing so we can change number of browser columns.
[[NSNotificationCenter defaultCenter] addObserver: self [[NSNotificationCenter defaultCenter] addObserver: self
@ -114,10 +175,15 @@ static BOOL _gs_display_reading_progress = NO;
styleMask: (NSTitledWindowMask | NSResizableWindowMask) styleMask: (NSTitledWindowMask | NSResizableWindowMask)
backing: 2 defer: YES]; backing: 2 defer: YES];
[self setMinSize: [self frame].size]; [self setMinSize: [self frame].size];
[[self contentView] setBounds: NSMakeRect (0, 0, 308, 317)];
r = NSMakeRect (0, 0, 308, 317);
panelView = [[PanelView alloc] initWithFrame: r owner: self];
[self setContentView: panelView];
RELEASE(panelView);
[[self contentView] setBounds: r];
r = NSMakeRect (0, 64, 308, 245); r = NSMakeRect (0, 64, 308, 245);
_topView = [[NSView alloc] initWithFrame: r]; _topView = [[PanelView alloc] initWithFrame: r owner: self];
[_topView setBounds: r]; [_topView setBounds: r];
[_topView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable]; [_topView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[_topView setAutoresizesSubviews: YES]; [_topView setAutoresizesSubviews: YES];
@ -125,7 +191,7 @@ static BOOL _gs_display_reading_progress = NO;
[_topView release]; [_topView release];
r = NSMakeRect (0, 0, 308, 64); r = NSMakeRect (0, 0, 308, 64);
_bottomView = [[NSView alloc] initWithFrame: r]; _bottomView = [[PanelView alloc] initWithFrame: r owner: self];
[_bottomView setBounds: r]; [_bottomView setBounds: r];
[_bottomView setAutoresizingMask: NSViewWidthSizable|NSViewMaxYMargin]; [_bottomView setAutoresizingMask: NSViewWidthSizable|NSViewMaxYMargin];
[_bottomView setAutoresizesSubviews: YES]; [_bottomView setAutoresizesSubviews: YES];
@ -939,6 +1005,7 @@ selectCellWithString: (NSString*)title
NSMatrix *matrix; NSMatrix *matrix;
NSBrowserCell *selectedCell; NSBrowserCell *selectedCell;
NSString *filename; NSString *filename;
BOOL isDir = NO;
matrix = [_browser matrixInColumn: [_browser lastColumn]]; matrix = [_browser matrixInColumn: [_browser lastColumn]];
selectedCell = [matrix selectedCell]; selectedCell = [matrix selectedCell];
@ -976,9 +1043,50 @@ selectCellWithString: (NSString*)title
} }
ASSIGN (_directory, [_browser pathToColumn:[_browser lastColumn]]); ASSIGN (_directory, [_browser pathToColumn:[_browser lastColumn]]);
filename = [[_form cellAtIndex: 0] stringValue];
if ([filename isAbsolutePath] == YES)
{
ASSIGN (_fullFileName, filename);
}
else
{
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent: ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent:
[[_form cellAtIndex: 0] stringValue]]); filename]);
}
filename = [_fullFileName stringByDeletingLastPathComponent];
if ([_fm fileExistsAtPath: filename isDirectory: &isDir] == NO)
{
int result;
result = NSRunAlertPanel(_(@"Save"),
_(@"The directory '%@' does not exist, do you want to create it?"),
_(@"Yes"), _(@"No"), nil,
filename
);
if (result == NSAlertDefaultReturn)
{
if ([_fm createDirectoryAtPath: filename attributes: nil] == NO)
{
NSRunAlertPanel(_(@"Save"),
_(@"The directory '%@' could not be created."),
_(@"Dismiss"), nil, nil,
filename
);
return;
}
}
}
else if (isDir == NO)
{
NSRunAlertPanel(_(@"Save"),
_(@"The path '%@' is not a directory."),
_(@"Dismiss"), nil, nil,
filename
);
return;
}
if ([_fm fileExistsAtPath: [self filename] isDirectory: NULL]) if ([_fm fileExistsAtPath: [self filename] isDirectory: NULL])
{ {
int result; int result;
@ -1433,13 +1541,21 @@ createRowsForColumn: (int)column
NSComparisonResult result; NSComparisonResult result;
NSRange range; NSRange range;
matrix = [_browser matrixInColumn:[_browser lastColumn]];
s = [[[aNotification userInfo] objectForKey:@"NSFieldEditor"] string]; s = [[[aNotification userInfo] objectForKey:@"NSFieldEditor"] string];
/*
* If the user typed in an absolute path, display it.
*/
if ([s isAbsolutePath] == YES)
{
[self setDirectory: s];
}
sLength = [s length]; sLength = [s length];
range.location = 0; range.location = 0;
range.length = sLength; range.length = sLength;
matrix = [_browser matrixInColumn:[_browser lastColumn]];
if (sLength == 0) if (sLength == 0)
{ {
[matrix deselectAllCells]; [matrix deselectAllCells];