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>
* 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
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
the opena panel is the last directory selected.
the open panel is the last directory selected.
*/
- (int) runModalForDirectory: (NSString *)path
file: (NSString *)name
@ -478,6 +478,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
NSBrowserCell *selectedCell = nil;
NSArray *selectedCells = nil;
int selectedColumn, lastColumn;
NSString *tmp;
selectedColumn = [_browser selectedColumn];
lastColumn = [_browser lastColumn];
@ -489,8 +490,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
{
selectedCells = [matrix selectedCells];
if (selectedColumn == lastColumn &&
[selectedCells count] == 1)
if (selectedColumn == lastColumn && [selectedCells count] == 1)
selectedCell = [selectedCells objectAtIndex: 0];
}
else
@ -527,12 +527,20 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
}
ASSIGN (_directory, [_browser pathToColumn: [_browser lastColumn]]);
if (selectedCell)
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent:
[selectedCell stringValue]]);
tmp = [selectedCell stringValue];
else
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent:
[[_form cellAtIndex: 0] stringValue]]);
tmp = [[_form cellAtIndex: 0] stringValue];
if ([tmp isAbsolutePath] == YES)
{
ASSIGN (_fullFileName, tmp);
}
else
{
ASSIGN (_fullFileName, [_directory stringByAppendingPathComponent: tmp]);
}
if (_delegateHasValidNameFilter)
{
@ -550,6 +558,7 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
_OKButtonPressed = YES;
[NSApp stopModal];
[self close];
}
@ -604,13 +613,22 @@ static NSOpenPanel *_gs_gui_open_panel = nil;
NSComparisonResult result;
NSRange range;
matrix = [_browser matrixInColumn: [_browser lastColumn]];
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];
range.location = 0;
range.length = sLength;
matrix = [_browser matrixInColumn: [_browser lastColumn]];
if (sLength == 0)
{
[matrix deselectAllCells];

View file

@ -48,6 +48,8 @@
#include "AppKit/NSImage.h"
#include "AppKit/NSImageView.h"
#include "AppKit/NSMatrix.h"
#include "AppKit/NSPasteboard.h"
#include "AppKit/NSDragging.h"
#include "AppKit/NSSavePanel.h"
#include "AppKit/NSTextField.h"
#include "AppKit/NSWorkspace.h"
@ -90,6 +92,64 @@ static BOOL _gs_display_reading_progress = NO;
- (NSComparisonResult) _compareFilename: (NSString *)n1 with: (NSString *)n2;
@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)
-(id) _initWithoutGModel
{
@ -98,6 +158,7 @@ static BOOL _gs_display_reading_progress = NO;
NSImage *image;
NSRect r;
id lastKeyView;
id panelView;
// Track window resizing so we can change number of browser columns.
[[NSNotificationCenter defaultCenter] addObserver: self
@ -114,10 +175,15 @@ static BOOL _gs_display_reading_progress = NO;
styleMask: (NSTitledWindowMask | NSResizableWindowMask)
backing: 2 defer: YES];
[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);
_topView = [[NSView alloc] initWithFrame: r];
_topView = [[PanelView alloc] initWithFrame: r owner: self];
[_topView setBounds: r];
[_topView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[_topView setAutoresizesSubviews: YES];
@ -125,7 +191,7 @@ static BOOL _gs_display_reading_progress = NO;
[_topView release];
r = NSMakeRect (0, 0, 308, 64);
_bottomView = [[NSView alloc] initWithFrame: r];
_bottomView = [[PanelView alloc] initWithFrame: r owner: self];
[_bottomView setBounds: r];
[_bottomView setAutoresizingMask: NSViewWidthSizable|NSViewMaxYMargin];
[_bottomView setAutoresizesSubviews: YES];
@ -939,6 +1005,7 @@ selectCellWithString: (NSString*)title
NSMatrix *matrix;
NSBrowserCell *selectedCell;
NSString *filename;
BOOL isDir = NO;
matrix = [_browser matrixInColumn: [_browser lastColumn]];
selectedCell = [matrix selectedCell];
@ -976,9 +1043,50 @@ selectCellWithString: (NSString*)title
}
ASSIGN (_directory, [_browser pathToColumn:[_browser lastColumn]]);
filename = [[_form cellAtIndex: 0] stringValue];
if ([filename isAbsolutePath] == YES)
{
ASSIGN (_fullFileName, filename);
}
else
{
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])
{
int result;
@ -1433,13 +1541,21 @@ createRowsForColumn: (int)column
NSComparisonResult result;
NSRange range;
matrix = [_browser matrixInColumn:[_browser lastColumn]];
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];
range.location = 0;
range.length = sLength;
matrix = [_browser matrixInColumn:[_browser lastColumn]];
if (sLength == 0)
{
[matrix deselectAllCells];