Supporting the Mac OS menubar in JavaFX
steve.x.northover at oracle.com
steve.x.northover at oracle.com
Mon Jan 9 10:45:30 PST 2012
Hello!
I believe there are problems with 1) and 2). First off, there is no way
to mix and match. For example, suppose I want some shells to use the
global menu bar and others to use a local menu bar. Further,
application code may put trimmings around a menu bar and when the menu
bar is "hoisted up", the window might look strange.
If we are doing 3), I think a better approach would be for the
application to decide whether it is using native menu bars or not by
explicitly setting a menu bar on a stage. It makes sense because on
platforms like Windows and GTK, there is a one-to-one mapping between
stage and menu bar so why not make this explicit in the API? One of the
problems with having API in Stage is that we don't want a reference to
MenuBar. Why don't we define something like Stage.setMenyBarArea() or
something like that to take a Node or another type instead?
Steve
On 09/01/2012 1:30 PM, Paru Somashekar wrote:
> Hello All,
>
> The following is the proposal (follow up from previous email by
> Jonathan) from UI Controls team towards an API to support native Mac
> OS menubar.
>
> 1) A new property useGlobalMenuBar would be added to MenuBar class
> whose initial value will be set to a default dictated by a property
> settable via CSS ( and set to false by default). Once again, for the
> first cut of this support in this release, this will be the only
> public API for native menubar support.
>
> 2) In the case when we have multiple Menubars specified on a stage,
> the first one wins and will be made global, i.e. provided the platform
> supports native integration and useGlobalMenuBar is set to true.
>
> 3) As mentioned in a previous email by Jonathan, we will have hooks to
> switch between stages when they become active and swap menu bars. In
> the case when we don’t find a Menubar, it will be nulled out. This is
> the path we are choosing for now and we realize that we can change
> this later with no backward compatibility issues.
> We are extending the same concept to the scenario where, when the last
> window closes; it will be nulled out as well and hence there is no
> concept of a default menubar.
>
> thanks,
> Paru.
>
> On 12/14/11 5:20 PM, Kevin Rushforth wrote:
>> An API on Stage to set a menu bar has a certain elegance, plus it
>> gets around the backward compatibility and inconsistency problems
>> that having "native" on by default would create. Unfortunately, as
>> Rich pointed out earlier, it creates an unwanted dependency from a
>> modularity point of view since Stage will be in the base module and
>> should not depend on anything in controls.
>>
>> -- Kevin
>>
>>
>> steve.x.northover at oracle.com wrote:
>>> Hello all,
>>>
>>> How about an API in Stage where you set the menu bar for the stage?
>>> This is the menu that you wish to be native and the application very
>>> is clear about this. There can only be one real menu bar on Windows.
>>> Application code can ask for the menu bar and add items to it. If
>>> you have a property, application code needs to do the same search
>>> that FX does to determine if there is an active menu bar.
>>>
>>> Here is what I think about focus: On the Mac, when a stage gets
>>> focus, it sets the native menu bar. When it loses focus, it clears
>>> the native menu bar. Retaining the menu from the previous stage is
>>> unlikely to be the right thing to do as an application can have many
>>> different stages around and only the application can know whether
>>> the current menu bar applies to a stage.
>>>
>>> Steve
>>>
>>> On 14/12/2011 6:31 PM, Jonathan Giles wrote:
>>>> Hi All,
>>>>
>>>> Here's an update from the UI controls team as to how we see the
>>>> native Mac OS menubar support working. Your thoughts are appreciated.
>>>>
>>>> After discussing it again today, we think that the approach
>>>> suggested by Richard in an earlier email in this thread makes the
>>>> best sense, in terms of modularity and code cleanliness. I'll
>>>> explain this further shortly...
>>>>
>>>> The thinking is to add a new property to
>>>> javafx.scene.control.MenuBar. We haven't settled on a name, but
>>>> it's something along the lines of 'native', 'global',
>>>> 'globalMenuBar', 'screenMenuBar', or 'applicationMenuBar'. Whatever
>>>> property name we use, we'll expand it out to have the usual
>>>> set*/get*/*property methods. This would be the only public API we
>>>> end up adding for native menubar support. For the remainder of this
>>>> email I refer to this property as 'native'.
>>>>
>>>> This property will by default be true, indicating that on platforms
>>>> where we support native integration, it'll happen by default.
>>>>
>>>> On a platform that supports native integration, we'll find the
>>>> 'first' MenuBar in the scene that has the 'native' property set to
>>>> true. We can't guarantee that we'll find necessarily the physically
>>>> top-most MenuBar as that is really a matter of how the scenegraph
>>>> is laid out. Of course, this is only a problem in situations where
>>>> the scene contains multiple MenuBars where 'native' is true in more
>>>> than one of them, which we hope won't often be the case. If a Scene
>>>> does have multiple MenuBars with 'native' set to true, the
>>>> behaviour is undefined. If the wrong MenuBar is made native, you
>>>> can help provide a hint by setting 'native' to false in the
>>>> relevant place(s).
>>>>
>>>> We'll also hook into the Stage and listen to the relevant events,
>>>> such that when a Stage gains focus, we'll switch in any native
>>>> menubars found in the scene of that stage. If no relevant MenuBar
>>>> is found, then we can either retain the MenuBar from the previous
>>>> stage, or null it out. I'm going to assume the former is by far
>>>> going to win this vote, but feel free to surprise me.
>>>>
>>>> Using this approach, developer code should be cleaner. Your user
>>>> interface should position a MenuBar where it makes sense for your
>>>> application, regardless of the operating system (normally at the
>>>> very top of your scene). On platforms where native integration is
>>>> supported, the JavaFX-rendered MenuBar will not be rendered
>>>> (although it'll likely remain in the scenegraph as a no-op
>>>> control). If the 'native' property changes, we'll flick between the
>>>> native and JavaFX-rendered MenuBar as expected. This approach means
>>>> there is no operating system dependent code in your user interface.
>>>>
>>>> As I mentioned - we're totally open to discussion on any of these
>>>> points. Any thoughts?
>>>>
>>>> -- Jonathan
>>>>
>>>> On 10/12/2011 8:56 a.m., Jonathan Giles wrote:
>>>>> Hi all,
>>>>>
>>>>> One of the things we're planning to support in JavaFX 2.1 is the
>>>>> native Mac OS menubar. This email is intended primarily to discuss
>>>>> the API one expects to see to set a MenuBar in the native Mac OS
>>>>> menubar area. Your feedback is sought and will be very much
>>>>> appreciated.
>>>>>
>>>>> The current thinking is that Application feels like the right
>>>>> place to specify a global, application-wide
>>>>> javafx.scene.control.MenuBar on. It could be assumed that if a
>>>>> developer were to set this property, and the operating system upon
>>>>> which the end-user was running the JavaFX application was Mac OS,
>>>>> that the menubar will be displayed using the native Mac OS
>>>>> menubar. Of course, if a developer wants a cross-platform look and
>>>>> feel, they could just place the MenuBar in the stage as per usual
>>>>> and it would display as it currently does. This approach opens up
>>>>> a number of questions and issues:
>>>>>
>>>>> 1) What happens in the case of the end-user being on Windows? Is
>>>>> the Application.MenuBar ignored, or is it automagically added to
>>>>> the main Stage? (I would argue for totally ignoring it....but that
>>>>> leads to the next point).
>>>>> 2) This approach means there needs to be operating specific code
>>>>> in the UI to test whether a non-native MenuBar should be added (in
>>>>> the case of Windows, for example). This starts to clutter the UI
>>>>> code, and without careful consideration by the developer may
>>>>> result in needing to duplicate their MenuBar code. Is there a
>>>>> better approach?
>>>>>
>>>>> Another place to specify a MenuBar would be on Stage, rather than
>>>>> (or in addition to), Application. Having a MenuBar property on
>>>>> Stage would allow for the MenuBar to change based on the currently
>>>>> focused Stage - but I'm not certain this is desirable or even the
>>>>> expected behaviour of Mac OS. Therefore, I'm thinking that this is
>>>>> not likely to happen unless we hear otherwise.
>>>>>
>>>>> Like I said, we're at a very early exploration point in this
>>>>> process. The controls team is very keen to hear feedback from the
>>>>> community, as well as from the owners of the Application API, and
>>>>> the Mac OS experts on this list.
>>>>>
>>>>> Thanks,
>>>>> -- Jonathan
>
More information about the openjfx-dev
mailing list