/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package de.markiewb.netbeans.plugins.showonlyeditor; import static java.awt.Frame.MAXIMIZED_BOTH; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import static java.util.Arrays.asList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.prefs.BackingStoreException; import javax.swing.Action; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.awt.ActionReferences; import org.openide.awt.ActionRegistration; import org.openide.util.Exceptions; import org.openide.util.NbBundle.Messages; import org.openide.util.NbPreferences; import org.openide.windows.Mode; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; import org.openide.windows.WindowSystemListener; @ActionID( category = "Window", id = "de.markiewb.netbeans.plugins.showonlyeditor.ShowOnlyEditorWithToolbarsAction" ) @ActionRegistration( displayName = "#CTL_ShowOnlyEditorWithToolbarsAction" ) @ActionReferences({ @ActionReference(path = "Menu/View", position = 1195), @ActionReference(path = "Shortcuts", name = "DOS-ENTER") }) @Messages("CTL_ShowOnlyEditorWithToolbarsAction=Show Only Editor (With Toolbars)") public final class ShowOnlyEditorWithToolbarsAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { java.util.prefs.Preferences globalPreferences = NbPreferences.forModule(ShowOnlyEditorWithToolbarsAction.class); Map modeMap = new HashMap<>(); WindowManager manager = org.openide.windows.WindowManager.getDefault(); boolean shouldMinimize = shouldTCsBeMinimized(manager); final PropertyChangeListenerImpl propertyChangeListenerImpl = new PropertyChangeListenerImpl(); TopComponent.getRegistry().addPropertyChangeListener(propertyChangeListenerImpl); MyRunnable action; if (!shouldMinimize) { //Undo minimize action=new MyRunnable() { public void run(TopComponent openedTopComponent) { org.openide.awt.Actions.forID("Window", "org.netbeans.core.windows.actions.DockWindowAction").actionPerformed(null); } }; } else { //minimize action=new MyRunnable() { public void run(TopComponent openedTopComponent) { WindowManager.getDefault().setTopComponentMinimized(openedTopComponent, true); org.openide.awt.Actions.forID("Window", "org.netbeans.core.windows.actions.MinimizeWindowAction").actionPerformed(null); } }; } for (Mode mode : manager.getModes()) { final boolean editorMode = manager.isEditorMode(mode); if (editorMode) { continue; } TopComponent[] openedTopComponents = manager.getOpenedTopComponents(mode); if (openedTopComponents.length <= 0) { continue; } final TopComponent selectedTopComponent = mode.getSelectedTopComponent(); if (null != selectedTopComponent) { String selectedTCperMode = manager.findTopComponentID(selectedTopComponent); modeMap.put(mode.getName(), selectedTCperMode); } //reverse TC to retain original order List tcS = new ArrayList<>(asList(openedTopComponents)); Collections.reverse(tcS); for (TopComponent openedTopComponent : tcS) { if (manager.isTopComponentFloating(openedTopComponent)) { continue; } // openedTopComponent.requestActive(); // openedTopComponent.requestFocusInWindow(); // WindowManager.getDefault().setTopComponentMinimized(openedTopComponent, true); action.run(); } if (!shouldMinimize) { String name = mode.getName(); String get = globalPreferences.get(name, null); if (get != null) { TopComponent previouslySelectedTC = manager.findTopComponent(get); previouslySelectedTC.requestActive(); previouslySelectedTC.requestFocus(); } } } maximizeMainWindow(manager); //Persist selected TC in modes if (shouldMinimize) { // System.out.println("modeMap = " + modeMap); try { globalPreferences.clear(); } catch (BackingStoreException ex) { Exceptions.printStackTrace(ex); } for (Map.Entry entrySet : modeMap.entrySet()) { String key = entrySet.getKey(); String value = entrySet.getValue(); globalPreferences.put(key, value); } } focusEditor(); TopComponent.getRegistry().removePropertyChangeListener(propertyChangeListenerImpl); } private boolean shouldTCsBeMinimized(WindowManager manager) { long countTC = 0; long countMinimized = 0; long countFloating = 0; for (Mode mode : manager.getModes()) { final boolean editorMode = manager.isEditorMode(mode); if (editorMode) { continue; } TopComponent[] openedTopComponents = manager.getOpenedTopComponents(mode); for (TopComponent openedTopComponent : openedTopComponents) { countTC++; if (manager.isTopComponentFloating(openedTopComponent)) { countFloating++; } if (manager.isTopComponentMinimized(openedTopComponent)) { countMinimized++; } } } final boolean shouldMinimize = (countMinimized) != (countTC - countFloating); return shouldMinimize; } private void maximizeMainWindow(WindowManager manager) { manager.getMainWindow().setExtendedState(MAXIMIZED_BOTH); } private static void focusEditor() { Mode findMode = WindowManager.getDefault().findMode("editor"); TopComponent selectedTopComponent = findMode.getSelectedTopComponent(); focusTC(selectedTopComponent); } private static void focusTC(TopComponent selectedTopComponent) { if (null != selectedTopComponent) { // selectedTopComponent.requestFocus(); selectedTopComponent.requestActive(); selectedTopComponent.requestFocusInWindow(); } } private static class MyRunnable { public MyRunnable() { } } private static class PropertyChangeListenerImpl implements PropertyChangeListener { public PropertyChangeListenerImpl() { } @Override public void propertyChange(PropertyChangeEvent evt) { TopComponent activated = TopComponent.getRegistry().getActivated(); if (null != activated) { String findTopComponentID = WindowManager.getDefault().findTopComponentID(activated); if ("navigatorTC".equals(findTopComponentID)) { System.out.println(findTopComponentID + " --evt = " + evt); // focusEditor(); } } else { // System.out.println("???????????? --evt = " + evt); } } } } ----- Classpath: --------------------------------------------- bootPath: C:\Program Files\Java\jdk1.7.0_45\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_45\jre\classes;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext\zipfs.jar classPath: C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-api-annotations-common\RELEASE80\org-netbeans-api-annotations-common-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-actions\RELEASE80\org-openide-actions-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-dialogs\RELEASE80\org-openide-dialogs-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-api-progress\RELEASE80\org-netbeans-api-progress-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-explorer\RELEASE80\org-openide-explorer-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-swing-outline\RELEASE80\org-netbeans-swing-outline-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-swing-tabcontrol\RELEASE80\org-netbeans-swing-tabcontrol-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-nodes\RELEASE80\org-openide-nodes-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-text\RELEASE80\org-openide-text-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-modules-editor-mimelookup\RELEASE80\org-netbeans-modules-editor-mimelookup-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-util\RELEASE80\org-openide-util-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-awt\RELEASE80\org-openide-awt-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-filesystems\RELEASE80\org-openide-filesystems-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-windows\RELEASE80\org-openide-windows-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-util-lookup\RELEASE80\org-openide-util-lookup-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-modules-settings\RELEASE80\org-netbeans-modules-settings-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-loaders\RELEASE80\org-openide-loaders-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-netbeans-modules-queries\RELEASE80\org-netbeans-modules-queries-RELEASE80.jar;C:\Users\markiewb\.m2\repository\org\netbeans\api\org-openide-modules\RELEASE80\org-openide-modules-RELEASE80.jar sourcePath: C:\Users\markiewb\Documents\NetBeansProjects\mavenproject10\src\main\java;C:\Users\markiewb\Documents\NetBeansProjects\mavenproject10\target\generated-sources\annotations;C:\Users\markiewb\Documents\NetBeansProjects\mavenproject10\src\main\resources ----- Original exception --------------------------------------------- java.lang.NullPointerException at org.netbeans.modules.java.source.PostFlowAnalysis.visitMethodDef(PostFlowAnalysis.java:171) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:784) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57) at com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:80) at org.netbeans.modules.java.source.PostFlowAnalysis.visitClassDef(PostFlowAnalysis.java:144) at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:698) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.visitNewClass(TreeScanner.java:208) at org.netbeans.modules.java.source.PostFlowAnalysis.visitNewClass(PostFlowAnalysis.java:184) at com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1522) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.visitAssign(TreeScanner.java:231) at com.sun.tools.javac.tree.JCTree$JCAssign.accept(JCTree.java:1692) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.visitExec(TreeScanner.java:175) at com.sun.tools.javac.tree.JCTree$JCExpressionStatement.accept(JCTree.java:1302) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57) at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:105) at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:915) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.visitIf(TreeScanner.java:170) at com.sun.tools.javac.tree.JCTree$JCIf.accept(JCTree.java:1275) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57) at com.sun.tools.javac.tree.TreeScanner.visitBlock(TreeScanner.java:105) at com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:915) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.visitMethodDef(TreeScanner.java:91) at org.netbeans.modules.java.source.PostFlowAnalysis.visitMethodDef(PostFlowAnalysis.java:166) at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:784) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57) at com.sun.tools.javac.tree.TreeScanner.visitClassDef(TreeScanner.java:80) at org.netbeans.modules.java.source.PostFlowAnalysis.visitClassDef(PostFlowAnalysis.java:144) at com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:698) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:57) at com.sun.tools.javac.tree.TreeScanner.visitTopLevel(TreeScanner.java:68) at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:520) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at org.netbeans.modules.java.source.PostFlowAnalysis.scan(PostFlowAnalysis.java:132) at org.netbeans.modules.java.source.PostFlowAnalysis.analyze(PostFlowAnalysis.java:110) at org.netbeans.modules.java.source.parsing.JavacParser.moveToPhase(JavacParser.java:664) at org.netbeans.modules.java.source.parsing.JavacParser.getResult(JavacParser.java:519) at org.netbeans.modules.java.source.parsing.JavacParser.getResult(JavacParser.java:174) at org.netbeans.modules.parsing.impl.TaskProcessor.callGetResult(TaskProcessor.java:620) at org.netbeans.modules.parsing.impl.SourceCache.getResult(SourceCache.java:256) at org.netbeans.modules.parsing.impl.TaskProcessor$CompilationJob.run(TaskProcessor.java:733) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1423) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2033)