Thanks for your feedback it is  greatly appreciated.  I did make some 
improvements last night around creating and destroying floating windows be sure 
to pull the latest update.   It fixed an issue I was encountering when invoking 
reset windows (main window never became visible again).  I've never used the 
full-screen feature but will take a look at that.  I'm learning a lot about the 
current window system as I go.

The icon issue you are experiencing could be corrected using the EditorSelector 
API rather than the IconSelector API.  The IconSelector API determines if the 
icon should be displayed (used by both the editor and view based tab controls). 
 The Editor API is used to determine which TopComponents should be considered 
"Editors".   The default IconSelector behavior is to paint icons for "Editors". 
 If you supply an EditorSelector implementation that returns true for your 
custom editors the icons should appear.  Correctly identifying which 
TopComponents are editors would also allow you to change the default floating 
window type.

My default implementation creates floating windows that inherit from JDialog 
they stay above the main window and minimize when the main window is minimized 
but  as you have noted they are not maximizable (at least on windows, they are 
on OSX). This behavior is easily changed though.  My readme needs updating but 
you can pass -Dnetbeans.winsys.enhanced.nbwindow-both=true to change that 
default behavior to create a JFrame based window for Editors and a JDialog 
based window for views (this is what NB currently does although editor/view are 
determined by mode position not TopComponent type).  

You could provide your own NbWindowSelector implementation to replace the 
default one that makes all floating windows frames.

JFrame windows behave a little differently - they can be moved below the 
main-frame and they stay open when the main-window is minimized, they get their 
own icon on the taskbar, etc.  I did try using JNA to add a maximize button to 
JDialog (on windows) for some reason when I maximized the dialog NB crashed.  
I've used this  native approach before in non NB Java apps.  I'm not sure if 
the crash was specific to a more recent Java version.  It would be awesome if I 
could get that working (Eclipse seems to create maximizable dialogs - via SWT 
for additional windows).

Thanks again for helping!

-Graeme

On 6/7/19, 11:25 PM, "Eirik Bakke" <eba...@ultorg.com> wrote:

    Great work, Graeme!
    
    I tested the patched IDE, and also tested my my NetBeans Platform 
application against your patch (with -J-Dnetbeans.winsys.enhanced=true). I'm on 
Windows 10.
    
    Some things I tested, where I didn't find any issues:
    * Make a floating window and add some tabs in the various new available 
modes. Seems to work--great!
    * My NetBeans Platform app disables the status bar. This did not seem to 
cause trouble, even when a text file editor was open both in the main window 
and in a floating window.
    * My NetBeans Platform app uses an "editor" component which is not really a 
text editor. Thus the new icon logic doesn't work. But I see you have a special 
IconSelector API for this, so you already thought of that...
    * Pressing Ctrl+1 from a floating window correctly selects the Projects 
pane in another window.
    
    Some issues I bumped into:
    * Floating windows no longer seem to be maximizable? With floating windows 
becoming more powerful, I'd imagine the first thing one would do would be to 
maximize the floating window to cover an entire secondary monitor.
    * Enter full screen mode with a floating window open. After exiting full 
screen mode, I was unable to find the floating window again (though not every 
time). I tried invoking "Reset Windows", but then crashed NetBeans completely 
[1].
    
    Some related issues that are probably not due to the patch:
    * Dragging a tab to configure modes works badly on my HiDPI screen (which I 
use in a multi-monitor setup with one regular screen). But that's the case with 
unpatched NetBeans as well.
    
    I'll continue running my NetBeans app with the patch enabled for the next 
few days!
    
    -- Eirik
    
    [1] Stack trace:
    java.awt.IllegalComponentStateException: Native resources unavailable
        at java.desktop/sun.awt.windows.WWindowPeer.getScreenImOn(Native Method)
        at 
java.desktop/sun.awt.windows.WWindowPeer.updateGC(WWindowPeer.java:509)
        at java.desktop/sun.awt.windows.WWindowPeer.show(WWindowPeer.java:263)
        at 
java.desktop/sun.awt.windows.WComponentPeer.setVisible(WComponentPeer.java:123)
        at java.desktop/java.awt.Dialog.conditionalShow(Dialog.java:938)
        at java.desktop/java.awt.Dialog.show(Dialog.java:1037)
        at java.desktop/java.awt.Component.show(Component.java:1669)
        at java.desktop/java.awt.Component.setVisible(Component.java:1616)
        at java.desktop/java.awt.Window.setVisible(Window.java:1017)
        at java.desktop/java.awt.Dialog.setVisible(Dialog.java:1005)
        at 
org.netbeans.core.windows.view.ViewHierarchy.setSplitRootIntoDesktop(ViewHierarchy.java:754)
        at 
org.netbeans.core.windows.view.ViewHierarchy.updateViewHierarchy(ViewHierarchy.java:209)
        at 
org.netbeans.core.windows.view.DefaultView.changeGUI(DefaultView.java:145)
        at 
org.netbeans.core.windows.ViewRequestor.dispatchRequest(ViewRequestor.java:255)
        at 
org.netbeans.core.windows.ViewRequestor.processRequest(ViewRequestor.java:231)
        at 
org.netbeans.core.windows.ViewRequestor.postRequest(ViewRequestor.java:169)
        at 
