diff --git a/enterprise/payara.tooling/nbproject/project.properties b/enterprise/payara.tooling/nbproject/project.properties index 0f4ec98bc91a..0d2669d99ce7 100644 --- a/enterprise/payara.tooling/nbproject/project.properties +++ b/enterprise/payara.tooling/nbproject/project.properties @@ -14,5 +14,5 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -javac.source=1.8 +javac.release=21 javac.compilerargs=-Xlint -Xlint:-serial diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/JavaSEPlatform.java b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/JavaSEPlatform.java index 67d45035594b..bad93c1fcb12 100644 --- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/JavaSEPlatform.java +++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/JavaSEPlatform.java @@ -50,7 +50,9 @@ public enum JavaSEPlatform { /** JavaSE 17. */ v17, /** JavaSE 21. */ - v21; + v21, + /** JavaSE 25. */ + v25; // Class attributes // /** Payara JavaEE platform enumeration length. */ @@ -92,6 +94,9 @@ public enum JavaSEPlatform { /** A String representation of v21 value. */ static final String V21_STR = "21"; + /** A String representation of v25 value. */ + static final String V25_STR = "25"; + /** * Stored String values for backward String * conversion. @@ -136,22 +141,19 @@ public static JavaSEPlatform toValue(final String platformName) { */ @Override public String toString() { - switch (this) { - case v1_1: return V1_1_STR; - case v1_2: return V1_2_STR; - case v1_3: return V1_3_STR; - case v1_4: return V1_4_STR; - case v1_5: return V1_5_STR; - case v1_6: return V1_6_STR; - case v1_7: return V1_7_STR; - case v1_8: return V1_8_STR; - case v11: return V11_STR; - case v17: return V17_STR; - case v21: return V21_STR; - // This is unrecheable. Being here means this class does not handle - // all possible values correctly. - default: throw new ServerConfigException( - ServerConfigException.INVALID_SE_PLATFORM_VERSION); - } + return switch (this) { + case v1_1 -> V1_1_STR; + case v1_2 -> V1_2_STR; + case v1_3 -> V1_3_STR; + case v1_4 -> V1_4_STR; + case v1_5 -> V1_5_STR; + case v1_6 -> V1_6_STR; + case v1_7 -> V1_7_STR; + case v1_8 -> V1_8_STR; + case v11 -> V11_STR; + case v17 -> V17_STR; + case v21 -> V21_STR; + case v25 -> V25_STR; + }; } } diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV6.xml b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV6.xml index a8318a94eee3..8fe84c63b8c4 100644 --- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV6.xml +++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV6.xml @@ -35,6 +35,10 @@ under the License. + + + + diff --git a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV7.xml b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV7.xml index b003efb894ed..3090800f1be6 100644 --- a/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV7.xml +++ b/enterprise/payara.tooling/src/org/netbeans/modules/payara/tooling/server/config/PayaraV7.xml @@ -25,6 +25,13 @@ under the License. + + + + + + + diff --git a/ide/editor/src/org/netbeans/modules/editor/EditorModule.java b/ide/editor/src/org/netbeans/modules/editor/EditorModule.java index 12f5fb052ca8..eb8f3f0848ca 100644 --- a/ide/editor/src/org/netbeans/modules/editor/EditorModule.java +++ b/ide/editor/src/org/netbeans/modules/editor/EditorModule.java @@ -250,6 +250,8 @@ public void run() { if (topComponentRegistryListener != null) { TopComponent.getRegistry().removePropertyChangeListener(topComponentRegistryListener); } + + // TODO AppContext and kitRegistryKey don't exist anymore in JDK 27+ // unregister our registry try { diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java index 9205dd65fc92..8fa6e264307e 100644 --- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java +++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java @@ -180,6 +180,7 @@ import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.api.sendopts.CommandLine; import org.netbeans.junit.NbTestCase; +import org.netbeans.junit.RandomlyFails; import org.netbeans.modules.java.hints.infrastructure.JavaErrorProvider; import static org.netbeans.modules.java.lsp.server.LspTestUtils.tripleSlashUri; import org.netbeans.modules.java.lsp.server.TestCodeLanguageClient; @@ -4730,6 +4731,7 @@ private Launcher createClientLauncherWithLogging(LanguageClient return builder.create(); } + @RandomlyFails // causes frequent CI failures public void testChangeMethodParameters() throws Exception { File src = new File(getWorkDir(), "a/Foo.java"); src.getParentFile().mkdirs(); diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CompilationInfoImpl.java b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CompilationInfoImpl.java index 9b838b417d21..1269c6c7cbcf 100644 --- a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CompilationInfoImpl.java +++ b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/CompilationInfoImpl.java @@ -518,6 +518,10 @@ void setChangedMethod (final Pair changedMethod) { userCache.remove(CacheClearPolicy.ON_TASK_END); userCache.remove(CacheClearPolicy.ON_CHANGE); } + + boolean isDetached() { + return isDetached; + } /** * Sets the {@link CompilationUnitTree} diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java index 158baed2b23b..6b7483c1b31e 100644 --- a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java +++ b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/JavacParser.java @@ -423,7 +423,7 @@ private void parseImpl( boolean needsFullReparse = true; if (supportsReparse) { final Pair _changedMethod = changedMethod.getAndSet(null); - if (_changedMethod != null && ciImpl != null) { + if (_changedMethod != null && ciImpl != null && !ciImpl.isDetached()) { LOGGER.log(Level.FINE, "\t:trying partial reparse:\n{0}", _changedMethod.first().getText()); //NOI18N PartialReparser reparser = Lookup.getDefault().lookup(PartialReparser.class); needsFullReparse = !reparser.reparseMethod(ciImpl, snapshot, _changedMethod.second(), _changedMethod.first().getText()); @@ -683,7 +683,7 @@ Phase moveToPhase (final Phase phase, final CompilationInfoImpl currentInfo, Lis currentInfo.setCompilationUnit(unit); final Document doc = currentInfo.getDocument(); - if (doc != null && supportsReparse) { + if (doc != null && supportsReparse && !currentInfo.isDetached()) { final FindMethodRegionsVisitor v = new FindMethodRegionsVisitor(doc,Trees.instance(currentInfo.getJavacTask()).getSourcePositions(),this.parserCanceled, unit); doc.render(v); synchronized (positions) { diff --git a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PartialReparseTest.java b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PartialReparseTest.java index ab2925c30df8..064e55bd4776 100644 --- a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PartialReparseTest.java +++ b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/PartialReparseTest.java @@ -24,6 +24,7 @@ import com.sun.source.tree.Tree.Kind; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; +import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; @@ -52,12 +53,15 @@ import org.netbeans.modules.java.source.TestUtil; import org.openide.util.SharedClassObject; import org.netbeans.api.editor.mimelookup.test.MockMimeLookup; +import org.netbeans.api.java.source.CompilationController; import org.netbeans.api.java.source.CompilationInfo; import org.netbeans.api.java.source.ElementHandle; import org.netbeans.api.java.source.SourceUtils; +import org.netbeans.modules.java.preprocessorbridge.api.JavaSourceUtil; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.cookies.EditorCookie; +import org.openide.util.Exceptions; /** * @@ -380,12 +384,38 @@ public enum E { info -> {}); } + public void testTaggedControllerDoesNotBreakPartialReparse() throws Exception { + doRunTest(""" + package test; + public class Test { + void t() { + java.util.List.of("a").stream().^^ + } + } + """, + "filter(predicate)", + info -> {}, + file -> { + try { + CompilationController cc = (CompilationController) + JavaSourceUtil.createControllerHandle(file, 0, null) + .getCompilationController(); + cc.toPhase(Phase.RESOLVED); + } catch (IOException ex) { + throw new AssertionError(ex.getMessage(), ex); + } + }); + } + private void doRunTest(String code, String inject) throws Exception { doRunTest(code, inject, info -> {}); } private void doRunTest(String code, String inject, Consumer callback) throws Exception { + doRunTest(code, inject, callback, file -> {}); + } + private void doRunTest(String code, String inject, Consumer callback, Consumer runBeforeModification) throws Exception { FileObject srcDir = FileUtil.createFolder(getWorkDir()); FileObject src = srcDir.createFolder("test").createData("Test.java"); @@ -405,6 +435,8 @@ private void doRunTest(String code, String inject, Consumer cal callback.accept(cc); }, true); + runBeforeModification.accept(src); + // replace snippet and run again replaceSourceSnippetInDoc(doc, code, inject); AtomicReference> actualTree = new AtomicReference<>(); diff --git a/java/maven/src/org/netbeans/modules/maven/api/archetype/ArchetypeWizards.java b/java/maven/src/org/netbeans/modules/maven/api/archetype/ArchetypeWizards.java index 39b25af81fd3..e10f6238b82e 100644 --- a/java/maven/src/org/netbeans/modules/maven/api/archetype/ArchetypeWizards.java +++ b/java/maven/src/org/netbeans/modules/maven/api/archetype/ArchetypeWizards.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Set; import org.netbeans.api.annotations.common.NullAllowed; -import org.netbeans.api.project.Project; import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.modules.maven.model.ModelOperation; import org.netbeans.modules.maven.model.pom.POMModel; @@ -32,7 +31,6 @@ import org.netbeans.modules.maven.newproject.BasicWizardPanel; import org.netbeans.modules.maven.newproject.MavenWizardIterator; import org.netbeans.validation.api.ui.ValidationGroup; -import org.netbeans.validation.api.ui.ValidationGroupProvider; import org.openide.WizardDescriptor; import org.openide.filesystems.FileObject; diff --git a/java/maven/src/org/netbeans/modules/maven/newproject/ArchetypeWizardUtils.java b/java/maven/src/org/netbeans/modules/maven/newproject/ArchetypeWizardUtils.java index 6a787e10d966..58369f5d05a9 100644 --- a/java/maven/src/org/netbeans/modules/maven/newproject/ArchetypeWizardUtils.java +++ b/java/maven/src/org/netbeans/modules/maven/newproject/ArchetypeWizardUtils.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; -import java.util.Enumeration; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; @@ -64,8 +63,6 @@ public class ArchetypeWizardUtils { /** {@code Map} of custom archetype properties to define. */ public static final String ADDITIONAL_PROPS = "additionalProps"; // NOI18N - private static final Logger LOG = Logger.getLogger(ArchetypeWizardUtils.class.getName()); - private ArchetypeWizardUtils() { } @@ -87,12 +84,12 @@ private static void runArchetype(File directory, ProjectInfo vi, Archetype arch, config.setProperty("artifactId", vi.artifactId); //NOI18N config.setProperty("version", vi.version); //NOI18N final String pack = vi.packageName; - if (pack != null && pack.trim().length() > 0) { + if (pack != null && !pack.isBlank()) { config.setProperty("package", pack); //NOI18N } config.setProperty("basedir", directory.getAbsolutePath());//NOI18N - Map baseprops = new HashMap(config.getProperties()); + Map baseprops = new HashMap<>(config.getProperties()); if (additional != null) { for (Map.Entry entry : additional.entrySet()) { @@ -163,7 +160,7 @@ public static void createFromArchetype(File projDir, ProjectInfo vi, Archetype a if (parent == null) { throw new IOException("no parent of " + projDir); } - if (updateLastUsedProjectDir && parent != null && parent.exists()) { + if (updateLastUsedProjectDir && parent.exists()) { ProjectChooser.setProjectsFolder(parent); } if (!parent.isDirectory() && !parent.mkdirs()) { @@ -217,9 +214,7 @@ private static void processProjectFolder(final FileObject fo) { if (watch != null) { watch.downloadDependencyAndJavadocSource(false); } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } catch (IllegalArgumentException ex) { + } catch (IOException | IllegalArgumentException ex) { Exceptions.printStackTrace(ex); } } diff --git a/java/maven/src/org/netbeans/modules/maven/newproject/MavenWizardIterator.java b/java/maven/src/org/netbeans/modules/maven/newproject/MavenWizardIterator.java index 84e8909343b5..118b92e2bceb 100644 --- a/java/maven/src/org/netbeans/modules/maven/newproject/MavenWizardIterator.java +++ b/java/maven/src/org/netbeans/modules/maven/newproject/MavenWizardIterator.java @@ -93,8 +93,8 @@ public void initialize(WizardDescriptor wiz) { } index = 0; ValidationGroup vg = ValidationGroup.create(new WizardDescriptorAdapter(wiz)); - panels = new ArrayList>(); - List steps = new ArrayList(); + panels = new ArrayList<>(); + List steps = new ArrayList<>(); if (archetype == null) { panels.add(new ChooseWizardPanel()); steps.add(LBL_CreateProjectStep()); @@ -104,7 +104,7 @@ public void initialize(WizardDescriptor wiz) { for (int i = 0; i < panels.size(); i++) { JComponent c = (JComponent) panels.get(i).getComponent(); c.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i); - c.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps.toArray(new String[0])); + c.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps.toArray(String[]::new)); } if (archetype != null) { wiz.putProperty(PROP_ARCHETYPE, archetype); diff --git a/javafx/javafx2.kit/src/org/netbeans/modules/javafx2/kit/JavaFXWizardIterator.java b/javafx/javafx2.kit/src/org/netbeans/modules/javafx2/kit/JavaFXWizardIterator.java index 3f9091d2f903..c22c39384517 100644 --- a/javafx/javafx2.kit/src/org/netbeans/modules/javafx2/kit/JavaFXWizardIterator.java +++ b/javafx/javafx2.kit/src/org/netbeans/modules/javafx2/kit/JavaFXWizardIterator.java @@ -53,6 +53,8 @@ public static WizardDescriptor.InstantiatingIterator openJFXSimple() { private static WizardDescriptor.InstantiatingIterator definedFXArchetype(String g, String a, String v, String name) { Map props = new HashMap<>(); props.put("add-debug-configuration", "Y"); + props.put("javafx-version", "21.0.9"); + props.put("javafx-maven-plugin-version", "0.0.8"); return ArchetypeWizards.definedArchetype(g, a, v, null, name, props); } diff --git a/javafx/javafx2.project/src/org/netbeans/modules/javafx2/project/Bundle.properties b/javafx/javafx2.project/src/org/netbeans/modules/javafx2/project/Bundle.properties index bb99c9f393fd..b0c4c8c24af3 100644 --- a/javafx/javafx2.project/src/org/netbeans/modules/javafx2/project/Bundle.properties +++ b/javafx/javafx2.project/src/org/netbeans/modules/javafx2/project/Bundle.properties @@ -291,7 +291,7 @@ TXT_PanelOptions_Preloader_Project_Name=JavaFXApplication1-Preloader LBL_PanelOptions_Manage_Button=&Manage Platforms... TXT_SetupFXPlatformProgress=Setting-up JavaFX enabled Java platform... -WARN_PanelOptionsVisual.notFXPlatform=Failed to automatically set-up a JavaFX Platform.
Please go to Platform Manager, create a non-default Java SE platform, then go to the JavaFX tab,
enable JavaFX and fill in the paths to valid JavaFX SDK and JavaFX Runtime.
Note: JavaFX SDK can be downloaded from JavaFX website. +WARN_PanelOptionsVisual.notFXPlatform=Select a JDK containing Javafx.
Use Manage Platforms... to register more JDKs. MSG_PreloaderInaccessible= MSG_ComboNoPreloaderClassAvailable= LBL_Platform_ComboBox=JavaFX Platform: diff --git a/platform/api.search/src/org/netbeans/modules/search/ContextView.java b/platform/api.search/src/org/netbeans/modules/search/ContextView.java index 86486ea5b4ff..a464f0c85d38 100644 --- a/platform/api.search/src/org/netbeans/modules/search/ContextView.java +++ b/platform/api.search/src/org/netbeans/modules/search/ContextView.java @@ -25,7 +25,6 @@ import java.awt.EventQueue; import java.awt.Rectangle; import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import static java.lang.Thread.NORM_PRIORITY; import java.util.Map; import java.util.WeakHashMap; @@ -53,6 +52,7 @@ import org.openide.explorer.ExplorerManager; import org.openide.filesystems.FileObject; import org.openide.nodes.Node; +import org.openide.text.CloneableEditorSupport; import org.openide.text.NbDocument; import org.openide.util.NbBundle; import org.openide.util.RequestProcessor; @@ -450,8 +450,8 @@ public void setText(final String text, * (in this case, MIME-type only) must be set _before_ the text * is set. */ - if ((editorMimeType == null) || !editorMimeType.equals(mimeType)) { - editorPane.setContentType(mimeType); + if (editorMimeType == null || !editorMimeType.equals(mimeType)) { + editorPane.setEditorKit(CloneableEditorSupport.getEditorKit(mimeType)); editorMimeType = mimeType; } editorPane.setText(text); @@ -488,12 +488,8 @@ public void run() { if (location != null) { final Document document = editorPane.getDocument(); - if (document instanceof StyledDocument) { - StyledDocument styledDocument - = (StyledDocument) document; - int cursorOffset = getCursorOffset( - (StyledDocument) document, - location.getLine() - 1); + if (document instanceof StyledDocument sd) { + int cursorOffset = getCursorOffset(sd, location.getLine() - 1); int startOff = cursorOffset + location.getColumn() - 1; int endOff = startOff + location.getMarkLength(); editorPane.setSelectionStart(startOff); diff --git a/platform/core.windows/src/org/netbeans/core/windows/persistence/PersistenceManager.java b/platform/core.windows/src/org/netbeans/core/windows/persistence/PersistenceManager.java index 4379ace3e929..042870c0e8f7 100644 --- a/platform/core.windows/src/org/netbeans/core/windows/persistence/PersistenceManager.java +++ b/platform/core.windows/src/org/netbeans/core/windows/persistence/PersistenceManager.java @@ -598,7 +598,7 @@ private TopComponent getTopComponentPersistentForID(String stringId, boolean des private final Set warnedIDs = Collections.synchronizedSet(new HashSet<>()); /** Avoid printing dozens of warnings about the same ID in one IDE session. */ private Level warningLevelForDeserTC(String id) { - return warnedIDs.add(id) ? Level.WARNING : Level.FINE; + return warnedIDs.add(id) ? Level.INFO : Level.FINE; } /** @return Searches for TopComponent with given string id and returns diff --git a/platform/core.windows/src/org/netbeans/core/windows/view/ui/DocumentsDlg.java b/platform/core.windows/src/org/netbeans/core/windows/view/ui/DocumentsDlg.java index ea3463801647..a86e04a678ff 100644 --- a/platform/core.windows/src/org/netbeans/core/windows/view/ui/DocumentsDlg.java +++ b/platform/core.windows/src/org/netbeans/core/windows/view/ui/DocumentsDlg.java @@ -25,11 +25,8 @@ import java.awt.Image; import java.awt.Window; import java.awt.event.ActionEvent; -import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; @@ -87,7 +84,7 @@ private DocumentsDlg () { initComponents(); // Internationalize. - Mnemonics.setLocalizedText(jButtonActivate, NbBundle.getMessage(DocumentsDlg.class, "LBL_Activate")); + Mnemonics.setLocalizedText(jButtonActivate, NbBundle.getMessage(DocumentsDlg.class, "LBL_Activate")); Mnemonics.setLocalizedText(jButtonClose, NbBundle.getMessage(DocumentsDlg.class, "LBL_CloseDocuments")); Mnemonics.setLocalizedText(jButtonSave, NbBundle.getMessage(DocumentsDlg.class, "LBL_SaveDocuments")); Mnemonics.setLocalizedText(explorerLabel, NbBundle.getMessage(DocumentsDlg.class, "LBL_Documents")); @@ -106,12 +103,8 @@ private DocumentsDlg () { closeButton.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(DocumentsDlg.class, "ACSD_Close")); descriptionArea.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(DocumentsDlg.class, "ACSD_DescriptionArea")); - ItemListener orderingListener = new ItemListener() { - - @Override - public void itemStateChanged( ItemEvent e ) { - updateNodes(); - } + ItemListener orderingListener = (e) -> { + updateNodes(); }; radioOrderByName.addItemListener( orderingListener ); radioOrderByUsage.addItemListener( orderingListener ); @@ -290,7 +283,7 @@ private void saveDocuments(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sa for (int i = 0; i < selNodes.length; i++) { TopComponent tc = ((TopComponentNode) selNodes[i]).getTopComponent(); Lookup l = tc.getLookup(); - SaveCookie sc = (SaveCookie) l.lookup(SaveCookie.class); + SaveCookie sc = l.lookup(SaveCookie.class); if (sc != null) { try { sc.save(); @@ -315,16 +308,16 @@ private void closeDocuments(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_c if (selNodes.length == 0) { return; } - //#70965 begin - select document previous to first closed document - int positionToSelectAfter = 0; + // avoid moving the selection if possible + int selectionStart = 0; Node[] children = explorer.getRootContext().getChildren().getNodes(); for (int i = 0; i < children.length; i++) { if (children[i] == selNodes[0]) { - positionToSelectAfter = Math.max(0, i - 1); + selectionStart = i; break; } } - //#70965 end + for (int i = 0; i < selNodes.length; i++) { TopComponent tc = ((TopComponentNode) selNodes[i]).getTopComponent(); if( Switches.isEditorTopComponentClosingEnabled() && Switches.isClosingEnabled( tc ) ) @@ -332,7 +325,7 @@ private void closeDocuments(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_c } List tcList = getOpenedDocuments(); - List tcNodes = new ArrayList (tcList.size()); + List tcNodes = new ArrayList<>(tcList.size()); for (TopComponent tc : tcList) { tcNodes.add(new TopComponentNode(tc)); } @@ -346,12 +339,15 @@ private void closeDocuments(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_c java.util.Collections.sort(tcNodes); } Children.Array nodeArray = new Children.Array(); - nodeArray.add((TopComponentNode[])tcNodes.toArray(new TopComponentNode[0])); + nodeArray.add(tcNodes.toArray(TopComponentNode[]::new)); Node root = new AbstractNode(nodeArray); explorer.setRootContext(root); //#54656 begin try { - explorer.setSelectedNodes(new Node[]{root.getChildren().getNodes()[positionToSelectAfter]}); + Node[] nodes = root.getChildren().getNodes(); + explorer.setSelectedNodes(new Node[] { + nodes[Math.min(selectionStart, nodes.length - 1)] + }); } catch (PropertyVetoException exc) { //mkleint - well, what can we do, I've never seen the selection being vetoed anyway. } @@ -372,16 +368,14 @@ private void activate(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_activat final TopComponent tc = ((TopComponentNode) selNodes[0]).getTopComponent(); //Call using invokeLater to make sure it is performed after dialog //is closed. - SwingUtilities.invokeLater(new Runnable () { - public void run() { - // #37226-41075 Unmaximized the other mode if needed. - WindowManagerImpl wm = WindowManagerImpl.getInstance(); - ModeImpl mode = (ModeImpl)wm.findMode(tc); - if(mode != null && mode != wm.getCurrentMaximizedMode()) { - wm.switchMaximizedMode(null); - } - tc.requestActive(); + SwingUtilities.invokeLater(() -> { + // #37226-41075 Unmaximized the other mode if needed. + WindowManagerImpl wm = WindowManagerImpl.getInstance(); + ModeImpl mode = (ModeImpl)wm.findMode(tc); + if(mode != null && mode != wm.getCurrentMaximizedMode()) { + wm.switchMaximizedMode(null); } + tc.requestActive(); }); }//GEN-LAST:event_activate @@ -430,8 +424,8 @@ public static void showDocumentsDialog() { dlgDesc.setHelpCtx( null ); //hide the default Help button final Dialog dlg = DialogDisplayer.getDefault().createDialog(dlgDesc); dlg.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(DocumentsDlg.class, "ACSD_DocumentsDialog")); - if( dlg instanceof JDialog ) { - HelpCtx.setHelpIDString(((JDialog)dlg).getRootPane(), documentsPanel.getHelpCtx().getHelpID()); + if (dlg instanceof JDialog jd) { + HelpCtx.setHelpIDString(jd.getRootPane(), documentsPanel.getHelpCtx().getHelpID()); } getDefault().updateNodes(); @@ -527,7 +521,7 @@ private void clearNodes() { private static List getOpenedDocuments() { WindowManagerImpl wm = WindowManagerImpl.getInstance(); TopComponent[] recentDocuments = wm.getRecentViewList(); - List documents = new ArrayList (recentDocuments.length); + List documents = new ArrayList<>(recentDocuments.length); TopComponentTracker tcTracker = TopComponentTracker.getDefault(); for( TopComponent tc : recentDocuments ) { if( tcTracker.isEditorTopComponent( tc ) ) { @@ -538,6 +532,7 @@ private static List getOpenedDocuments() { return documents; } + @Override public void propertyChange(PropertyChangeEvent evt) { if (ExplorerManager.PROP_SELECTED_NODES.equals(evt.getPropertyName())) { Node [] selNodes = (Node []) evt.getNewValue(); @@ -565,7 +560,7 @@ public void propertyChange(PropertyChangeEvent evt) { for (int i = 0; i < selNodes.length; i++) { TopComponent tc = ((TopComponentNode) selNodes[i]).getTopComponent(); Lookup l = tc.getLookup(); - SaveCookie sc = (SaveCookie) l.lookup(SaveCookie.class); + SaveCookie sc = l.lookup(SaveCookie.class); if (sc != null) { enableSave = true; break; @@ -574,7 +569,7 @@ public void propertyChange(PropertyChangeEvent evt) { jButtonSave.setEnabled(enableSave); // Set description. - if(selNodes != null && selNodes.length == 1) { + if(selNodes.length == 1) { descriptionArea.setText(((TopComponentNode)selNodes[0]).getDescription()); } else { descriptionArea.setText(null); @@ -599,6 +594,7 @@ public void propertyChange(PropertyChangeEvent evt) { // End of variables declaration//GEN-END:variables private ListView listView; + @Override public ExplorerManager getExplorerManager() { return explorer; } @@ -609,7 +605,7 @@ public ExplorerManager getExplorerManager() { private class TopComponentNode extends AbstractNode implements Comparable, Action, PropertyChangeListener { - private TopComponent tc; + private final TopComponent tc; public TopComponentNode (TopComponent tc) { super(Children.LEAF); @@ -617,6 +613,7 @@ public TopComponentNode (TopComponent tc) { tc.addPropertyChangeListener(WeakListeners.propertyChange(this, tc)); } + @Override public String getName() { // #60263: apparently used by functional tests. String result = tc.getName(); @@ -626,16 +623,19 @@ public String getName() { result = tc.toString(); return result; } + @Override public String getDisplayName() { // Also #60263. Forms do not have a tc.name?? String result = tc.getDisplayName(); return result != null ? result : tc.getName(); } + @Override public String getHtmlDisplayName() { return tc.getHtmlDisplayName(); } + @Override public Image getIcon (int type) { Image image = tc.getIcon(); return image == null ? ImageUtilities.loadImage("org/openide/resources/actions/empty.gif") : image; // NOI18N @@ -659,6 +659,7 @@ void refresh () { fireNameChange(null, null); } + @Override public int compareTo(TopComponentNode tcn) { String displayName1 = getDisplayName(); String displayName2 = tcn.getDisplayName(); @@ -672,30 +673,36 @@ public int compareTo(TopComponentNode tcn) { /** Invokes itself ac action when double click or Enter pressed on node */ + @Override public Action getPreferredAction() { return this; } /** Implementation of Action interface, activates TopComponent * currently selected in the list view (should be the same component - * that is asociated with this Node) + * that is associated with this Node) */ + @Override public void actionPerformed(ActionEvent evt) { activate(evt); } + @Override public boolean isEnabled() { return true; } + @Override public void putValue(String key, Object value) { // no operation } + @Override public void setEnabled(boolean b) { // no operation } + @Override public void propertyChange(PropertyChangeEvent evt) { fireDisplayNameChange(null, null); }