Skip to content

Commit b1c987a

Browse files
committed
System File Chooser: macOS: Cmd+A (**Select All**) did not work in file dialog (issue #1084)
1 parent ca2f6a1 commit b1c987a

2 files changed

Lines changed: 58 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ FlatLaf Change Log
33

44
## 3.7.2-SNAPSHOT
55

6+
- System File Chooser:
7+
- macOS: `Cmd+A` (**Select All**) did not work in file dialog. (issue #1084)
68
- macOS: Fixed missing close/iconify/maximize buttons on inactive window, if
79
system appearance is dark, but application appearance is light. (issue #1032)
810

flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacFileChooser.mm

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,68 @@ - (void) windowDidBecomeMain:(NSNotification *) notification {
212212
int count = [mainMenu numberOfItems];
213213
for( int i = 0; i < count; i++ ) {
214214
NSMenuItem* menuItem = [mainMenu itemAtIndex:i];
215-
NSMenu *subenu = [menuItem submenu];
216-
if( [subenu isJavaMenu] )
215+
NSMenu *submenu = [menuItem submenu];
216+
if( [submenu isJavaMenu] )
217217
[menuItem setEnabled:NO];
218218
}
219219

220+
221+
// "Select All (Cmd+A)" in file dialog requires that a menu item
222+
// with "selectAll:" selector exists in main menu bar.
223+
224+
// change action of (disabled) Swing "Select All" menu item (if exists) to "selectAll:"
225+
NSMenuItem* swingSelectAllItem = [self findSelectAllMenuItem:mainMenu];
226+
if( swingSelectAllItem != nil )
227+
swingSelectAllItem.action = @selector(selectAll:);
228+
229+
// add invisible "Select All" menu item to application menu
230+
NSMenuItem *selectAllItem = [[NSMenuItem alloc] initWithTitle:@""
231+
action:@selector(selectAll:) keyEquivalent:@"a"];
232+
selectAllItem.keyEquivalentModifierMask = NSEventModifierFlagCommand;
233+
selectAllItem.target = nil; // use responder chain
234+
selectAllItem.view = [[NSView alloc] initWithFrame:NSMakeRect( 0, 0, 1, 1 )];
235+
NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu];
236+
[appMenu addItem:selectAllItem];
237+
238+
JNI_COCOA_CATCH()
239+
}
240+
241+
- (void) windowDidResignMain:(NSNotification *) notification {
242+
JNI_COCOA_TRY()
243+
244+
NSMenu* mainMenu = [NSApp mainMenu];
245+
246+
// remove invisible "Select All" menu item from application menu
247+
NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu];
248+
int lastIndex = appMenu.numberOfItems - 1;
249+
NSMenuItem* mi = [appMenu itemAtIndex:lastIndex];
250+
if( mi.keyEquivalentModifierMask == NSEventModifierFlagCommand && [@"a" isEqual:mi.keyEquivalent] )
251+
[appMenu removeItemAtIndex:lastIndex];
252+
253+
// restore Swing "Select All" action
254+
NSMenuItem* swingSelectAllItem = [self findSelectAllMenuItem:mainMenu];
255+
if( swingSelectAllItem != nil )
256+
swingSelectAllItem.action = @selector(handleAction:);
257+
220258
JNI_COCOA_CATCH()
221259
}
222260

261+
- (NSMenuItem*) findSelectAllMenuItem:(NSMenu *) menu {
262+
int count = [menu numberOfItems];
263+
for( int i = 0; i < count; i++ ) {
264+
NSMenuItem* mi = [menu itemAtIndex:i];
265+
if( mi.keyEquivalentModifierMask == NSEventModifierFlagCommand && [@"a" isEqual:mi.keyEquivalent] )
266+
return mi;
267+
268+
if( mi.hasSubmenu ) {
269+
NSMenuItem* mi2 = [self findSelectAllMenuItem:mi.submenu];
270+
if( mi2 != nil )
271+
return mi2;
272+
}
273+
}
274+
return nil;
275+
}
276+
223277
@end
224278

225279
//---- helper -----------------------------------------------------------------

0 commit comments

Comments
 (0)