From f40baed65e6f192a906ce63d979bcf0eb5becc41 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 10 Dec 2023 13:34:41 +0100 Subject: [PATCH] macOS large title bar: add NSToolbar to NSWindow --- .../flatlaf/ui/FlatNativeMacLibrary.java | 2 + .../com/formdev/flatlaf/demo/DemoFrame.java | 50 ++++++++++++++++++- .../com/formdev/flatlaf/demo/FlatLafDemo.java | 5 ++ ..._formdev_flatlaf_ui_FlatNativeMacLibrary.h | 8 +++ .../src/main/objcpp/MacWindow.mm | 24 +++++++++ 5 files changed, 88 insertions(+), 1 deletion(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java index 3799bfd9..6e4e7ba3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeMacLibrary.java @@ -53,4 +53,6 @@ public class FlatNativeMacLibrary } public native static boolean setWindowRoundedBorder( Window window, float radius, float borderWidth, int borderColor ); + + public native static void setWindowToolbar( Window window ); } diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java index 1a5d3da3..e5e9cbde 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java @@ -101,7 +101,7 @@ class DemoFrame setTitle( null ); // add gap to left side of toolbar - toolBar.add( Box.createHorizontalStrut( 70 ), 0 ); + toolBar.add( Box.createHorizontalStrut( 80 ), 0 ); } // enable full screen mode for this window (for Java 8 - 10; not necessary for Java 11+) @@ -903,6 +903,54 @@ class DemoFrame buttonGroup1.add(radioButtonMenuItem3); // JFormDesigner - End of component initialization //GEN-END:initComponents + backButton.addActionListener( e -> System.out.println( e ) ); + backButton.addMouseListener( new MouseListener() { + + @Override + public void mouseReleased( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m release" ); + } + + @Override + public void mousePressed( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m press" ); + } + + @Override + public void mouseExited( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m exit" ); + } + + @Override + public void mouseEntered( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m ent" ); + } + + @Override + public void mouseClicked( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m click" ); + } + } ); + backButton.addMouseMotionListener( new MouseMotionListener() { + + @Override + public void mouseMoved( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m moved" ); + } + + @Override + public void mouseDragged( MouseEvent e ) { + // TODO Auto-generated method stub + System.out.println( "m drag" ); + } + } ); + // add "Users" button to menubar FlatButton usersButton = new FlatButton(); usersButton.setIcon( new FlatSVGIcon( "com/formdev/flatlaf/demo/icons/users.svg" ) ); diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java index 4a55f459..03bdcc01 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java @@ -27,6 +27,7 @@ import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.fonts.roboto_mono.FlatRobotoMonoFont; +import com.formdev.flatlaf.ui.FlatNativeMacLibrary; import com.formdev.flatlaf.util.SystemInfo; /** @@ -117,6 +118,10 @@ public class FlatLafDemo // show frame frame.pack(); frame.setLocationRelativeTo( null ); + if( SystemInfo.isMacOS && FlatNativeMacLibrary.isLoaded() ) { + // TODO use client property + FlatNativeMacLibrary.setWindowToolbar( frame ); + } frame.setVisible( true ); } ); } diff --git a/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h b/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h index f5bcd35b..6fd71690 100644 --- a/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h +++ b/flatlaf-natives/flatlaf-natives-macos/src/main/headers/com_formdev_flatlaf_ui_FlatNativeMacLibrary.h @@ -15,6 +15,14 @@ extern "C" { JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowRoundedBorder (JNIEnv *, jclass, jobject, jfloat, jfloat, jint); +/* + * Class: com_formdev_flatlaf_ui_FlatNativeMacLibrary + * Method: setWindowToolbar + * Signature: (Ljava/awt/Window;)V + */ +JNIEXPORT void JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowToolbar + (JNIEnv *, jclass, jobject); + #ifdef __cplusplus } #endif diff --git a/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm b/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm index 5d81a51c..40f2190a 100644 --- a/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm +++ b/flatlaf-natives/flatlaf-natives-macos/src/main/objcpp/MacWindow.mm @@ -87,3 +87,27 @@ JNIEXPORT jboolean JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setW JNI_COCOA_EXIT() return FALSE; } + +extern "C" +JNIEXPORT void JNICALL Java_com_formdev_flatlaf_ui_FlatNativeMacLibrary_setWindowToolbar + ( JNIEnv* env, jclass cls, jobject window ) +{ + JNI_COCOA_ENTER() + + NSWindow* nsWindow = getNSWindow( env, cls, window ); + if( nsWindow == NULL ) + return; + + [FlatJNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + NSLog( @"\n%@\n\n", [nsWindow.contentView.superview _subtreeDescription] ); + + NSToolbar* toolbar = [NSToolbar new]; + nsWindow.toolbar = toolbar; + + // TODO handle fullscreen + + NSLog( @"\n%@\n\n", [nsWindow.contentView.superview _subtreeDescription] ); + }]; + + JNI_COCOA_EXIT() +}