diff --git a/ide/o.n.swing.dirchooser/nbproject/project.properties b/ide/o.n.swing.dirchooser/nbproject/project.properties
index 462c25b282a2..009109c5e96d 100644
--- a/ide/o.n.swing.dirchooser/nbproject/project.properties
+++ b/ide/o.n.swing.dirchooser/nbproject/project.properties
@@ -14,5 +14,6 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-javac.source=1.8
+javac.source=11
+javac.target=11
javadoc.arch=${basedir}/arch.xml
diff --git a/ide/o.n.swing.dirchooser/nbproject/project.xml b/ide/o.n.swing.dirchooser/nbproject/project.xml
index 756566dfdc40..2001696592f9 100644
--- a/ide/o.n.swing.dirchooser/nbproject/project.xml
+++ b/ide/o.n.swing.dirchooser/nbproject/project.xml
@@ -34,6 +34,14 @@
1.13
+
+ org.netbeans.swing.plaf
+
+
+
+ 1.66
+
+
org.openide.awt
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DelegatingChooserUI.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DelegatingChooserUI.java
index ec3823c2e0bd..f3b6caae02d0 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DelegatingChooserUI.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DelegatingChooserUI.java
@@ -18,8 +18,6 @@
*/
package org.netbeans.swing.dirchooser;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -45,27 +43,16 @@ public class DelegatingChooserUI extends ComponentUI {
public static ComponentUI createUI(JComponent c) {
JFileChooser fc = (JFileChooser)c;
- // #109703 - don't use shell folder on JDK versions interval <1.6.0_02, 1.6.0_10>,
- // it's terribly slow on Windows due to JDK bug
if (Utilities.isWindows()) {
if (System.getProperty(NB_USE_SHELL_FOLDER) != null) {
fc.putClientProperty(USE_SHELL_FOLDER, Boolean.getBoolean(NB_USE_SHELL_FOLDER));
- } else {
- String jv = System.getProperty("java.version");
- jv = jv.split("-", 2)[0];
- if ("1.6.0_02".compareToIgnoreCase(jv) <= 0 &&
- "1.6.0_10".compareToIgnoreCase(jv) >= 0) {
- if (!Boolean.TRUE.equals(fc.getClientProperty(USE_SHELL_FOLDER))) {
- fc.putClientProperty(USE_SHELL_FOLDER, Boolean.FALSE);
- }
- }
}
}
// mark start time, just once during init (code can be run multiple times
// because of property listenign below)
if (fc.getClientProperty(START_TIME) == null) {
- fc.putClientProperty(START_TIME, Long.valueOf(System.currentTimeMillis()));
+ fc.putClientProperty(START_TIME, System.currentTimeMillis());
}
Class> chooser = getCurChooser(fc);
@@ -83,13 +70,8 @@ public static ComponentUI createUI(JComponent c) {
// filechooser.updateUI() which triggers this createUI again
if (firstTime) {
fc.addPropertyChangeListener(
- JFileChooser.FILE_SELECTION_MODE_CHANGED_PROPERTY,
- new PropertyChangeListener () {
- public @Override void propertyChange(PropertyChangeEvent evt) {
- JFileChooser fileChooser = (JFileChooser)evt.getSource();
- fileChooser.updateUI();
- }
- }
+ JFileChooser.FILE_SELECTION_MODE_CHANGED_PROPERTY,
+ evt -> ((JFileChooser)evt.getSource()).updateUI()
);
}
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryCellEditor.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryCellEditor.java
index 122d84daf20a..18c0da32ddec 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryCellEditor.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryCellEditor.java
@@ -53,10 +53,12 @@ public DirectoryCellEditor(JTree tree, JFileChooser fileChooser, final JTextFiel
this.fileChooser = fileChooser;
}
+ @Override
public boolean isCellEditable(EventObject event) {
- return ((event instanceof MouseEvent) ? false : true);
+ return !(event instanceof MouseEvent);
}
+ @Override
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
Component c = super.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row);
DirectoryNode node = (DirectoryNode)value;
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryChooserUI.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryChooserUI.java
index 6797706c5d2d..0808766c42f2 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryChooserUI.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryChooserUI.java
@@ -46,13 +46,28 @@
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.security.AccessControlException;
import java.text.MessageFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.Vector;
+import java.util.function.Function;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.swing.border.EmptyBorder;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
@@ -68,6 +83,7 @@
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreeSelectionModel;
+import org.netbeans.swing.plaf.LFCustoms;
import org.openide.awt.HtmlRenderer;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
@@ -237,15 +253,20 @@ public String getDialogTitle(JFileChooser fc) {
fc.getAccessibleContext().setAccessibleDescription(title);
return title;
}
-
+
+ private static boolean useNBShortcutsPanel() {
+ return UIManager.get(LFCustoms.FILECHOOSER_SHORTCUTS_FILESFUNCTION) != null
+ && UIManager.get(LFCustoms.FILECHOOSER_SHORTCUTS_PANEL_FACTORY) != null
+ && UIManager.getBoolean(LFCustoms.FILECHOOSER_FAVORITES_ENABLED);
+ }
+
private void updateUseShellFolder() {
// Decide whether to use the ShellFolder class to populate shortcut
// panel and combobox.
- Boolean prop =
- (Boolean)fileChooser.getClientProperty(DelegatingChooserUI.USE_SHELL_FOLDER);
+ Boolean prop = (Boolean)fileChooser.getClientProperty(DelegatingChooserUI.USE_SHELL_FOLDER);
if (prop != null) {
- useShellFolder = prop.booleanValue();
+ useShellFolder = prop;
} else {
// See if FileSystemView.getRoots() returns the desktop folder,
// i.e. the normal Windows hierarchy.
@@ -258,8 +279,7 @@ private void updateUseShellFolder() {
}
}
}
-
- if (Utilities.isWindows()) {
+ if (useNBShortcutsPanel() || Utilities.isWindows()) {
if (useShellFolder) {
if (placesBar == null) {
placesBar = getPlacesBar();
@@ -282,9 +302,17 @@ private void updateUseShellFolder() {
}
}
- /** Returns instance of WindowsPlacesBar class or null in case of failure
+ /**
+ * Returns a shortcuts panel, e.g the windows places bar or the NB favorites shortcuts panel
*/
- private JComponent getPlacesBar () {
+ private JComponent getPlacesBar() {
+ if (useNBShortcutsPanel()) {
+ Function fac = (Function) UIManager.get(LFCustoms.FILECHOOSER_SHORTCUTS_PANEL_FACTORY);
+ JComponent favBar = fac.apply(fileChooser);
+ JScrollPane sp = new JScrollPane(favBar, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ sp.setPreferredSize(new Dimension(100, 300));
+ return sp;
+ }
if (placesBarFailed) {
return null;
}
@@ -410,7 +438,7 @@ public void focusGained(FocusEvent e) {
// disable TAB focus transfer, we need it for completion
Set tKeys = filenameTextField.getFocusTraversalKeys(java.awt.KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
- Set newTKeys = new HashSet(tKeys);
+ Set newTKeys = new HashSet<>(tKeys);
newTKeys.remove(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_TAB, 0));
// #107305: enable at least Ctrl+TAB if we have TAB for completion
newTKeys.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK));
@@ -604,7 +632,7 @@ private JComponent createTopToolbar() {
}
// on Mac all icons from UIManager are the same, some default, so load our own.
// it's also fallback if icon from UIManager not found, may happen
- if (isMac || upOneLevelIcon == null || jdkBug6840086Workaround() ) {
+ if (isMac || upOneLevelIcon == null) {
if (isMac) {
upOneLevelIcon = ImageUtilities.loadImageIcon("org/netbeans/swing/dirchooser/resources/upFolderIcon_mac.png", false);
} else {
@@ -664,7 +692,7 @@ private JComponent createTopToolbar() {
}
// on Mac all icons from UIManager are the same, some default, so load our own.
// it's also fallback if icon from UIManager not found, may happen
- if (isMac || newFoldIcon == null || jdkBug6840086Workaround()) {
+ if (isMac || newFoldIcon == null) {
if (isMac) {
newFoldIcon = ImageUtilities.loadImageIcon("org/netbeans/swing/dirchooser/resources/newFolderIcon_mac.png", false);
} else {
@@ -770,13 +798,6 @@ public void paint(Graphics g) {
return scrollBar;
}
- private boolean jdkBug6840086Workaround() {
- //see issue #167080
- return Utilities.isWindows()
- && "Windows 7".equals(System.getProperty("os.name"))
- && "1.6.0_16".compareTo(System.getProperty("java.version")) >=0;
- }
-
/**
* Handles alt-up key
*/
@@ -789,7 +810,7 @@ public AltUpHandler(JComponent component) {
@Override
public void keyPressed(KeyEvent evt) {
- if(evt.getKeyCode() == KeyEvent.VK_UP && (evt.getModifiers() & KeyEvent.ALT_MASK) == KeyEvent.ALT_MASK) {
+ if(evt.getKeyCode() == KeyEvent.VK_UP && evt.isAltDown()) {
Action action = getChangeToParentDirectoryAction();
action.actionPerformed(new ActionEvent(evt.getSource(), 0, ""));
component.requestFocus();
@@ -804,12 +825,9 @@ class TreeKeyHandler extends KeyAdapter implements FocusListener {
StringBuffer searchBuf = new StringBuffer();
- java.util.List paths;
- private final Timer resetBufferTimer = new Timer(2000, new ActionListener() {
- @Override
- public void actionPerformed (ActionEvent e) {
- resetBuffer();
- }
+ List paths;
+ private final Timer resetBufferTimer = new Timer(2000, (ActionEvent e) -> {
+ resetBuffer();
});
@Override
@@ -895,7 +913,7 @@ private boolean isCharForSearch (KeyEvent evt) {
return false;
}
// #110975: refuse modifiers
- if (evt.getModifiers() != 0) {
+ if (evt.getModifiersEx() != 0) {
return false;
}
return (Character.isJavaIdentifierPart(ch) && !Character.isIdentifierIgnorable(ch))
@@ -909,10 +927,9 @@ private void resetBuffer () {
}
- private java.util.List getVisiblePaths () {
+ private List getVisiblePaths () {
int rowCount = tree.getRowCount();
- DirectoryNode node = null;
- java.util.List result = new ArrayList(rowCount);
+ List result = new ArrayList<>(rowCount);
for (int i = 0; i < rowCount; i++) {
result.add(tree.getPathForRow(i));
}
@@ -925,20 +942,14 @@ private void createPopup() {
item1.addActionListener(newFolderAction);
JMenuItem item2 = new JMenuItem(getBundle().getString("LBL_Rename"));
- item2.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- DirectoryNode node = (DirectoryNode)tree.getLastSelectedPathComponent();
- applyEdit(node);
- }
+ item2.addActionListener((ActionEvent e) -> {
+ DirectoryNode node = (DirectoryNode)tree.getLastSelectedPathComponent();
+ applyEdit(node);
});
JMenuItem item3 = new JMenuItem(getBundle().getString("LBL_Delete"));
- item3.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- deleteAction();
- }
+ item3.addActionListener((ActionEvent e) -> {
+ deleteAction();
});
popupMenu.add(item1);
@@ -974,9 +985,9 @@ private void deleteAction() {
RequestProcessor.getDefault().post(new Runnable() {
DirectoryNode node;
- ArrayList list = new ArrayList();
+ ArrayList list = new ArrayList<>();
int cannotDelete;
- ArrayList nodes2Remove = new ArrayList(nodePath.length);
+ ArrayList nodes2Remove = new ArrayList<>(nodePath.length);
@Override
public void run() {
@@ -1015,7 +1026,7 @@ public void run() {
message = cannotDelete + " " + getBundle().getString("MSG_Plur_Delete");
}
- setSelected((File[])list.toArray(new File[0]));
+ setSelected((File[])list.toArray(File[]::new));
JOptionPane.showConfirmDialog(fileChooser, message , getBundle().getString("MSG_Confirm"), JOptionPane.OK_OPTION);
} else {
@@ -1057,7 +1068,7 @@ private void updateCompletions() {
synchronized (listFilesWorker) {
if (!dir.equals(lastDir)) {
if (completionPopup != null) {
- completionPopup.setDataList(new Vector(0));
+ completionPopup.setDataList(new Vector<>(0));
completionPopup.detach();
completionPopup = null;
}
@@ -1095,42 +1106,35 @@ public void run() {
synchronized (this) {
dir = d;
}
- List files = new LinkedList();
- File[] children = dir.listFiles();
- if (children != null) {
- for (File f : children) {
- if(fileChooser.accept(f)) {
- if(fileChooser.getFileSelectionMode() == JFileChooser.DIRECTORIES_ONLY) {
- if(f.isDirectory()) {
- files.add(f);
- }
- } else if(fileChooser.getFileSelectionMode() == JFileChooser.FILES_ONLY) {
- if(f.isFile()) {
- files.add(f);
- }
- } else if(fileChooser.getFileSelectionMode() == JFileChooser.FILES_AND_DIRECTORIES) {
- files.add(f);
- }
- }
+ List files = Collections.emptyList();
+ if (dir.exists()) {
+ try (Stream stream = Files.list(dir.toPath())) {
+ int mode = fileChooser.getFileSelectionMode();
+ files = stream.filter(p -> Files.isReadable(p))
+ .filter(p -> !p.getFileName().toString().startsWith("."))
+ .filter(p -> mode == JFileChooser.FILES_AND_DIRECTORIES
+ || mode == JFileChooser.FILES_ONLY && !Files.isDirectory(p)
+ || mode == JFileChooser.DIRECTORIES_ONLY && Files.isDirectory(p))
+ .filter(p -> fileChooser.accept(p.toFile()))
+ .sorted()
+ .map(Path::toFile)
+ .collect(Collectors.toList());
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
}
}
synchronized (this) {
lastDir = dir;
- lastChildren = files.toArray(new File[0]);
+ lastChildren = files.toArray(File[]::new);
}
if (lastChildren.length > 0) {
- EventQueue.invokeLater(new Runnable() {
- @Override
- public void run() {
- updateCompletions();
- }
- });
+ EventQueue.invokeLater(() -> updateCompletions());
}
}
}
public Vector buildList(String text, File[] children, int max) {
- Vector files = new Vector(children.length);
+ Vector files = new Vector<>(children.length);
Arrays.sort(children, DirectoryNode.FILE_NAME_COMPARATOR);
for (File completion : children) {
@@ -1204,7 +1208,7 @@ private void initUpdateWorker () {
}
private void markStartTime () {
- fileChooser.putClientProperty(DelegatingChooserUI.START_TIME, Long.valueOf(System.currentTimeMillis()));
+ fileChooser.putClientProperty(DelegatingChooserUI.START_TIME, System.currentTimeMillis());
}
private void checkUpdate() {
@@ -1216,7 +1220,7 @@ private void checkUpdate() {
// clean for future marking
fileChooser.putClientProperty(DelegatingChooserUI.START_TIME, null);
- long elapsed = System.currentTimeMillis() - startTime.longValue();
+ long elapsed = System.currentTimeMillis() - startTime;
long timeOut = NbPreferences.forModule(DirectoryChooserUI.class).
getLong(TIMEOUT_KEY, 10000);
if (timeOut > 0 && elapsed > timeOut && slownessPanel == null) {
@@ -1226,13 +1230,10 @@ private void checkUpdate() {
slownessPanel = new JPanel();
JButton notShow = new JButton(
NbBundle.getMessage(DirectoryChooserUI.class, "BTN_NotShow"));
- notShow.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- NbPreferences.forModule(DirectoryChooserUI.class).putLong(TIMEOUT_KEY, 0);
- centerPanel.remove(slownessPanel);
- centerPanel.revalidate();
- }
+ notShow.addActionListener((ActionEvent e) -> {
+ NbPreferences.forModule(DirectoryChooserUI.class).putLong(TIMEOUT_KEY, 0);
+ centerPanel.remove(slownessPanel);
+ centerPanel.revalidate();
});
JPanel notShowP = new JPanel();
notShowP.add(notShow);
@@ -1251,7 +1252,7 @@ private Boolean isXPStyle() {
Boolean themeActive = (Boolean)toolkit.getDesktopProperty("win.xpstyle.themeActive");
if(themeActive == null)
themeActive = Boolean.FALSE;
- if (themeActive.booleanValue() && System.getProperty("swing.noxp") == null) {
+ if (themeActive && System.getProperty("swing.noxp") == null) {
themeActive = Boolean.TRUE;
}
return themeActive;
@@ -1682,33 +1683,22 @@ private DirectoryHandler createDirectoryHandler(JFileChooser chooser) {
}
private void addNewDirectory(final TreePath path) {
- RequestProcessor.getDefault().post(new Runnable() {
- @Override
- public void run() {
- EventQueue.invokeLater(new Runnable() {
- @Override
- public void run() {
- DirectoryNode selectedNode = (DirectoryNode)path.getLastPathComponent();
-
- if(selectedNode == null || !canWrite(selectedNode.getFile())) {
- return;
- }
-
- try {
- newFolderNode = new DirectoryNode(fileChooser.getFileSystemView().createNewFolder(selectedNode.getFile()));
- model.insertNodeInto(newFolderNode, selectedNode, selectedNode.getChildCount());
- EventQueue.invokeLater(new Runnable() {
- @Override
- public void run () {
- applyEdit(newFolderNode);
- }
- });
- } catch (IOException ex) {
- Exceptions.printStackTrace(ex);
- }
- }
- });
- }
+ RequestProcessor.getDefault().post(() -> {
+ EventQueue.invokeLater(() -> {
+ DirectoryNode selectedNode = (DirectoryNode)path.getLastPathComponent();
+ if(selectedNode == null || !canWrite(selectedNode.getFile())) {
+ return;
+ }
+ try {
+ newFolderNode = new DirectoryNode(fileChooser.getFileSystemView().createNewFolder(selectedNode.getFile()));
+ model.insertNodeInto(newFolderNode, selectedNode, selectedNode.getChildCount());
+ EventQueue.invokeLater(() -> {
+ applyEdit(newFolderNode);
+ });
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ });
});
}
@@ -1778,11 +1768,8 @@ public void run() {
private void setCursor (final JComponent comp, final int type) {
if (!EventQueue.isDispatchThread()) {
- EventQueue.invokeLater(new Runnable () {
- @Override
- public void run () {
- setCursor(comp, type);
- }
+ EventQueue.invokeLater(() -> {
+ setCursor(comp, type);
});
} else {
Window window = SwingUtilities.getWindowAncestor(comp);
@@ -1882,7 +1869,7 @@ public String getName() {
* Data model for a type-face selection combo-box.
*/
private class DirectoryComboBoxModel extends AbstractListModel implements ComboBoxModel {
- Vector directories = new Vector();
+ Vector directories = new Vector<>();
int[] depths = null;
File selectedDirectory = null;
JFileChooser chooser = getFileChooser();
@@ -1920,7 +1907,7 @@ private void addItem(File directory) {
// Get the canonical (full) path. This has the side
// benefit of removing extraneous chars from the path,
// for example /foo/bar/ becomes /foo/bar
- File canonical = null;
+ File canonical;
try {
canonical = directory.getCanonicalFile();
} catch (IOException e) {
@@ -1931,7 +1918,7 @@ private void addItem(File directory) {
// create File instances of each directory leading up to the top
File sf = useShellFolder? getShellFolderForFile(canonical) : canonical;
File f = sf;
- Vector path = new Vector(10);
+ Vector path = new Vector<>(10);
/*
@@ -2178,9 +2165,8 @@ public void keyPressed(KeyEvent evt) {
}
}
- if ((keyCode == KeyEvent.VK_TAB || keyCode == KeyEvent.VK_DOWN) ||
- (keyCode == KeyEvent.VK_RIGHT &&
- (filenameTextField.getCaretPosition() >= (filenameTextField.getDocument().getLength() - 1)))) {
+ if ((keyCode == KeyEvent.VK_TAB || keyCode == KeyEvent.VK_DOWN || (evt.isControlDown() && keyCode == KeyEvent.VK_SPACE))
+ || (keyCode == KeyEvent.VK_RIGHT && (filenameTextField.getCaretPosition() >= (filenameTextField.getDocument().getLength() - 1)))) {
updateCompletions();
}
@@ -2220,7 +2206,7 @@ public void valueChanged(TreeSelectionEvent e) {
JTree tree = (JTree) e.getSource();
TreePath path = tree.getSelectionPath();
TreePath curSel = e.getNewLeadSelectionPath();
- curSelPath = (curSel != null) ? new WeakReference(curSel) : null;
+ curSelPath = (curSel != null) ? new WeakReference<>(curSel) : null;
if(path != null) {
@@ -2240,7 +2226,7 @@ public void valueChanged(TreeSelectionEvent e) {
}
private File[] getSelectedNodes(TreePath[] paths) {
- List files = new LinkedList();
+ List files = new LinkedList<>();
for(int i = 0; i < paths.length; i++) {
File file = ((DirectoryNode)paths[i].getLastPathComponent()).getFile();
if(file.isDirectory()
@@ -2250,7 +2236,7 @@ private File[] getSelectedNodes(TreePath[] paths) {
}
files.add(file);
}
- return files.toArray(new File[0]);
+ return files.toArray(File[]::new);
}
/********* impl of MouseListener ***********/
@@ -2258,7 +2244,6 @@ private File[] getSelectedNodes(TreePath[] paths) {
@Override
public void mouseClicked(MouseEvent e) {
final JTree tree = (JTree) e.getSource();
- Point p = e.getPoint();
final int x = e.getX();
final int y = e.getY();
int row = tree.getRowForLocation(x, y);
@@ -2510,7 +2495,7 @@ private void refreshNode( final TreePath path, final DirectoryNode node ){
public void run() {
if (!EventQueue.isDispatchThread()) {
// first phase
- realDirs = new HashSet();
+ realDirs = new HashSet<>();
File[] files = folder.listFiles();
files = files == null ? new File[0] : files;
for (File file : files) {
@@ -2525,7 +2510,7 @@ public void run() {
// second phase, in EQ thread, invoked from first phase
int count = node.getChildCount();
Map currentFiles =
- new HashMap( );
+ new HashMap<>( );
for( int i=0; i< count ; i++ ){
TreeNode child = node.getChildAt(i);
if ( child instanceof DirectoryNode ){
@@ -2534,7 +2519,7 @@ public void run() {
}
}
- Set realCloned = new HashSet( realDirs );
+ Set realCloned = new HashSet<>( realDirs );
if ( realCloned.removeAll( currentFiles.keySet()) ){
// Handle added folders
for ( String name : realCloned ){
@@ -2542,7 +2527,7 @@ public void run() {
model.insertNodeInto( added, node, node.getChildCount());
}
}
- Set currentNames = new HashSet( currentFiles.keySet());
+ Set currentNames = new HashSet<>( currentFiles.keySet());
if ( currentNames.removeAll( realDirs )){
// Handle deleted folders
for ( String name : currentNames ){
@@ -2593,12 +2578,9 @@ private class ActionEnabler implements Runnable {
public void run () {
final File f = file;
if (canWrite(f)) {
- EventQueue.invokeLater(new Runnable() {
- @Override
- public void run () {
- if (f == file) {
- setEnabled(true);
- }
+ EventQueue.invokeLater(() -> {
+ if (f == file) {
+ setEnabled(true);
}
});
}
@@ -2720,15 +2702,12 @@ public void run() {
node.loadChildren(fileChooser, true);
// update UI in EQ thread
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- ui.model = new DirectoryTreeModel(node);
- tree.setModel(ui.model);
- tree.repaint();
- ui.checkUpdate();
- restoreCursor();
- }
+ SwingUtilities.invokeLater(() -> {
+ ui.model = new DirectoryTreeModel(node);
+ tree.setModel(ui.model);
+ tree.repaint();
+ ui.checkUpdate();
+ restoreCursor();
});
}
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryNode.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryNode.java
index ee7ca7ead0b0..174a4e598d0e 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryNode.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/DirectoryNode.java
@@ -24,6 +24,7 @@
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Icon;
@@ -110,15 +111,13 @@ public boolean loadChildren(JFileChooser chooser, boolean descend) {
//fixed bug #97124
if (loaded == false) {
- ArrayList files = getFiles(chooser);
+ List files = getFiles(chooser);
if(files.isEmpty()) {
return false;
}
- for(int i = 0; i < files.size(); i++) {
- File child = (File) files.get(i);
-
+ for (File child : files) {
if(chooser.accept(child)) {
try {
DirectoryNode node = new DirectoryNode(child);
@@ -132,7 +131,7 @@ public boolean loadChildren(JFileChooser chooser, boolean descend) {
}
}
- if (descend == true || (getChildCount() > 0)) {
+ if (descend == true || getChildCount() > 0) {
loaded = true;
}
}
@@ -140,9 +139,9 @@ public boolean loadChildren(JFileChooser chooser, boolean descend) {
return loaded;
}
- private ArrayList getFiles(JFileChooser chooser) {
+ private List getFiles(JFileChooser chooser) {
//fixed bug #97124
- ArrayList list = new ArrayList();
+ List list = new ArrayList<>();
// Fix for IZ#116859 [60cat] Node update bug in the "open project" panel while deleting directories
if ( directory == null || !directory.exists() ){
@@ -151,7 +150,7 @@ private ArrayList getFiles(JFileChooser chooser) {
File[] files = chooser.getFileSystemView().getFiles(directory, chooser.isFileHidingEnabled());
int mode = chooser.getFileSelectionMode();
- if(mode == JFileChooser.DIRECTORIES_ONLY) {
+ if (mode == JFileChooser.DIRECTORIES_ONLY) {
for(int i = 0; i < files.length; i++) {
File child = files[i];
if (child.isDirectory()) {
@@ -159,9 +158,9 @@ private ArrayList getFiles(JFileChooser chooser) {
}
}
list.sort(FILE_NAME_COMPARATOR);
- } else if(mode == JFileChooser.FILES_AND_DIRECTORIES || mode == JFileChooser.FILES_ONLY) {
- ArrayList dirList = new ArrayList();
- ArrayList fileList = new ArrayList();
+ } else if (mode == JFileChooser.FILES_AND_DIRECTORIES || mode == JFileChooser.FILES_ONLY) {
+ List dirList = new ArrayList<>();
+ List fileList = new ArrayList<>();
for(int i = 0; i < files.length; i++) {
File child = files[i];
if (child.isDirectory()) {
@@ -205,7 +204,7 @@ public static boolean isNetBeansProject (File directory) {
private static FileObject convertToValidDir(File f) {
FileObject fo;
File testFile = new File(f.getPath());
- if (testFile == null || testFile.getParent() == null) {
+ if (testFile.getParent() == null) {
// BTW this means that roots of file systems can't be project
// directories.
return null;
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/FileCompletionPopup.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/FileCompletionPopup.java
index 8a0872a92ac9..2b45dadb7139 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/FileCompletionPopup.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/FileCompletionPopup.java
@@ -55,12 +55,12 @@
*/
public class FileCompletionPopup extends JPopupMenu implements KeyListener {
- private JList list;
- private JTextField textField;
- private JFileChooser chooser;
+ private final JList list;
+ private final JTextField textField;
+ private final JFileChooser chooser;
public FileCompletionPopup(JFileChooser chooser, JTextField textField, Vector files) {
- this.list = new JList(files);
+ this.list = new JList<>(files);
this.textField = textField;
this.chooser = chooser;
list.setVisibleRowCount(4);
@@ -80,7 +80,7 @@ public FileCompletionPopup(JFileChooser chooser, JTextField textField, Vector files) {
list.setListData(files);
ensureSelection();
}
@@ -111,8 +111,8 @@ public void showPopup(JTextComponent source, int x, int y) {
if(list.getModel().getSize() == 0) {
return;
}
- setPreferredSize(new Dimension(source.getWidth(), source.getHeight() * 4));
- show(source, x, y);
+ setPreferredSize(new Dimension(source.getWidth(), source.getHeight() * 6));
+ show(source, x, y);
ensureSelection();
}
@@ -134,6 +134,7 @@ public void focusLost(FocusEvent e) {
}
private class MouseHandler extends MouseAdapter implements MouseMotionListener{
+ @Override
public void mouseMoved(MouseEvent e) {
if (e.getSource() == list) {
Point location = e.getPoint();
@@ -146,6 +147,7 @@ public void mouseMoved(MouseEvent e) {
}
}
+ @Override
public void mouseDragged(MouseEvent e) {
if (e.getSource() == list) {
return;
@@ -168,7 +170,7 @@ public void mouseClicked(MouseEvent e) {
int index = list.locationToIndex(p);
list.setSelectedIndex(index);
setVisible(false);
- File file = (File)list.getSelectedValue();
+ File file = list.getSelectedValue();
if (file == null) {
return;
}
@@ -186,7 +188,7 @@ private MouseEvent convertMouseEvent( MouseEvent e ) {
MouseEvent newEvent = new MouseEvent( (Component)e.getSource(),
e.getID(),
e.getWhen(),
- e.getModifiers(),
+ e.getModifiersEx(),
convertedPoint.x,
convertedPoint.y,
e.getClickCount(),
@@ -197,6 +199,7 @@ private MouseEvent convertMouseEvent( MouseEvent e ) {
/****** implementation of KeyListener of fileNameTextField ******/
+ @Override
public void keyPressed(KeyEvent e) {
if (!isVisible()) {
return;
@@ -220,7 +223,7 @@ public void keyPressed(KeyEvent e) {
}
if (isCompletionKey(code, textField) && !e.isConsumed()) {
- File file = (File)list.getSelectedValue();
+ File file = list.getSelectedValue();
if(file != null) {
if(file.equals(chooser.getCurrentDirectory())) {
chooser.firePropertyChange(JFileChooser.DIRECTORY_CHANGED_PROPERTY, false, true);
@@ -244,10 +247,12 @@ public void keyPressed(KeyEvent e) {
}
}
+ @Override
public void keyReleased(KeyEvent e) {
// no operation
}
+ @Override
public void keyTyped(KeyEvent e) {
// no operation
}
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/InputBlocker.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/InputBlocker.java
index 8cd3e41c6bcf..5258ebc4e4b3 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/InputBlocker.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/InputBlocker.java
@@ -76,25 +76,15 @@ public void unBlock(JRootPane rootPane) {
glassPane.setVisible(false);
}
+ @Override
public void mouseClicked(MouseEvent e) {
Toolkit.getDefaultToolkit().beep();
}
- public void mousePressed(MouseEvent e) {
- }
-
- public void mouseReleased(MouseEvent e) {
- }
-
- public void mouseEntered(MouseEvent e) {
- }
-
- public void mouseExited(MouseEvent e) {
- }
-
- public void mouseDragged(MouseEvent e) {
- }
-
- public void mouseMoved(MouseEvent e) {
- }
+ @Override public void mousePressed(MouseEvent e) {}
+ @Override public void mouseReleased(MouseEvent e) {}
+ @Override public void mouseEntered(MouseEvent e) {}
+ @Override public void mouseExited(MouseEvent e) {}
+ @Override public void mouseDragged(MouseEvent e) {}
+ @Override public void mouseMoved(MouseEvent e) {}
}
diff --git a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/Module.java b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/Module.java
index 43bd23607f56..d3cc5476a8a8 100644
--- a/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/Module.java
+++ b/ide/o.n.swing.dirchooser/src/org/netbeans/swing/dirchooser/Module.java
@@ -23,7 +23,6 @@
package org.netbeans.swing.dirchooser;
import java.awt.EventQueue;
-import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
@@ -57,11 +56,7 @@ public void beforeLoad (WindowSystemEvent event) {
@Override
public void afterLoad (WindowSystemEvent event) {
WindowManager.getDefault().removeWindowSystemListener(this);
- EventQueue.invokeLater(new Runnable() {
- public @Override void run() {
- install();
- }
- });
+ EventQueue.invokeLater(Module::install);
}
@Override
public void beforeSave (WindowSystemEvent event) {
@@ -73,11 +68,7 @@ public void afterSave (WindowSystemEvent event) {
}
@Override public void uninstalled() {
- EventQueue.invokeLater(new Runnable() {
- public @Override void run() {
- uninstall();
- }
- });
+ EventQueue.invokeLater(Module::uninstall);
}
private static void install() {
@@ -96,15 +87,12 @@ private static void install() {
uid.put(val, impl);
}
// #61147: prevent NB from switching to a different UI later (under GTK):
- uid.addPropertyChangeListener(pcl = new PropertyChangeListener() {
- public @Override void propertyChange(PropertyChangeEvent evt) {
- String name = evt.getPropertyName();
- Object className = uid.get(KEY);
- if ((name.equals(KEY) || name.equals("UIDefaults")) && !val.equals(className)
- && !isQuickFileChooser(className)) {
- originalImpl = (Class>) uid.getUIClass(KEY);
- uid.put(KEY, val);
- }
+ uid.addPropertyChangeListener(pcl = (evt) -> {
+ String name = evt.getPropertyName();
+ Object className = uid.get(KEY);
+ if ((name.equals(KEY) || name.equals("UIDefaults")) && !val.equals(className) && !isQuickFileChooser(className)) {
+ originalImpl = (Class>) uid.getUIClass(KEY);
+ uid.put(KEY, val);
}
});
}
diff --git a/platform/favorites/nbproject/project.properties b/platform/favorites/nbproject/project.properties
index 5f147a0ab655..7762f7f73b31 100644
--- a/platform/favorites/nbproject/project.properties
+++ b/platform/favorites/nbproject/project.properties
@@ -16,9 +16,3 @@
# under the License.
javac.compilerargs=-Xlint:all -Xlint:-serial -Xlint:-options -Werror
javac.source=1.8
-test.config.stable.includes=\
- gui/core/favorites/BasicsTest.class
-
-test.config.stableBTD.includes=**/*Test.class
-test.config.stableBTD.excludes=\
- gui/**/*
diff --git a/platform/favorites/nbproject/project.xml b/platform/favorites/nbproject/project.xml
index 1cbd92ce062f..34de89ea35e7 100644
--- a/platform/favorites/nbproject/project.xml
+++ b/platform/favorites/nbproject/project.xml
@@ -34,6 +34,14 @@
1.6
+
+ org.netbeans.swing.plaf
+
+
+
+ 1.66
+
+
org.openide.actions
diff --git a/platform/favorites/src/org/netbeans/modules/favorites/Module.java b/platform/favorites/src/org/netbeans/modules/favorites/Module.java
new file mode 100644
index 000000000000..67a29608cc1a
--- /dev/null
+++ b/platform/favorites/src/org/netbeans/modules/favorites/Module.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.favorites;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Function;
+import javax.swing.UIManager;
+import org.netbeans.modules.favorites.api.Favorites;
+import org.netbeans.swing.plaf.LFCustoms;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.windows.OnShowing;
+
+/**
+ * For lifecycle tasks.
+ * @author mbien
+ */
+public final class Module {
+
+ private Module() {}
+
+ @OnShowing
+ public final static class EDTInit implements Runnable {
+ @Override
+ public void run() {
+ Function favAppender = (files) -> {
+ if (!UIManager.getBoolean(LFCustoms.FILECHOOSER_FAVORITES_ENABLED)) {
+ return files;
+ }
+ List shortcuts = new ArrayList<>(Arrays.asList(files));
+ for (FileObject favorite : Favorites.getDefault().getFavoriteRoots()) {
+ File file = FileUtil.toFile(favorite);
+ if (file.isDirectory()) {
+ shortcuts.add(file);
+ }
+ }
+ return shortcuts.toArray(new File[0]);
+ };
+ UIManager.put(LFCustoms.FILECHOOSER_SHORTCUTS_FILESFUNCTION, favAppender);
+ }
+ }
+
+}
diff --git a/platform/libs.flatlaf/nbproject/project.properties b/platform/libs.flatlaf/nbproject/project.properties
index 7252d84ac00f..51b6d34bd92a 100644
--- a/platform/libs.flatlaf/nbproject/project.properties
+++ b/platform/libs.flatlaf/nbproject/project.properties
@@ -32,6 +32,9 @@ spec.version.base.fatal.warning=false
# So when FlatLaf is updated, the OpenIDE-Module-Implementation-Version entry
# in manifest.mf needs to be updated to match the new FlatLaf version.
release.external/flatlaf-3.3.jar=modules/ext/flatlaf-3.3.jar
+# com.formdev.flatlaf.ui intentionally ommitted.
+# rest is equivalent to the "public" packages for friend dependencies as declared in project.xml
+sigtest.public.packages=com.formdev.flatlaf,com.formdev.flatlaf.themes,com.formdev.flatlaf.util
release.external/flatlaf-3.3.jar!/com/formdev/flatlaf/natives/flatlaf-windows-x86.dll=modules/lib/flatlaf-windows-x86.dll
release.external/flatlaf-3.3.jar!/com/formdev/flatlaf/natives/flatlaf-windows-x86_64.dll=modules/lib/flatlaf-windows-x86_64.dll
diff --git a/platform/libs.flatlaf/nbproject/project.xml b/platform/libs.flatlaf/nbproject/project.xml
index 2faee8ae847a..fa42c32f5d83 100644
--- a/platform/libs.flatlaf/nbproject/project.xml
+++ b/platform/libs.flatlaf/nbproject/project.xml
@@ -45,6 +45,7 @@
com.formdev.flatlaf
com.formdev.flatlaf.themes
+ com.formdev.flatlaf.ui
com.formdev.flatlaf.util
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties
index d12d75e322eb..fbdc275f6366 100644
--- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/Bundle.properties
@@ -34,6 +34,7 @@ FlatLafOptionsPanel.unifiedTitleBarCheckBox.text=&Unified window title bar
FlatLafOptionsPanel.menuBarEmbeddedCheckBox.text=&Embedded menu bar
FlatLafOptionsPanel.underlineMenuSelectionCheckBox.text=Use underline menu &selection
FlatLafOptionsPanel.alwaysShowMnemonicsCheckBox.text=Always show &mnemonics
+FlatLafOptionsPanel.showFileChooserFavoritesCheckBox.text=Show favorites in file chooser (experimental)
LookAndFeel.Config.displayName=Look and Feel
FlatLafOptionsPanel.Advanced.title=Advanced
diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java
index 9411ce9a8956..4aab548f173b 100644
--- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java
+++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLFCustoms.java
@@ -19,6 +19,7 @@
package org.netbeans.swing.laf.flatlaf;
+import com.formdev.flatlaf.ui.FlatFileChooserUI;
import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale;
import java.awt.Color;
@@ -27,10 +28,11 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.concurrent.Callable;
+import java.util.function.Function;
import javax.swing.BorderFactory;
import javax.swing.InputMap;
-import javax.swing.JFrame;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
import javax.swing.KeyStroke;
import javax.swing.UIDefaults;
import javax.swing.UIDefaults.LazyValue;
@@ -131,6 +133,12 @@ EDITOR_TOOLBAR_BORDER, new CompoundBorder(DPISafeBorder.matte(0, 0, 1, 0, editor
"Table.ancestorInputMap", new LazyModifyInputMap( "Table.ancestorInputMap", removeCtrlPageUpDownKeyBindings ), // NOI18N
"Table.ancestorInputMap.RightToLeft", new LazyModifyInputMap( "Table.ancestorInputMap.RightToLeft", removeCtrlPageUpDownKeyBindings ), // NOI18N
"Tree.focusInputMap", new LazyModifyInputMap( "Tree.focusInputMap", removeCtrlPageUpDownKeyBindings ), // NOI18N
+ FILECHOOSER_FAVORITES_ENABLED, FlatLafPrefs.isShowFileChooserFavorites(),
+ FILECHOOSER_SHORTCUTS_PANEL_FACTORY, new Function () {
+ @Override public JComponent apply(JFileChooser t) {
+ return new FlatFileChooserUI.FlatShortcutsPanel(t);
+ }
+ }
};
List