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 result = new ArrayList<>(); result.addAll(Arrays.asList(constants)); diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form index a4193546017e..212f7dc15716 100644 --- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form +++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.form @@ -53,13 +53,13 @@ - + @@ -73,7 +73,7 @@ - + @@ -83,9 +83,11 @@ - + + + - + @@ -219,5 +221,15 @@ + + + + + + + + + + diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java index 09e8ae4f0659..426edc86fed1 100644 --- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java +++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanel.java @@ -139,6 +139,7 @@ private void initComponents() { advPanel = new javax.swing.JPanel(); customPropertiesLabel = new javax.swing.JLabel(); customPropertiesButton = new javax.swing.JButton(); + showFileChooserFavoritesCheckBox = new javax.swing.JCheckBox(); setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); @@ -205,7 +206,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addGroup(advPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(advPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(customPropertiesLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 368, Short.MAX_VALUE) + .addComponent(customPropertiesLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 368, Short.MAX_VALUE) .addGroup(advPanelLayout.createSequentialGroup() .addComponent(customPropertiesButton) .addGap(0, 0, Short.MAX_VALUE))) @@ -221,6 +222,13 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); + org.openide.awt.Mnemonics.setLocalizedText(showFileChooserFavoritesCheckBox, org.openide.util.NbBundle.getMessage(FlatLafOptionsPanel.class, "FlatLafOptionsPanel.showFileChooserFavoritesCheckBox.text")); // NOI18N + showFileChooserFavoritesCheckBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + showFileChooserFavoritesCheckBoxActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -234,12 +242,12 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addComponent(underlineMenuSelectionCheckBox) .addComponent(alwaysShowMnemonicsCheckBox) .addGroup(layout.createSequentialGroup() - .addGap(0, 0, 0) .addComponent(accentColorLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(accentColorField, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(needsRestartLabel))) + .addComponent(needsRestartLabel)) + .addComponent(showFileChooserFavoritesCheckBox)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( @@ -249,7 +257,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addComponent(accentColorField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(needsRestartLabel) .addComponent(accentColorLabel)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(useWindowDecorationsCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(unifiedTitleBarCheckBox) @@ -259,9 +267,11 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addComponent(underlineMenuSelectionCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(alwaysShowMnemonicsCheckBox) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(showFileChooserFavoritesCheckBox) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(advPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(69, Short.MAX_VALUE)) + .addContainerGap(42, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -317,6 +327,10 @@ private void accentColorFieldActionPerformed(java.awt.event.ActionEvent evt) {// fireChanged(); }//GEN-LAST:event_accentColorFieldActionPerformed + private void showFileChooserFavoritesCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showFileChooserFavoritesCheckBoxActionPerformed + fireChanged(); + }//GEN-LAST:event_showFileChooserFavoritesCheckBoxActionPerformed + private void fireChanged() { boolean isChanged = false; if(!Objects.equals(accentColorField.getSelectedColor(), getPrefsAccentColorOrDefault()) @@ -324,7 +338,8 @@ private void fireChanged() { || unifiedTitleBarCheckBox.isSelected() != FlatLafPrefs.isUnifiedTitleBar() || menuBarEmbeddedCheckBox.isSelected() != FlatLafPrefs.isMenuBarEmbedded() || underlineMenuSelectionCheckBox.isSelected() != FlatLafPrefs.isUnderlineMenuSelection() - || alwaysShowMnemonicsCheckBox.isSelected() != FlatLafPrefs.isAlwaysShowMnemonics()) { + || alwaysShowMnemonicsCheckBox.isSelected() != FlatLafPrefs.isAlwaysShowMnemonics() + || showFileChooserFavoritesCheckBox.isSelected() != FlatLafPrefs.isShowFileChooserFavorites()) { isChanged = true; } controller.changed(isChanged); @@ -337,6 +352,7 @@ protected void load() { menuBarEmbeddedCheckBox.setSelected(FlatLafPrefs.isMenuBarEmbedded()); underlineMenuSelectionCheckBox.setSelected(FlatLafPrefs.isUnderlineMenuSelection()); alwaysShowMnemonicsCheckBox.setSelected(FlatLafPrefs.isAlwaysShowMnemonics()); + showFileChooserFavoritesCheckBox.setSelected(FlatLafPrefs.isShowFileChooserFavorites()); updateEnabled(); } @@ -349,6 +365,7 @@ protected boolean store() { FlatLafPrefs.setMenuBarEmbedded(menuBarEmbeddedCheckBox.isSelected()); FlatLafPrefs.setUnderlineMenuSelection(underlineMenuSelectionCheckBox.isSelected()); FlatLafPrefs.setAlwaysShowMnemonics(alwaysShowMnemonicsCheckBox.isSelected()); + FlatLafPrefs.setShowFileChooserFavorites(showFileChooserFavoritesCheckBox.isSelected()); if (!Objects.equals(accentColor, currentAccentColor) || SystemInfo.isLinux && useWindowDecorationsCheckBox.isSelected() != currentUseWindowDecorations) { @@ -397,6 +414,7 @@ boolean valid() { private javax.swing.JLabel customPropertiesLabel; private javax.swing.JCheckBox menuBarEmbeddedCheckBox; private javax.swing.JLabel needsRestartLabel; + private javax.swing.JCheckBox showFileChooserFavoritesCheckBox; private javax.swing.JCheckBox underlineMenuSelectionCheckBox; private javax.swing.JCheckBox unifiedTitleBarCheckBox; private javax.swing.JCheckBox useWindowDecorationsCheckBox; diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java index 12abfe73ac33..a06e164cf9e6 100644 --- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java +++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafOptionsPanelController.java @@ -19,7 +19,6 @@ package org.netbeans.swing.laf.flatlaf; import com.formdev.flatlaf.FlatLaf; -import java.awt.Window; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import javax.swing.JComponent; @@ -72,6 +71,7 @@ public void applyChanges() { defaults.put("TitlePane.menuBarEmbedded", FlatLafPrefs.isMenuBarEmbedded()); defaults.put("MenuItem.selectionType", FlatLafPrefs.isUnderlineMenuSelection() ? "underline" : null); defaults.put("Component.hideMnemonics", !FlatLafPrefs.isAlwaysShowMnemonics()); + defaults.put(FlatLFCustoms.FILECHOOSER_FAVORITES_ENABLED, FlatLafPrefs.isShowFileChooserFavorites()); FlatLFCustoms.updateUnifiedBackground(); diff --git a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java index 9a7220232687..684423033fa1 100644 --- a/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java +++ b/platform/o.n.swing.laf.flatlaf/src/org/netbeans/swing/laf/flatlaf/FlatLafPrefs.java @@ -35,6 +35,7 @@ class FlatLafPrefs { private static final String MENU_BAR_EMBEDDED = "menuBarEmbedded"; private static final String UNDERLINE_MENU_SELECTION = "underlineMenuSelection"; private static final String ALWAYS_SHOW_MNEMONICS = "alwaysShowMnemonics"; + private static final String SHOW_FILECHOOSER_FAVORITES = "showFileChooserFavorites"; private static final Preferences prefs = NbPreferences.forModule(FlatLafPrefs.class); @@ -102,6 +103,14 @@ static void setAlwaysShowMnemonics(boolean value) { putBoolean(ALWAYS_SHOW_MNEMONICS, value, false); } + static boolean isShowFileChooserFavorites() { + return prefs.getBoolean(SHOW_FILECHOOSER_FAVORITES, false); + } + + static void setShowFileChooserFavorites(boolean value) { + putBoolean(SHOW_FILECHOOSER_FAVORITES, value, false); + } + private static void putBoolean(String key, boolean value, boolean def) { if (value != def) { prefs.putBoolean(key, value); diff --git a/platform/o.n.swing.plaf/src/org/netbeans/swing/plaf/LFCustoms.java b/platform/o.n.swing.plaf/src/org/netbeans/swing/plaf/LFCustoms.java index 7cfa928740c6..379ab3a1a0fb 100644 --- a/platform/o.n.swing.plaf/src/org/netbeans/swing/plaf/LFCustoms.java +++ b/platform/o.n.swing.plaf/src/org/netbeans/swing/plaf/LFCustoms.java @@ -436,4 +436,11 @@ public Object[] createGuaranteedKeysAndValues () { public static final String OPTIONS_USE_UI_DEFAULT_COLORS = "nb.options.useUIDefaultsColors"; public static final String OPTIONS_CATEGORIES_SEPARATOR_COLOR = "nb.options.categories.separatorColor"; public static final String OPTIONS_CATEGORIES_BUTTON_USE_NIMBUS = "nb.options.categories.button.useNimbusCategoryButton"; + + /** + * FileChooser + */ + public static final String FILECHOOSER_SHORTCUTS_FILESFUNCTION = "FileChooser.shortcuts.filesFunction"; + public static final String FILECHOOSER_SHORTCUTS_PANEL_FACTORY = "FileChooser.shortcuts.panel.factory"; + public static final String FILECHOOSER_FAVORITES_ENABLED = "FileChooser.favorites.enabled"; }