org.netbeans.core.windows.ViewRequestor.scheduleRequest(ViewRequestor.java:107)
        at 
org.netbeans.core.windows.Central.addModeOpenedTopComponent(Central.java:782)
        at 
org.netbeans.core.windows.ModeImpl.addOpenedTopComponent(ModeImpl.java:329)
        at 
org.netbeans.core.windows.WindowManagerImpl.deselectEditorTopComponents(WindowManagerImpl.java:1852)
        at 
org.netbeans.core.windows.actions.ResetWindowsAction.actionPerformed(ResetWindowsAction.java:107)
        at 
org.openide.awt.AlwaysEnabledAction$1.run(AlwaysEnabledAction.java:174)
        at org.openide.util.actions.ActionInvoker$1.run(ActionInvoker.java:70)
        at 
org.openide.util.actions.ActionInvoker.doPerformAction(ActionInvoker.java:91)
        at 
org.openide.util.actions.ActionInvoker.invokeAction(ActionInvoker.java:74)
        at 
org.openide.awt.AlwaysEnabledAction.actionPerformed(AlwaysEnabledAction.java:177)
        at 
java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
        at 
java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
        at 
java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
        at 
java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at 
java.desktop/javax.swing.AbstractButton.doClick(AbstractButton.java:369)
        at 
java.desktop/javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:980)
        at 
java.desktop/javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1024)
        at 
java.desktop/java.awt.Component.processMouseEvent(Component.java:6578)
        at 
java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3343)
        at java.desktop/java.awt.Component.processEvent(Component.java:6343)
        at java.desktop/java.awt.Container.processEvent(Container.java:2260)
        at 
java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4961)
        at 
java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2318)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
        at 
java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4912)
        at 
java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
        at 
java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
        at 
java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2304)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2758)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
        at 
java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:766)
        at java.desktop/java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:717)
        at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:711)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at 
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
        at 
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:99)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:739)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:737)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at 
java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:736)
        at 
org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
    [catch] at 
java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:199)
        at 
java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at 
java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at 
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at 
java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at 
java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    
    -----Original Message-----
    From: Tushar Joshi <tusharvjo...@gmail.com> 
    Sent: Thursday, June 6, 2019 11:08 PM
    To: dev <dev@netbeans.apache.org>
    Subject: Re: Enhanced WindowManager
    
    Thanks for this work Graeme!
    I will take a look into this Fork this coming weekend and will let you know 
my observations
    
    with regards
        Tushar
    
    Tushar Joshi, Nagpur: http://www.tusharjoshi.com
    
    * MCSD_NET C#, SCJP, RHCE, ZCE, PMP, CSM, SAFe, PRINCE2
    
    * Senior Architect @ Persistent Systems http://www.persistent.com
    * LinkedIn: http://www.linkedin.com/in/tusharvjoshi
    
    
    
    On Fri, Jun 7, 2019 at 2:47 AM Geertjan Wielenga <geert...@apache.org>
    wrote:
    
    > Simply awesome. :-)
    >
    > Gj
    >
    > On Thu, Jun 6, 2019 at 11:09 PM Graeme Ingleby <gra...@ingleby.net> wrote:
    >
    > > I have an Apache NetBeans fork where I’ve been working on some 
    > > modifications to the WindowManager.  The most notable is the ability 
    > > to split TopComponents in floating windows like you can the main 
    > > window (including sliding modes).
    > >
    > > I find the NB IDE very usable as-is but I really want/need this 
    > > functionality for my custom NB platform applications.
    > >
    > > There are various other modifications that I feel make the window 
    > > manager a little more consistent - for example currently dragging a 
    > > java file editor out of the editor region creates a frame based 
    > > floating window but moving the same editor into the output mode and 
    > > then to the desktop
    > creates
    > > a dialog based window.   This is because NB currently determines if a
    > > TopComponent should be treated as an editor or a view based on the 
    > > Mode
    > and
    > > not the TopComponent.
    > >
    > > There are some tab icon tweaks, improved z-order handling fixes to 
    > > correctly identify a drop location, etc.  All changes are documented 
    > > in
    > the
    > > fork read-me.
    > >
    > > I’ve hopefully made these changes in a backward compatible manner.  
    > > I’ve got things fairly stable now and use these modifications in my IDE 
daily.
    > > I’m aware the NetBeans window system can be used in many different 
    > > ways
    > and
    > > there are many plugins available - so I need help making sure the 
    > > changes are compatible.
    > >
    > > I would really appreciate if other developers could try my fork and
    > report
    > > any issues, potential performance problems, etc.   I’d love to be able 
to
    > > submit a pull request but could really use a little help from the
    > community
    > > first.
    > >
    > > Apache NetBeans fork:
    > >
    > > https://github.com/GIngleby16/netbeans
    > >
    > > Clone, build and run as you would the regular repo.
    > >
    > > Thanks
    > >
    > > Graeme Ingleby
    > >
    > >
    > >
    >
    
    ---------------------------------------------------------------------
    To unsubscribe, e-mail: dev-unsubscr...@netbeans.apache.org
    For additional commands, e-mail: dev-h...@netbeans.apache.org
    
    For further information about the NetBeans mailing lists, visit:
    https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
    
    
    
    

Reply via email to