mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-05-31 21:50:46 +00:00
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:
parent
e8275452b1
commit
914ac48552
3 changed files with 243 additions and 101 deletions
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue