Supporting the Mac OS menubar in JavaFX

steve.x.northover at oracle.com steve.x.northover at oracle.com
Mon Jan 9 10:59:11 PST 2012


.. of course I meant "stage" when I said "shell".

Steve

On 09/01/2012 1:45 PM, steve.x.northover at oracle.com wrote:
> 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